書接上回,我們繼續分庫分表的實現。在上篇中已經提到的內容將不再說明,具體請參照《mycat實現讀寫分離(一)》
1、分庫分表schema配置
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 3 4 <mycat:schema xmlns:mycat="http://io.mycat/"> 5 <!-- 數據庫配置,與server.xml中的數據庫對應 --> 6 <schema name="testdb" checkSQLschema="true" sqlMaxLimit="100"> 7 <table name="travel_record" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3,dn4" rule="mod-long"/> 8 </schema> 9 <!-- 分片配置 --> 10 <dataNode name="dn1" dataHost="host1" database="testdb"/> 11 <dataNode name="dn2" dataHost="host2" database="testdb"/> 12 <dataNode name="dn3" dataHost="host3" database="testdb"/> 13 <dataNode name="dn4" dataHost="host4" database="testdb"/> 14 15 <!-- 物理數據庫配置 --> 16 <dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> 17 <heartbeat>select user();</heartbeat> 18 <writeHost host="M1" url="192.168.153.130:3306" user="root" password="mysql"/> 19 </dataHost> 20 <dataHost name="host2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> 21 <heartbeat>select user();</heartbeat> 22 <writeHost host="M2" url="192.168.153.131:3306" user="root" password="mysql"/> 23 </dataHost> 24 <dataHost name="host3" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> 25 <heartbeat>select user();</heartbeat> 26 <writeHost host="M2" url="192.168.153.132:3306" user="root" password="mysql"/> 27 </dataHost> 28 <dataHost name="host4" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> 29 <heartbeat>select user();</heartbeat> 30 <writeHost host="M4" url="192.168.153.133:3306" user="root" password="mysql"/> 31 </dataHost> 32 </mycat:schema>
二、分片規則
mycat支持多種分片策略,本文以mod-long為例,其他分片策略詳見mycat官方文檔:http://www.mycat.io/document/mycat-definitive-guide.pdf
需要關注分片的規則為mod-long,由於配置schema中有四個dataHost,所以還需檢查分片規則配置。
編輯rule.xml檢查名稱為mod-long的分片規則設置,function中配置分片數量需與實際分片節點數保持一致。
1 <tableRule name="mod-long"> 2 <rule> 3 <columns>id</columns> 4 <algorithm>mod-long</algorithm> 5 </rule> 6 </tableRule> 7 <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> 8 <!-- how many data nodes --> 9 <property name="count">4</property> 10 </function>
三、全局ID
在實現了分庫分表的情況下,數據庫自增主鍵已無法保證在集群全局中保持唯一,mycat提供了全局sequence,並提供了本地配置、數據庫配置等多種方式。本文中以本地配置文件方式為例。
首先開啟sequence本地配置文件方式主鍵自增策略,將server.xml中sequenceHandlerType改為1。
1 <property name="sequnceHandlerType">0</property>
編輯sequence_conf.properties配置文件增加sequence配置:
1 #TRAVEL_RECORD 是表名稱 2 #HISIDS 表示歷史分段(一般無特殊需要則可以不配置) 3 #MINID 最小id 4 #MAXID 最大id 5 #CURID 當前id 6 7 TRAVEL_RECORD.HISIDS= 8 TRAVEL_RECORD.MINID=11 9 TRAVEL_RECORD.MAXID=2000 10 TRAVEL_RECORD.CURID=10
四、測試
重啟mycat,執行./mycat restart。通過管理端9066端口查看數據源:mysql -uroot -pmysql -P9066 -h127.0.0.1

循環插入測試數據,執行下述SQL
1 INSERT INTO travel_record(org_code,org_name) VALUES ('20180913','name1');
插入數條數據后,命令行鏈接mycat查詢數據落庫情況如下圖:

各個節點130、131、132、133數據情況:


至此mycat分庫分表測試環境搭建結束。
注意:四個節點的mysql不存在主從關系,否則會出現預期之外的分片結果和重復數據。在寫上篇時我的四個mysql服務是一主三從,在本篇測試過程中忘記關閉主從復制出現了些小情況,但是觀察數據后果斷關閉調整,結果如上圖預期。
