環境準備
JDK 1.8,官網下載安裝即可。
MySQL 5.7,官網下載安裝即可。
MyCat1.6.5,下載地址http://dl.mycat.io/1.6.5/
,此處我們選擇windows版本下載即可。
下載解壓後,直接雙擊bin/startup_nowrap.bat即可啓動MyCat
數據庫準備
我們來模擬一個博客系統的數據庫,規劃設計三個庫db001、db002、db003,我們先將三個庫都放到本地數據庫實例中,後續如果是部署到雲端的話,更改服務器地址信息即可。
然後我們有兩個表用戶表user和博客表blog,用戶表存儲於db001,博客表存儲於db001/db002/db003。
所以在db001執行如下語句創建user表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增序號',
`name` varchar(255) DEFAULT '' COMMENT '姓名',
`password` varchar(255) DEFAULT '' COMMENT '密碼',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
然後再db001/db002/db003執行如下語句創建blog表
CREATE TABLE `blog` (
`id` int(11) NOT NULL COMMENT '序號',
`title` varchar(255) DEFAULT '' COMMENT '博客標題',
`content` varchar(255) DEFAULT '' COMMENT '博客內容',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
數據庫創建完成後結構如下:
配置真實服務器信息
通過修改conf/schema.xml
,來配置真實服務器的信息,併爲數據庫劃分節點,指定數據表所在的節點。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 注意TESTDB是MyCat設置的抽象數據庫名,對應我們配置的多個真實數據庫 -->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- user表對應dn1節點 -->
<table name="user" dataNode="dn1" />
<!-- blog表對應dn1/dn2/dn3節點,rule-blog表示對blog表的路由規則名稱 -->
<table name="blog" dataNode="dn1,dn2,dn3" rule="rule-blog" />
</schema>
<!-- 爲實例下面的各個庫設置節點 -->
<dataNode name="dn1" dataHost="localhost1" database="db001" />
<dataNode name="dn2" dataHost="localhost1" database="db002" />
<dataNode name="dn3" dataHost="localhost1" database="db003" />
<!-- 配置真實數據庫實例信息 -->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 配置數據庫url、用戶名、密碼 -->
<writeHost host="server1" url="localhost:3316" user="root" password="Easy@0122" />
</dataHost>
</mycat:schema>
配置路由規則
在schema.xml中我們已經制定了blog表存儲的節點,且設置了路由規則的名稱rule-blog
,然後我們設置該規則具體的策略。
修改conf/role.xml
,配置規則如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<!-- 指定要設置的規則 -->
<tableRule name="rule-blog">
<rule>
<!-- 規則生效的列 -->
<columns>id</columns>
<!-- 對應的路由算法 -->
<algorithm>rule-blog-algorithm</algorithm>
</rule>
</tableRule>
<!-- 配置算法具體實現方式 -->
<function name="rule-blog-algorithm" class="io.mycat.route.function.PartitionByMod">
<property name="count">3</property> <!-- 表示對id進行除3取模分表 -->
</function>
</mycat:rule>
配置MyCat服務信息
通過上面兩個配置文件,我們已指定了庫、表、分表路由規則,下面我們將其通過MyCat暴露出來,讓客戶端進行訪問。
通過修改conf/server.xml
配置MyCat對外服務信息,主要就是用戶名、密碼、以及上面指定的抽象數據庫名稱TESTDB。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<!-- system部分採用默認即可 -->
<system>
<property name="nonePasswordLogin">0</property> <!-- 0爲需要密碼登陸、1爲不需要密碼登陸 ,默認爲0,設置爲1則需要指定默認賬戶-->
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property> <!-- 1爲開啓實時統計、0爲關閉 -->
<property name="useGlobleTableCheck">0</property> <!-- 1爲開啓全加班一致性檢測、0爲關閉 -->
<property name="sequnceHandlerType">2</property>
<property name="subqueryRelationshipCheck">false</property> <!-- 子查詢中存在關聯查詢的情況下,檢查關聯字段中是否有分片字段 .默認 false -->
<!--默認爲type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
<property name="processorBufferPoolType">0</property>
<!--分佈式事務開關,0爲不過濾分佈式事務,1爲過濾分佈式事務(如果分佈式事務內只涉及全局表,則不過濾),2爲不過濾分佈式事務,但是記錄分佈式事務日誌-->
<property name="handleDistributedTransactions">0</property>
<!--off heap for merge/order/group/limit 1開啓 0關閉-->
<property name="useOffHeapForMerge">1</property>
<!--單位爲m-->
<property name="memoryPageSize">64k</property>
<!--單位爲k-->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!--單位爲m-->
<property name="systemReserveMemorySize">384m</property>
<!--是否採用zookeeper協調切換 -->
<property name="useZKSwitch">false</property>
</system>
<!-- 設置訪問的用戶名密碼 -->
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<!-- 注意此處是之前設定的抽象數據庫名稱 -->
<property name="schemas">TESTDB</property>
</user>
</mycat:server>
啓動測試
雙擊bin/startup_nowrap.bat啓動MyCat,如圖啓動成功:
我們使用navicat(其他工具也可以),通過上面配置的MyCat用戶名密碼連接MyCat,如下圖:
連接成功後,會發現一個數據庫TESTDB,及兩張表user/blog,TESTDB即爲MyCat抽象出來的數據庫,操作TESTDB中的數據會按照當時設定的規則,實際操作會發生在db001/db002/db003中,這個我們不必關心,MyCat會自動爲我們實現。
數據插入與查詢測試
我們在TESTDB執行6次insert語句。
insert into blog(id,title,content)values(1,"title1","content1")
insert into blog(id,title,content)values(2,"title2","content2")
insert into blog(id,title,content)values(3,"title3","content3")
insert into blog(id,title,content)values(4,"title4","content4")
insert into blog(id,title,content)values(5,"title5","content5")
insert into blog(id,title,content)values(6,"title6","content6")
在TESTDB查詢有6條數據,說明插入成功。
而db001有id爲3/6的數據。
db002有id爲1/4的數據。
db003有id爲2/5的數據。
說明MyCat自動爲我們取模了。