MyCat是什么

簡(jiǎn)介

MyCat是基于mysql 數(shù)據(jù)庫(kù) 的分布式中間件,支持MySQL數(shù)據(jù)庫(kù)分庫(kù)分表,讀寫(xiě)分離等。

配置安裝流程

本文選用華為鯤鵬云服務(wù)ECS KC1實(shí)例做測(cè)試,KC1實(shí)例的處理器為兼容ARMv8指令集的鯤鵬920,使用的操作系統(tǒng)為Euler 2.8,內(nèi)核版本號(hào)為:4.19.36。

1.準(zhǔn)備環(huán)境

選擇操作環(huán)境

本文選用華為鯤鵬云服務(wù)ECS KC1實(shí)例做測(cè)試

Java版本需要在“1.8.0”及上版本。

您可以通過(guò)執(zhí)行下面命令,安裝“java 1.8.0”。

sudo yum install java-1.8.0-openjdk

環(huán)境中已運(yùn)行mysql服務(wù),并且要預(yù)先創(chuàng)建好相應(yīng)的庫(kù)和表。

db01

只有一個(gè)user表

db02

item表

db03

item表

db02和db03上的item根據(jù)id%2取摸保存數(shù)據(jù),也就是進(jìn)行數(shù)據(jù)分片。

執(zhí)行下面命令,生成上面的庫(kù)表:

a.連接MySQL數(shù)據(jù)庫(kù)。

mysql -uroot -p[PASSWORD]

b.執(zhí)行以下SQL語(yǔ)句,創(chuàng)建db01庫(kù)及其下的user表。

create database db01;

use db01

CREATE TABLE `users` ( 

`id` int(11) NOT NULL AUTO_INCREMENT, 

`name` varchar(50) NOT NULL DEFAULT '', 

`indate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 

PRIMARY KEY (`id`) 

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

c.執(zhí)行以下SQL語(yǔ)句,創(chuàng)建db02及其下的item表。

create database db02;

use db02;

CREATE TABLE `item` ( 

`id` int(11) NOT NULL AUTO_INCREMENT, 

`value` int(11) NOT NULL DEFAULT '0', 

`indate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 

PRIMARY KEY (`id`) 

) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

d.執(zhí)行以下sql語(yǔ)句,創(chuàng)建db03及其下的item表。

create database db03;

use db03;

CREATE TABLE `item` ( 

`id` int(11) NOT NULL AUTO_INCREMENT, 

`value` int(11) NOT NULL DEFAULT '0', 

`indate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 

PRIMARY KEY (`id`) 

) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

2.執(zhí)行安裝

本文采用“mycat-1.6”版本為例。

1)執(zhí)行如下命令,下載軟件包。

wget https://github.com/MyCATApache/Mycat-download/raw/master/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

2)執(zhí)行如下命令,解壓軟件包。

tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

3)執(zhí)行如下命令,進(jìn)入MyCat配置目錄。

cd /usr/local/mycat/conf

4)修改MyCat配置文件。

下述配置文件的內(nèi)容,可以直接替換配置文件原有的內(nèi)容,也可根據(jù)實(shí)際情況修改。

“server.xml”和“schema.xml”中的[password]必須根據(jù)實(shí)際情況配置。

配置“server.xml”,修改內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mycat:server SYSTEM "server.dtd">

<mycat:server xmlns:mycat="http://io.mycat/">        

    <system>        

        <property name="useSqlStat">0</property>  <!-- 1為開(kāi)啟實(shí)時(shí)統(tǒng)計(jì)、0為關(guān)閉 -->        

        <property name="useGlobleTableCheck">0</property>  <!-- 1為開(kāi)啟全加班一致性檢測(cè)、0為關(guān)閉 -->                

        <property name="sequnceHandlerType">1</property>                

        <property name="processorBufferPoolType">0</property>                                              

        <property name="serverPort">8066</property>      <!-- 8066 為連接mycat的端口-->                                         

        <property name="managerPort">9066</property>       <!-- 9066 為連接mycat管理地址的端口-->                 

        <property name="idleTimeout">300000</property> 

        <property name="bindIp">0.0.0.0</property>                        

        <property name="frontWriteQueueSize">4096</property> 

        <property name="processors">32</property>                

        <property name="handleDistributedTransactions">0</property>                

        <property name="useOffHeapForMerge">1</property>                

        <property name="memoryPageSize">1m</property>                

        <property name="spillsFileBufferSize">1k</property>                

        <property name="useStreamOutput">0</property>                

        <property name="systemReserveMemorySize">384m</property>                

        <property name="useZKSwitch">true</property>        

    </system>        

    <!-- 配置連接mycat的賬號(hào)密碼, 和邏輯庫(kù)名稱, 可以設(shè)置多個(gè)-->        

    <user name="root">                

        <property name="password">[password]</property>                

        <property name="schemas">TESTDB</property>        

    </user>        

    <user name="user">                

        <property name="password">[password]</property>                

        <property name="schemas">TESTDB</property>                

        <property name="readOnly">true</property>        

    </user>

</mycat:server>

配置“rule.xml”,修改內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mycat:rule SYSTEM "rule.dtd">

<mycat:rule xmlns:mycat="http://io.mycat/">        

    <!-- 指定表規(guī)則的名稱, 以及分片的function-->        

    <tableRule name="mod-long">                

        <rule>                        

            <columns>id</columns>                        

            <algorithm>mod-long</algorithm>                

        </rule>        

    </tableRule>        

    <!-- 分片名稱為mod-long, 為tableRule標(biāo)簽提供-->        

    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">                

        <!-- 指定有幾個(gè)節(jié)點(diǎn),咱們有兩個(gè)db02和db03,所以寫(xiě)2, 取模就是id%2 -->                

        <property name="count">2</property>                

        <property name="virtualBucketTimes">160</property>        

    </function>

</mycat:rule>

配置“schema.xml”,修改內(nèi)容如下:

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">        

    <!-- 聲明一個(gè)邏輯表, 表名為TESTDB, 和server.xml中的對(duì)應(yīng) -->        

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">                

        <!-- 指定實(shí)際表名為users, 是在node_db01節(jié)點(diǎn)上-->                

        <table name="users" primaryKey="id" autoIncrement="true" dataNode="node_db01" />                 

        <!-- 實(shí)際表名為item, 在node_db02和node_db03節(jié)點(diǎn)上-->                

        <table name="item" primaryKey="id" autoIncrement="true"  dataNode="node_db02,node_db03" rule="mod-long" />        

    </schema>

    <dataNode name="node_db01" dataHost="dataHost01" database="db01" />        

    <dataNode name="node_db02" dataHost="dataHost01" database="db02" />        

    <dataNode name="node_db03" dataHost="dataHost01" database="db03" />         

    <!-- 聲明數(shù)據(jù)庫(kù)的連接地址, 名稱為dataHost01, 為dataNode節(jié)點(diǎn)提供-->        

    <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">                         

        <heartbeat>select user()</heartbeat>                

        <!-- 數(shù)據(jù)庫(kù)的連接地址,賬號(hào)和密碼-->                 

        <writeHost host="server1" url="127.0.0.1:3306" user="root" password="[password]" />        

    </dataHost>

</mycat:schema>

5)修改MyCat執(zhí)行“startup_nowrap.sh”腳本,在腳本文件開(kāi)頭添加如下內(nèi)容:

vim /usr/local/mycat/bin/startup_nowrap.sh

JAVA_HOME=/usr/lib/jvm/jre

3.啟動(dòng)軟件

1)執(zhí)行以下命令,啟動(dòng)MyCat。

/usr/local/mycat/bin/startup_nowrap.sh

2)執(zhí)行以下命令,連接MyCat。

[password]為“server.xml”中配置的用戶密碼。

mysql -uroot -p[password] -h127.0.0.1 -P8066

3)執(zhí)行以下命令,查看MyCat的庫(kù)信息。

show databases;

4)系統(tǒng)如下,表示MyCat擁有TESTDB庫(kù)。

+----------+

| DATABASE |

+----------+

| TESTDB   |

+----------+

1 row in set (0.00 sec)

5)     執(zhí)行以下命令,進(jìn)入“TESTDB”庫(kù)。

use TESTDB;

6)     執(zhí)行以下命令,查看“TESTDB”下的表信息。

show tables;

+------------------+

| Tables in TESTDB |

+------------------+

| item             |

| users            |

+------------------+

2 rows in set (0.00 sec)

7)執(zhí)行以下SQL語(yǔ)句:

insert into users(id,name,indate) values(1,'hello',now());

insert into users(id,name,indate) values(2,'world',now());

insert into item(id,value,indate) values(1,100,now());

insert into item(id,value,indate) values(2,100,now());

系統(tǒng)回顯如下,表示能夠正常使用MyCat。

Query OK, 1 row affected (0.02 sec)