簡介
MyCat是基于mysql 數(shù)據(jù)庫 的分布式中間件,支持MySQL數(shù)據(jù)庫分庫分表,讀寫分離等。
配置安裝流程
本文選用華為鯤鵬云服務(wù)ECS KC1實例做測試,KC1實例的處理器為兼容ARMv8指令集的鯤鵬920,使用的操作系統(tǒng)為Euler 2.8,內(nèi)核版本號為:4.19.36。
1.準(zhǔn)備環(huán)境
選擇操作環(huán)境
本文選用華為鯤鵬云服務(wù)ECS KC1實例做測試
Java版本需要在“1.8.0”及上版本。
您可以通過執(zhí)行下面命令,安裝“java 1.8.0”。
sudo yum install java-1.8.0-openjdk
環(huán)境中已運行mysql服務(wù),并且要預(yù)先創(chuàng)建好相應(yīng)的庫和表。
db01
只有一個user表
db02
item表
db03
item表
db02和db03上的item根據(jù)id%2取摸保存數(shù)據(jù),也就是進(jìn)行數(shù)據(jù)分片。
執(zhí)行下面命令,生成上面的庫表:
a.連接MySQL數(shù)據(jù)庫。
mysql -uroot -p[PASSWORD]
b.執(zhí)行以下SQL語句,創(chuàng)建db01庫及其下的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語句,創(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語句,創(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ù)實際情況修改。
“server.xml”和“schema.xml”中的[password]必須根據(jù)實際情況配置。
配置“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為開啟實時統(tǒng)計、0為關(guān)閉 -->
<property name="useGlobleTableCheck">0</property> <!-- 1為開啟全加班一致性檢測、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的賬號密碼, 和邏輯庫名稱, 可以設(shè)置多個-->
<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">
<!-- 指定有幾個節(jié)點,咱們有兩個db02和db03,所以寫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/">
<!-- 聲明一個邏輯表, 表名為TESTDB, 和server.xml中的對應(yīng) -->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- 指定實際表名為users, 是在node_db01節(jié)點上-->
<table name="users" primaryKey="id" autoIncrement="true" dataNode="node_db01" />
<!-- 實際表名為item, 在node_db02和node_db03節(jié)點上-->
<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ù)庫的連接地址, 名稱為dataHost01, 為dataNode節(jié)點提供-->
<dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!-- 數(shù)據(jù)庫的連接地址,賬號和密碼-->
<writeHost host="server1" url="127.0.0.1:3306" user="root" password="[password]" />
</dataHost>
</mycat:schema>
5)修改MyCat執(zhí)行“startup_nowrap.sh”腳本,在腳本文件開頭添加如下內(nèi)容:
vim /usr/local/mycat/bin/startup_nowrap.sh
JAVA_HOME=/usr/lib/jvm/jre
3.啟動軟件
1)執(zhí)行以下命令,啟動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的庫信息。
show databases;
4)系統(tǒng)如下,表示MyCat擁有TESTDB庫。
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)
5) 執(zhí)行以下命令,進(jìn)入“TESTDB”庫。
use TESTDB;
6) 執(zhí)行以下命令,查看“TESTDB”下的表信息。
show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| item |
| users |
+------------------+
2 rows in set (0.00 sec)
7)執(zhí)行以下SQL語句:
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)