mycat實現分庫分表(二)


  書接上回,我們繼續分庫分表的實現。在上篇中已經提到的內容將不再說明,具體請參照《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服務是一主三從,在本篇測試過程中忘記關閉主從復制出現了些小情況,但是觀察數據后果斷關閉調整,結果如上圖預期。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM