mycat實現mysql分庫分表

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

另一台安裝Mycat

4.原理圖

5.搭建過程

  1. 下載mycat

    mycat.sourceforge.net/
  2. 安裝及修改配置文件

    下載好安裝包,解壓即可

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

TAG:資料庫 | 編程語言 | MySQL |