近日嘗試了關(guān)于Mycat分表分庫(kù)的特性,這里做一些整理滑燃,作為入門的參考役听。
本文不對(duì)Mycat配置的每一項(xiàng)都進(jìn)行詳細(xì)解釋,這些內(nèi)容在其官方的權(quán)威指南中都有介紹表窘,這里闡述部署mycat的實(shí)際操作過(guò)程典予,也算是對(duì)文檔沒(méi)有交代部分的一個(gè)補(bǔ)充吧。
一乐严、方案規(guī)劃
部署模型如圖
其中瘤袖,有兩臺(tái)虛擬機(jī):192.168.1.21和192.168.1.22,前者用于部署Mycat-server服務(wù)和1個(gè)mysql實(shí)例麦备,后者部署2個(gè)mysql實(shí)例孽椰,這里為了簡(jiǎn)化部署模型昭娩,未考慮mysql的主從復(fù)制凛篙,3個(gè)實(shí)例均獨(dú)立。
現(xiàn)在假設(shè)系統(tǒng)的數(shù)據(jù)庫(kù)為messagedb栏渺,里面只有2張表呛梆,一張表為消息表:message,一張表示消息來(lái)源的字典表:source磕诊,本案實(shí)現(xiàn)的是按自然月分片的規(guī)則填物,因此上述3個(gè)mysql實(shí)例各自需要?jiǎng)?chuàng)建4個(gè)數(shù)據(jù)庫(kù),即:
host | database | host | database |
---|---|---|---|
192.168.1.21:3307 | message201601 | 192.168.1.22:3307 | message201605 |
message201602 | message201606 | ||
message201603 | message201607 | ||
message201604 | message201608 | ||
192.168.1.22:3308 | message201609 | ||
message201610 | |||
message201611 | |||
message201612 |
說(shuō)明:如果是剛接觸Mycat的小伙伴對(duì)分片不太理解霎终,簡(jiǎn)單地說(shuō)滞磺,對(duì)于Mycat击困,一個(gè)分片表示某一個(gè)MySQL實(shí)例上的某一個(gè)數(shù)據(jù)庫(kù)广凸,即schema@host,于是當(dāng)我們?cè)鹊囊粡埓蟊硇枰制臅r(shí)候蹦浦,mycat就會(huì)按照我們?cè)O(shè)定的規(guī)則盲镶,把這張大表中的數(shù)據(jù)分散到各個(gè)分片上徒河,即所謂的分表分庫(kù)送漠,因此我們需要在每個(gè)對(duì)應(yīng)的分片上創(chuàng)建相同名稱的數(shù)據(jù)庫(kù),相同結(jié)構(gòu)的表闽寡。
二爷狈、環(huán)境準(zhǔn)備
首先假設(shè)mysql的3個(gè)實(shí)例都已經(jīng)部署完成涎永,然后將所有實(shí)例都啟動(dòng)起來(lái)羡微。如果需要了解mysql的安裝部署過(guò)程可以參考原文:http://www.fullstackyang.com/2016/12/21/342/
現(xiàn)在開(kāi)始創(chuàng)建數(shù)據(jù)庫(kù)了妈倔,因?yàn)槎际窍嗤臄?shù)據(jù)庫(kù)名和表結(jié)構(gòu)盯蝴,所以可以用一段腳本來(lái)完成工作:
db_host=( "192.168.1.21" "192.168.1.22" "192.168.1.22" )
db_port=( "3307" "3307" "3308" )
mysql_user=root
mysql_passwd=root123
mysql_cmd="/application/mysql/bin/mysql -u$mysql_user -p$mysql_passwd -e"
for (( i=0;i<${#db_host[@]};i++ ))
do
db="-h${db_host[$i]} -P${db_port[$i]}";
for (( j=1;j<=4;j++ ))
do
n=$(( $i*4+$j ))
[ $n -lt 10 ] && db_name="message20160"$n || db_name="message2016"$n
$mysql_cmd "drop database if exists $db_name" $db >/dev/null 2>&1
echo "creating database "$db_name"..."
$mysql_cmd "create database $db_name;" $db >/dev/null 2>&1
$mysql_cmd "use $db_name;source /data/tb.sql;" $db 2>/dev/null
done
$mysql_cmd "show databases;" $db 2> /dev/null
done
其中tb.sql的內(nèi)容如下:
create table source (
id int(11) not null auto_increment primary key comment 'pk',
name varchar(10) default '' comment 'source name'
);
create table message (
id int(11) not null auto_increment primary key comment 'pk',
content varchar(255) default '' comment 'message content',
create_time date default null,
source_id int(11) not null,
foreign key(source_id) references source(id)
);
insert into `source`(`id`,`name`) values(1,'weibo');
insert into `source`(`id`,`name`) values(2,'weixin');
insert into `source`(`id`,`name`) values(3,'qq');
insert into `source`(`id`,`name`) values(4,'email');
insert into `source`(`id`,`name`) values(5,'sms');
在message表中虑绵,總共有4個(gè)字段:
- id:主鍵
- content:消息的內(nèi)容
- create_time:創(chuàng)建時(shí)間翅睛,這也是mycat進(jìn)行分片時(shí)的參考字段
- source_id:source表的外鍵
另外宏所,我們?cè)趕ource表插入了5條記錄爬骤,用于測(cè)試。到這里骤铃,后端數(shù)據(jù)庫(kù)的環(huán)境就搭建完成了惰爬。
三撕瞧、安裝和配置Mycat
安裝Mycat的過(guò)程比較簡(jiǎn)單丛版,在這個(gè)地址就可以下載安裝包:https://github.com/MyCATApache/Mycat-download/tree/master/1.6-RELEASE页畦。
下載完之后豫缨,就進(jìn)行解壓好芭,創(chuàng)建軟鏈接栓撞,創(chuàng)建相應(yīng)的用戶,修改目錄權(quán)限等套路操作恩尾,這里就不細(xì)說(shuō)了翰意。
安裝完之后,簡(jiǎn)單地看一下mycat目錄結(jié)構(gòu):
# tree mycat -L 1
mycat
|-- bin
|-- catlet
|-- conf
|-- lib
|-- logs
`-- version.txt
我們可以通過(guò)bin目錄下的mycat可執(zhí)行文件啟動(dòng)服務(wù):bin/mycat start醒第。啟動(dòng)之后可以看一下,端口打開(kāi)的情況:
# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1146/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2249/master
tcp 0 0 127.0.0.1:32000 0.0.0.0:* LISTEN 12842/java
tcp6 0 0 :::9066 :::* LISTEN 12842/java
tcp6 0 0 :::42346 :::* LISTEN 12842/java
tcp6 0 0 :::3307 :::* LISTEN 3323/mysqld
tcp6 0 0 :::22 :::* LISTEN 1146/sshd
tcp6 0 0 ::1:25 :::* LISTEN 2249/master
tcp6 0 0 :::34141 :::* LISTEN 12842/java
tcp6 0 0 :::1984 :::* LISTEN 12842/java
tcp6 0 0 :::8066 :::* LISTEN 12842/java
其中霞幅,9066端口是管理端口司恳,提供查看當(dāng)前系統(tǒng)節(jié)點(diǎn)的情況扔傅,報(bào)告心跳狀態(tài)等相關(guān)系統(tǒng)監(jiān)控的功能,8066是數(shù)據(jù)端口枫弟,相當(dāng)于數(shù)據(jù)庫(kù)的訪問(wèn)端口淡诗。我們可以使用mysql命令訪問(wèn)這里兩個(gè)端口:
mysql -h[mycat_host] -u[mycat_user] -p[mycat_passwd] -P [8066|9066]
那么mycat_user和mycat_passwd是如何配置呢韩容,下面就需要介紹mycat中最主要的3個(gè)配置文件:server.xml群凶,schema.xml和rule.xml请梢。
3.1 server.xml
該配置文件是用于配置mycat的系統(tǒng)信息,主要有兩個(gè)標(biāo)簽:system和user气嫁。這里的user就是上述訪問(wèn)mycat服務(wù)的用戶寸宵,不是后端數(shù)據(jù)庫(kù)的用戶梯影。如果我們使用默認(rèn)的配置疏遏,server.xml大概是這樣的:
<?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>
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">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>
</system>
<user name="admin">
<property name="password">admin123</property>
<property name="schemas">messagedb</property>
</user>
</mycat:server>
user標(biāo)簽下schemas屬性表示該用戶可以訪問(wèn)的數(shù)據(jù)庫(kù)财异,可以定義多個(gè)數(shù)據(jù)庫(kù),用英文逗號(hào)隔開(kāi)拷泽。schemas定義的數(shù)據(jù)庫(kù)司致,一定要配置在后面的schema.xml文件對(duì)應(yīng)的邏輯庫(kù)枣耀,否則會(huì)提示無(wú)法訪問(wèn)捞奕。
system標(biāo)簽暫時(shí)使用默認(rèn)的配置颅围,不做過(guò)多的討論院促〕M兀總之墩邀,先讓你的貓先跑起來(lái)再考慮其他玩法眉睹。
3.2 schema.xml
schema配置文件比較復(fù)雜竹海,也是最關(guān)鍵的一個(gè)配置文件丐黄,定義了mycat中的邏輯庫(kù)灌闺、邏輯表甩卓,和分片的相關(guān)信息逾柿。配置如下:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="messagedb" checkSQLschema="false" sqlMaxLimit="100">
<table name="message" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10,dn11,dn12" rule="sharding-by-month" />
<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
<table name="source" primaryKey="id" type="global" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10,dn11,dn12" />
</schema>
<dataNode name="dn1" dataHost="mysql-01" database="message201601" />
<dataNode name="dn2" dataHost="mysql-01" database="message201602" />
<dataNode name="dn3" dataHost="mysql-01" database="message201603" />
<dataNode name="dn4" dataHost="mysql-01" database="message201604" />
<dataNode name="dn5" dataHost="mysql-02" database="message201605" />
<dataNode name="dn6" dataHost="mysql-02" database="message201606" />
<dataNode name="dn7" dataHost="mysql-02" database="message201607" />
<dataNode name="dn8" dataHost="mysql-02" database="message201608" />
<dataNode name="dn9" dataHost="mysql-03" database="message201609" />
<dataNode name="dn10" dataHost="mysql-03" database="message201610" />
<dataNode name="dn11" dataHost="mysql-03" database="message201611" />
<dataNode name="dn12" dataHost="mysql-03" database="message201612" />
<dataHost name="mysql-01" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.1.21:3307" user="root"
password="root123">
</writeHost>
</dataHost>
<dataHost name="mysql-02" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM2" url="192.168.1.22:3307" user="root"
password="root123">
</writeHost>
</dataHost>
<dataHost name="mysql-03" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM3" url="192.168.1.22:3308" user="root"
password="root123">
</writeHost>
</dataHost>
</mycat:schema>
幾點(diǎn)要說(shuō)明一下:
- schema標(biāo)簽定義邏輯庫(kù)宅此,其下table子標(biāo)簽定義邏輯表机错,datanode屬性定義該邏輯表需要分布到哪幾個(gè)分片上,rule屬性表示使用何種分片規(guī)則父腕,這里我們選擇sharding-by-month弱匪,這個(gè)規(guī)則的名稱是自定義的,只要和后面的rule.xml對(duì)應(yīng)起來(lái)即可
- source表是一張全局表璧亮,這里需要使用type=”global”來(lái)定義痢法,這樣mycat就可以幫我們?cè)谥付ǖ姆制峡寺∠嗤臄?shù)據(jù),這對(duì)join查詢是非常有好處的。
- datanode標(biāo)簽定義了分片,datahost是主機(jī)名提茁,對(duì)應(yīng)dataHost標(biāo)簽的name屬性值汪疮,database定義該主機(jī)數(shù)據(jù)庫(kù)實(shí)例上的具體數(shù)據(jù)庫(kù)名纺且。
- dataHost標(biāo)簽定義數(shù)據(jù)庫(kù)實(shí)例衅枫,其下heartbeart標(biāo)簽表示心跳檢測(cè)所使用的方法,writeHost標(biāo)簽定義寫(xiě)數(shù)據(jù)的實(shí)例,另外還有readHost標(biāo)簽可以定義讀數(shù)據(jù)的實(shí)例,這里不考慮讀寫(xiě)分離队橙,僅使用寫(xiě)實(shí)例解总,因此需要把balance屬性設(shè)置為0
- 其他屬性可以自行查閱官方權(quán)威指南
- 最后劳翰,出于規(guī)范和安全考慮颖变,最好不使用數(shù)據(jù)庫(kù)的root用戶哗魂,而是另外再創(chuàng)建一個(gè)用于mycat訪問(wèn)的用戶邻吞。
3.3 rule.xml
rule.xml中定義了很多分片的規(guī)則梢褐,具體規(guī)則的算法可以參考官方權(quán)威指南,這里我們直接使用默認(rèn)的就可以了丈积,其中按自然月的分片規(guī)則配置如下:
<mycat:rule xmlns:mycat="http://io.mycat/">
...
<tableRule name="sharding-by-month">
<rule>
<columns>create_time</columns>
<algorithm>partbymonth</algorithm>
</rule>
</tableRule>
...
<function name="partbymonth"
class="io.mycat.route.function.PartitionByMonth">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2016-01-01</property>
</function>
...
</mycat:rule>
- tableRule標(biāo)簽定義分片規(guī)則的告唆,其下columns標(biāo)簽表示對(duì)數(shù)據(jù)庫(kù)表中的哪個(gè)字段應(yīng)用規(guī)則茄螃,algorithm指定實(shí)現(xiàn)算法的名稱,對(duì)應(yīng)的是function標(biāo)簽中的name屬性值
- function標(biāo)簽定義對(duì)應(yīng)的實(shí)現(xiàn)類,以及參數(shù),包括dateFormat(日期格式)和sBeginDate(起始日期)
說(shuō)明:起始日期是用來(lái)計(jì)算數(shù)據(jù)所在的分片位置鲁森,例如2016年1月的message就會(huì)找到第1個(gè)分片痛垛,即dn1,2016年12月的message就會(huì)找到第12個(gè)分片乾胶,即dn12喻频,但是如果出現(xiàn)了2017年1月的message妓布,mycat就會(huì)去找第13個(gè)分片,但是配置文件中又沒(méi)有對(duì)應(yīng)的配置,那么就會(huì)拋出無(wú)法找到分片的錯(cuò)誤加叁。
最后再來(lái)總結(jié)一下配置文件的關(guān)系:
如圖所示告希,server.xml定義了訪問(wèn)mycat服務(wù)的用戶创夜,以及該用戶授權(quán)的數(shù)據(jù)庫(kù)(邏輯庫(kù)),schema.xml定義了具體的邏輯庫(kù)檬贰,邏輯表,以及分片和數(shù)據(jù)庫(kù)實(shí)例的信息鸳粉,rule.xml分片規(guī)則和實(shí)現(xiàn)類。
四稳诚、測(cè)試
到這里已經(jīng)完成了mycat的配置文件茬暇,但先不急著往里面灌數(shù)據(jù)首昔,我們先訪問(wèn)管理端口9066,看一下運(yùn)行情況:
mysql -h127.0.0.1 -uadmin -p -P 9066
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (monitor)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show @@datanode;
+------+------------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+------------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1 | mysql-01/message201601 | 0 | mysql | 0 | 9 | 1000 | 12282 | 0 | 0 | 0 | -1 |
| dn10 | mysql-03/message201610 | 0 | mysql | 0 | 0 | 1000 | 2639 | 0 | 0 | 0 | -1 |
| dn11 | mysql-03/message201611 | 0 | mysql | 0 | 1 | 1000 | 2640 | 0 | 0 | 0 | -1 |
| dn12 | mysql-03/message201612 | 0 | mysql | 0 | 9 | 1000 | 12283 | 0 | 0 | 0 | -1 |
| dn2 | mysql-01/message201602 | 0 | mysql | 0 | 0 | 1000 | 2638 | 0 | 0 | 0 | -1 |
| dn3 | mysql-01/message201603 | 0 | mysql | 0 | 0 | 1000 | 2642 | 0 | 0 | 0 | -1 |
| dn4 | mysql-01/message201604 | 0 | mysql | 0 | 0 | 1000 | 2638 | 0 | 0 | 0 | -1 |
| dn5 | mysql-02/message201605 | 0 | mysql | 0 | 9 | 1000 | 12289 | 0 | 0 | 0 | -1 |
| dn6 | mysql-02/message201606 | 0 | mysql | 0 | 0 | 1000 | 2640 | 0 | 0 | 0 | -1 |
| dn7 | mysql-02/message201607 | 0 | mysql | 0 | 1 | 1000 | 2645 | 0 | 0 | 0 | -1 |
| dn8 | mysql-02/message201608 | 0 | mysql | 0 | 0 | 1000 | 2638 | 0 | 0 | 0 | -1 |
| dn9 | mysql-03/message201609 | 0 | mysql | 0 | 0 | 1000 | 2638 | 0 | 0 | 0 | -1 |
+------+------------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
12 rows in set (2.17 sec)
mysql> show @@heartbeat;
+--------+-------+--------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME | TYPE | HOST | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME | STOP |
+--------+-------+--------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| hostM2 | mysql | 192.168.1.22 | 3307 | 1 | 0 | idle | 0 | 2,2,1 | 2016-12-21 20:03:02 | false |
| hostM1 | mysql | 192.168.1.21 | 3307 | 1 | 0 | idle | 0 | 0,0,0 | 2016-12-21 20:03:02 | false |
| hostM3 | mysql | 192.168.1.22 | 3308 | 1 | 0 | idle | 0 | 0,1,1 | 2016-12-21 20:03:02 | false |
+--------+-------+--------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
3 rows in set (0.21 sec)
如果看到各個(gè)節(jié)點(diǎn)都已經(jīng)出現(xiàn)糙俗,并且心跳狀態(tài)RS_CODE=1勒奇,則表示后端數(shù)據(jù)庫(kù)連接正常。
現(xiàn)在我們用JDBC的方式批量插入1000萬(wàn)數(shù)據(jù):
public class TestMyCat {
private static final String driver = "com.mysql.jdbc.Driver";
private static final String url = "jdbc:mysql://192.168.1.21:8066/message?useServerPrepStmts=false&rewriteBatchedStatements=true";
private static final String username = "admin";
private static final String password = "admin123";
@Test
public void test() throws SQLException {
Calendar calendar = Calendar.getInstance();
Random random = new Random();
calendar.set(2016, 0, 1, 0, 0, 0);
Connection connection = null;
PreparedStatement ps = null;
try {
Class.forName(driver);
connection = (Connection) DriverManager.getConnection(url, username, password);
connection.setAutoCommit(false);
String sql = "insert into message(`content`, `create_time`, `source_id`) values(?,?,?)";
ps = connection.prepareStatement(sql);
long start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
ps.setString(1, System.currentTimeMillis() + "");
long randomtime = calendar.getTimeInMillis() + (random.nextInt(365) + 1) * 86400 * 1000l;
Date date = new Date(randomtime);
int source_id = random.nextInt(5) + 1;
ps.setDate(2, date);
ps.setInt(3, source_id);
ps.addBatch();
if (i != 0 && i % 10000 == 0) {
System.out.println("execute batch : " + i);
ps.executeBatch();
}
}
ps.executeBatch();
connection.commit();
System.out.println(System.currentTimeMillis() - start);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ps != null)
ps.close();
if (connection != null)
connection.close();
}
}
}
如果運(yùn)行的時(shí)候報(bào)錯(cuò): Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes of storage;巧骚,可以適當(dāng)調(diào)大一下my.cnf下的max_binlog_cache_size參數(shù)赊颠。
最后我們來(lái)檢驗(yàn)一下分片的結(jié)果,其中message表中的數(shù)據(jù)根據(jù)create_time的值按月進(jìn)行了分片劈彪,而source表作為全局表竣蹦,則其數(shù)據(jù)出現(xiàn)在了每個(gè)分片上,下面貼出部分結(jié)果:
mysql -h192.168.1.21 -uroot -proot123 -P3307 -e "select min(create_time),max(create_time) from message201602.message;":
+------------------+------------------+
| min(create_time) | max(create_time) |
+------------------+------------------+
| 2016-02-01 | 2016-02-29 |
+------------------+------------------+
mysql -h192.168.1.22 -uroot -proot123 -P3307 -e "select min(create_time),max(create_time) from message201605.message;":
+------------------+------------------+
| min(create_time) | max(create_time) |
+------------------+------------------+
| 2016-05-01 | 2016-05-31 |
+------------------+------------------+
mysql -h192.168.1.22 -uroot -proot123 -P3308 -e "select min(create_time),max(create_time) from message201609.message;":
+------------------+------------------+
| min(create_time) | max(create_time) |
+------------------+------------------+
| 2016-09-01 | 2016-09-30 |
+------------------+------------------+
mysql -h192.168.1.21 -uroot -proot123 -P3307 -e "select * from message201601.source"
+----+--------+
| id | name |
+----+--------+
| 1 | weibo |
| 2 | weixin |
| 3 | qq |
| 4 | email |
| 5 | sms |
+----+--------+
mysql -h192.168.1.22 -uroot -proot123 -P3307 -e "select * from message201607.source"
+----+--------+
| id | name |
+----+--------+
| 1 | weibo |
| 2 | weixin |
| 3 | qq |
| 4 | email |
| 5 | sms |
+----+--------+
mysql -h192.168.1.22 -uroot -proot123 -P3308 -e "select * from message201611.source"
+----+--------+
| id | name |
+----+--------+
| 1 | weibo |
| 2 | weixin |
| 3 | qq |
| 4 | email |
| 5 | sms |
+----+--------+
五粉臊、總結(jié)
本文就mycat分片的特性進(jìn)行一次實(shí)戰(zhàn)操作草添,完成了部署mycat-server以及后端mysql數(shù)據(jù)庫(kù),并以按自然月為分片規(guī)則進(jìn)行了相關(guān)的配置扼仲,最后做了一個(gè)小的測(cè)試來(lái)驗(yàn)證分片功能的正確性远寸。
mycat還有其他比較強(qiáng)大的特性還有待進(jìn)一步的研究使用,下一步的工作:
- 完成讀寫(xiě)分離的配置和測(cè)試
- 整合zookeerp實(shí)現(xiàn)高可用集群
六屠凶、參考資料
- 周繼峰 馮鉆優(yōu) 陳勝尊 左越宗. 分布式數(shù)據(jù)庫(kù)架構(gòu)及企業(yè)實(shí)踐:基于Mycat中間件[M]. 電子工業(yè)出版社, 2016.
- mycat開(kāi)源項(xiàng)目組. Mycat權(quán)威指南. http://mycat.io/document/Mycat_V1.6.0.pdf