16年的時(shí)候因?yàn)楣ぷ髟蚬寸裕?jīng)花了一番功夫去了解阿里開源的分庫分表的中間件Corbar的源碼實(shí)現(xiàn)涯曲。
原本想基于Corbar的實(shí)現(xiàn)來寫一個(gè)關(guān)于數(shù)據(jù)庫分庫分表的系列博客塘偎,后來了解到脫胎于Corbar,由一些社區(qū)大牛開發(fā)出了更加強(qiáng)大的MyCAT亚侠,不僅解決了Cobar生產(chǎn)環(huán)境中出現(xiàn)的一些嚴(yán)重的問題胶逢,更加入了很多優(yōu)秀的實(shí)現(xiàn)厅瞎。
本系列文章將由淺入深的學(xué)習(xí)強(qiáng)大的數(shù)據(jù)庫分庫分表中間件MyCAT饰潜。
GitHub: https://github.com/MyCATApache/Mycat-Server
版本:1.6-Release
Mycat權(quán)威指南官方下載: https://github.com/MyCATApache/Mycat-Server/blob/4135f25df8239d52d220529cbf7cb697ede40e12/mycat-definitive-guide.pdf
本篇我們先按步驟來個(gè)初體驗(yàn)。
1和簸、clone 項(xiàng)目到本地彭雾,Checkout Tag 1.6-Release
2、按如下配置schema.xml锁保、server.xml薯酝、rule.xml,跟Corbar配置基本一致爽柒。節(jié)點(diǎn)屬性含義請(qǐng)查閱mycat-definitive-guide.pdf吴菠,在此不做贅述。
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="20" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="127.0.0.1:3306" user="root"
password="xxxx">
</writeHost>
</dataHost>
</mycat:schema>
server.xml和rule.xml由于本篇只做簡(jiǎn)單體驗(yàn)浩村,不做配置做葵。
3、按schema.xml配置在本地mysql數(shù)據(jù)庫中建立相應(yīng)的數(shù)據(jù)庫表心墅,如下:
便于各位玩家快速體驗(yàn)酿矢,直接貼出建表語句:
CREATE TABLE `company` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT '',
`market_value` bigint(20) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `hotnews` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` varchar(64) DEFAULT '',
`content` varchar(512) DEFAULT '0',
`time` varchar(8) DEFAULT '',
`cat_name` varchar(10) DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `travelrecord` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`city` varchar(32) DEFAULT '',
`time` varchar(8) DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4、運(yùn)行MycatStartup.java嗓化,運(yùn)行成功控制臺(tái)打印如下:
5棠涮、因?yàn)镸yCAT作為數(shù)據(jù)庫中間代理層統(tǒng)一管理所有的數(shù)據(jù)源谬哀,后端數(shù)據(jù)庫集群對(duì)前端應(yīng)用程序透明刺覆。基本支持各種客戶端直連史煎。本篇我們代理的是MySQL數(shù)據(jù)源谦屑,直接用Navicat for MySQL連接MyCAT服務(wù):
展開邏輯數(shù)據(jù)庫TESTDB:
6、針對(duì)各個(gè)數(shù)據(jù)表寫幾條插入語句篇梭,看看執(zhí)行結(jié)果
表travelrecord相關(guān)配置:
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
測(cè)試語句1:
insert into travelrecord(`city`, `time`) values('NANJING', '20180906');
未指定分片列id氢橙,直接報(bào)錯(cuò):
測(cè)試語句2:
insert into travelrecord(`id`, `city`, `time`) values(1, 'NANJING', '20180906');
執(zhí)行成功,數(shù)據(jù)落入db1.travelrecord
表company相關(guān)配置:
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
測(cè)試語句3:
insert into company(`name`, `market_value`) values('yunmanman', 130);
執(zhí)行成功恬偷,數(shù)據(jù)落入db1.travelrecord悍手、db2.travelrecord、db3.travelrecord袍患。
type="global"為全局表坦康,數(shù)據(jù)冗余到各個(gè)分片,避免跨分片join诡延。
表hotnews相關(guān)配置:
<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
rule="mod-long" />
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
測(cè)試語句4:
insert into hotnews(`title`, `content`) values('波音飛機(jī)', '波音埃塞俄比亞墜機(jī)');
執(zhí)行成功滞欠,數(shù)據(jù)落入db1.hotnews。
對(duì)比測(cè)試語句1發(fā)現(xiàn)肆良,同樣是未指定分片列id筛璧,加入屬性autoIncrement="true"后 逸绎,主鍵自增對(duì)應(yīng)用透明。
本篇開胃菜到此結(jié)束夭谤。
轉(zhuǎn)載請(qǐng)備注原文鏈接棺牧。