mycat實現mysql分庫分表
來自專欄我是程序員57 人贊了文章
摘要: myCat是一個開源的分散式資料庫系統,是一個實現了MySQL協議的伺服器,前端用戶可以把它看作是一個資料庫代理,用MySQL客戶端工具和命令行訪問,而其後端可以用MySQL原生協議與多個MySQL伺服器通信,也可以用JDBC協議與大多數主流資料庫伺服器通信,其核心功能是分表分庫,即將一個大表水平分割為N個小表,存儲在後端MySQL伺服器里或者其他資料庫里。
1. mycat介紹
myCat是一個開源的分散式資料庫系統,是一個實現了MySQL協議的伺服器,前端用戶可以把它看作是一個資料庫代理,用MySQL客戶端工具和命令行訪問,而其後端可以用MySQL原生協議與多個MySQL伺服器通信,也可以用JDBC協議與大多數主流資料庫伺服器通信,其核心功能是分表分庫,即將一個大表水平分割為N個小表,存儲在後端MySQL伺服器里或者其他資料庫里。
MyCat發展到目前的版本,已經不是一個單純的MySQL代理了,它的後端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流資料庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。而在最終用戶看來,無論是那種存儲方式,在MyCat里,都是一個傳統的資料庫表,支持標準的SQL語句進行數據的操作,這樣一來,對前端業務系統來說,可以大幅降低開發難度,提升開發速度
2.使用介紹:
本次演示的是基於mysql資料庫,通過中間件mycat實現分庫分表功能。3.環境
3台物理機linux操作系統
其中兩台安裝Mysql 5.7另一台安裝Mycat4.原理圖5.搭建過程
- 下載mycathttp://mycat.sourceforge.net/
- 安裝及修改配置文件下載好安裝包,解壓即可
Mycat分為3個重要的配置文件,分別為 schema.xml server.xml rule.xml
1.scheme.xml此配置文件是設置整體的scheme拆分任務;節點配置信息;表拆分信息;以及底層mysql資料庫登錄方式。
具體內容如下:<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="mycat" checkSQLschema="false" sqlMaxLimit="1000"> --schema任務配置 <table name="test1" primaryKey="ID" dataNode="dn1,dn3,dn2" rule="auto-sharding-long"/> --表test1 拆分的節點以及拆分規則 <table name="test2" primaryKey="ID" dataNode="dn2,dn4" rule="rule1"/> </schema> <dataNode name="dn1" dataHost="192.168.0.3" database="db1" /> --節點信息配置 <dataNode name="dn2" dataHost="192.168.0.3" database="db2" /> <dataNode name="dn3" dataHost="192.168.0.4" database="db3" /> <dataNode name="dn4" dataHost="192.168.0.4" database="db4" /> <dataHost name="192.168.0.3" maxCon="1000" minCon="10" balance="0" --底層mysql登錄方式 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="mysql1" url="192.168.0.3:3306" user="root" password="123456"> </writeHost> </dataHost> <dataHost name="192.168.0.4" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="mysql2" url="192.168.0.4:3306" user="root" password="123456"> </writeHost> </dataHost></mycat:schema>
2.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> <!-- 1為開啟實時統計、0為關閉 --> <property name="useGlobleTableCheck">0</property> <!-- 1為開啟全加班一致性檢測、0為關閉 --> <property name="sequnceHandlerType">2</property> <property name="processorBufferPoolType">0</property>m-vy288c43d05418f4 <property name="handleDistributedTransactions">0</property> <!-- off heap for merge/order/group/limit 1開啟 0關閉 --> <property name="useOffHeapForMerge">1</property> <!-- 單位為m --> <property name="memoryPageSize">1m</property> <!-- 單位為k --> <property name="spillsFileBufferSize">1k</property> <property name="useStreamOutput">0</property> <!-- 單位為m --> <property name="systemReserveMemorySize">384m</property> <!--是否採用zookeeper協調切換 --> <property name="useZKSwitch">true</property> </system> <firewall> <whitehost> <host host="127.0.0.1" user="root"/> <host host="localhost" user="root"/> </whitehost> <blacklist check="false"> </blacklist> </firewall> <user name="root"> <property name="password">123456</property> <property name="schemas">mysql</property> </mycat:server>
3.rule.xml
此配置文件配置的是表的拆分規則,以及拆分規則底層文件配置,具體內容如下:<?xml version="1.0" encoding="UTF-8"?>c language governing permissions and - limitations under the License. --><!DOCTYPE mycat:rule SYSTEM "rule.dtd"><mycat:rule xmlns:mycat="http://io.mycat/"> <tableRule name="test1"> --表test1拆分規則配置 <rule> <columns>ID</columns> <algorithm>rang-long</algorithm> </rule> </tableRule> <tableRule name="test2"> <rule> <columns>ID</columns> <algorithm>func1</algorithm> </rule> </tableRule> <function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash"> <property name="seed">0</property> <property name="count">2</property> <property name="virtualBucketTimes">160</property> </function> <function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot"> <property name="count">2</property> </function> <function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txt</property> </function> <function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> </function> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">3</property> </function> <function name="func1" class="io.mycat.route.function.PartitionByLong"> <property name="partitionCount">8</property> <property name="partitionLength">128</property> </function> <function name="latestMonth" class="io.mycat.route.function.LatestMonthPartion"> <property name="splitOneDay">24</property> </function> <function name="partbymonth" class="io.mycat.route.function.PartitionByMonth"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2015-01-01</property> </function> <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod"> <property name="mapFile">partition-range-mod.txt</property> </function> <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash"> <property name="totalBuckets">3</property> </function></mycat:rule>
6.底層mysql配置
Mysql需要授予mycat所在主機的登錄許可權在192.168.0.3上:
mysql> grant all on db1.* to root@192.168.0.4 identified by 123;
mysql> grant all on db2.* to root@192.168.0.4 identified by 123;
在192.168.0.4上: mysql> grant all on db3.* to root@192.168.0.4 identified by 123;
mysql> grant all on db4.* to root@192.168.0.4 identified by 123;
7.測試功能
1.開啟mycat:2.在mycat所在主機登錄mysql
由上圖可以看到,在mycat所在主機中登錄mysql 會看到已經創建好的schema 下面有兩個表 test1 test2
3.插入數據測試:
插入三條數據,在mycat 所在主機select會顯示所有數據在底層資料庫中指揮顯示根據拆分規則插入的數據:
192.168.0.4中結果如下
192.168.0.3中結果如下
本文作者:紅隱
原文鏈接
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
本文為雲棲社區原創內容,未經允許不得轉載。
推薦閱讀:
※[Python]MySQL中文字元與Python中文字元
※MySQL 性能調優的10個方法
※oracle 版sql五十題,親手驗證過
※mysql中sql使用場景及應用技巧
※第五課 資料庫之MongoDB