1 . 在mycat/conf
目錄下,MyCat核心配置文件:schema.xmlmysql
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 定義一個MyCat的模式,邏輯數據庫名稱TestDB --> <!-- 「checkSQLschema」:描述的是當前的鏈接是否須要檢測數據庫的模式 --> <!-- 「sqlMaxLimit」:表示返回的最大的數據量的行數 --> <!-- 「dataNode="dn1"」:該操做使用的數據節點是dn1的邏輯名稱 --> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/> <!-- 定義數據的操做節點 --> <!-- 「dataHost="localhost1"」:定義數據節點的邏輯名稱 --> <!-- 「database="mldn"」:定義數據節點要使用的數據庫名稱 --> <dataNode name="dn1" dataHost="localhost1" database="mldn" /> <!-- 定義數據節點,包括了各類邏輯項的配置 --> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <!-- 配置真實MySQL與MyCat的心跳 --> <heartbeat>select user()</heartbeat> <!-- 配置真實的MySQL的鏈接路徑 --> <writeHost host="hostM1" url="192.168.1.128:3306" user="root" password="123456"></writeHost> </dataHost> </mycat:schema>
2 . dataHost
標籤上屬性釋義:算法
balance
:負載均衡類型sql
0:不開啓讀寫分離機制,全部讀操做都發送到當前可用的writeHost上數據庫
1:所有的readHost與stand by writeHost參與select語句的負載均衡,vim
2:全部讀操做都隨機在writeHost、readHost上分發bash
3:全部讀請求隨機分發到writeHost對應的readHost執行,writeHost不負擔讀壓力服務器
writeType
:負載均衡類型負載均衡
0:全部寫操做發送到配置的第一個writeHost,當第一個writeHost宕機時,切換到第二個writeHost,從新啓動後以切換後的爲準,切換記錄在配置文件:dnindex.properties
中分佈式
1:全部寫操做都隨發送到配置的writeHosturl
2:還沒有實現
switchType
:切換方式
-1:不自動切換
1:自動切換(默認)
2:基於MySql主從同步的狀態來決定是否切換
1 . 前提:多臺MySQL服務器主機的時間是同步的,不然沒法實現主從配置
2 . MASTER修改MySQL配置文件vim /usr/local/mysql/my.cnf
log-bin=mysql-bin-1 : 表示配置同步的bin的文件名稱,不一樣的主從關係組,名稱不一樣
server_id=196 : 表示MySQL服務的編號,這個編號通常取IP的最後一位,也可自定義
3 . MASTER啓動MySQL服務nohup mysqld_safe --user=root > /dev/null 2>&1 &
4 . MASTER 登錄MySQL數據庫:mysql -uroot -p123456
,查看master狀態show master stats;
其中
File(tid_set) : 表示主機名稱(mysql-bin-1.000001)
Position : 表示同步的節點位置
5 . MASTER創建同步用戶:sync_user
GRANT REPLICCATION SLAVE,REPLICATION CLIENT ON *.* TO 'sync_user'@'192.168.1.%' IDENTIFIED BY '123456'; flush privileges;
6 . SLAVE修改MySQL配置文件vim /usr/local/mysql/my.cnf
log-bin=mysql-bin-1 : 表示配置同步的bin的文件名稱,不一樣的主從關係組,名稱不一樣
server_id=168 : 表示MySQL服務的編號,這個編號通常取IP的最後一位,也可自定義
7 . MASTER/SLAVE : 若服務已經啓動,須要刪除自動配置的編號文件,不然沒法同步rm /usr/local/mysql/data/auto.cnf
8 . SLAVE 啓動MySQL服務nohup mysqld_safe --user=root > /dev/null 2>&1 &
9 . SLAVE 登錄MySQL數據庫:mysql -uroot -p123456
10 . SLAVE進行主從關係配置
若此時已經啓動了從主機,必須先中止:
stop slave;
中止以後還想從新啓動,必須清楚全部的日誌信息: flush logs;
定義master主機:
change master to master_host='192.168.1.128',master_user='sync_user',master_password='123456',master_log_file='mysql-bin-1.000001',master_log_pos=435 ;
master_host
表示mast的主機ipmaster_user
表示可同步的帳號master_password
表示同步帳號的密碼master_log_file
表示MASTERshow master stats;
查看時的File(tid_set)master_log_pos
表示MASTERshow master stats;
查看時的Position
啓動slave:start slave;
查詢當前從主機狀態:show slave status\G;
若出現如下代碼表示已經啓動完成
Slave_IO_Running:YES Slave_SQL_Running:Yes
1 . 修改MyCat的schema.xml
文件vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 定義一個MyCat的模式,邏輯數據庫名稱TestDB --> <!-- 「checkSQLschema」:描述的是當前的鏈接是否須要檢測數據庫的模式 --> <!-- 「sqlMaxLimit」:表示返回的最大的數據量的行數 --> <!-- 「dataNode="dn1"」:該操做使用的數據節點是dn1的邏輯名稱 --> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/> <!-- 定義個數據的操做節點,之後這個節點會進行一些庫表分離使用 --> <!-- 「dataHost="localhost1"」:定義數據節點的邏輯名稱 --> <!-- 「database="test"」:定義數據節點要使用的數據庫名稱 --> <dataNode name="dn1" dataHost="localhost1" database="test" /> <!-- 定義數據節點,包括了各類邏輯項的配置 --> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <!-- 配置真實MySQL與MyCat的心跳 --> <heartbeat>select user()</heartbeat> <!-- 配置真實的MySQL的鏈接路徑 --> <writeHost host="hostMaster" url="192.168.1.196:3306" user="root" password="123456"> <readHost host="hostSlave" url="192.168.1.168:3306" user="root" password="123456"/> </writeHost> </dataHost> </mycat:schema>
2 . 對於讀寫分離的配置中:設置readHost讀取:balance=3
,設置writeHost與ReadHost共同分擔讀取:balance=2
3 . 啓動MyCat服務:/usr/local/mycat/bin/mycat console
4 . 此時就完成了MyCat讀寫分離的相關配置
1 . 分別在多臺MySQL主機上進行多個表的建立
2 . 修改MyCat的配置文件vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/> <schema name="TESTDB2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"/> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost2" database="db2" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host1" url="192.168.1.199:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host2" url="192.168.1.166:3306" user="root" password="123456"/> </dataHost> </mycat:schema>
3 . 修改MyCat用戶配置文件,將多個數據庫配置到server.xml
中vim /usr/local/mycat/conf/server.xml
<property name="schemas">TESTDB1,TESTDB2</property>
4 . 啓動MyCat服務/usr/local/mycat/bin/mycat console
5 . 此時即完成了垂直分庫,數據操做時須要指定具體操做的是哪個數據庫
1 . 全局表的做用:可充當數據字典表,這張數據表會在全部的數據庫中存在,但對外而言,只是一個邏輯數據庫存在的數據表,當對該表進行變動操做時,全部數據庫的該表都會發生相應的變化
2 . 在多臺MySQL主機上分別創建各自的數據字典表
3 . 修改MyCat的核心配置文件vim /usr/local/mycat/conf/schema.xml
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="dict" primaryKey="did" type="global" dataNode="dn1,dn2"/> </schema> <schema name="TESTDB1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/> <schema name="TESTDB2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"/> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost2" database="db2" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host1" url="192.168.1.199:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host2" url="192.168.1.166:3306" user="root" password="123456"/> </dataHost> </mycat:schema>
4 . 修改MyCat的用戶配置文件vim /usr/local/mycat/conf/server.xml
,將schema.xml
配置的全部邏輯數據庫,配置到該配置文件中
<property name="schemas">TESTDB1,TESTDB2,TESTDB</property>
5 . 啓動MyCat服務/usr/local/mycat/bin/mycat console
6 . 此時就完成了全局表的配置,此時只要對TESTDB該邏輯數據庫進行dict表的更新或插入操做,全部的其餘數據庫(TESTDB1,TESTDB2)上的dict表都會獲得更新
水平分庫指的是將一個數據量龐大的數據表分別保存到不一樣的數據庫裏,即:如今有多個數據庫,這個庫保存一樣結構的數據表,這些數據根據MyCat的算法,分別保存到符合自身要求的數據庫的數據表中,MyCat的分片規則配置文件在:/usr/local/mycat/conf/rule.xml
中,目前經常使用的分片規則有:
求模分庫:mod-long
範圍分庫:auto-sharding-long
Hash分庫:hash-int
月分庫:sharding-by-month
ER模型分庫:childTable
自定義分庫:CustomRule(該方式須要本身實現分庫算法)
vim /usr/local/mycat/conf/rule.xml
rule.xml
的配置
<tableRule name="my-mod-long"> <rule> <columns>id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> <function name="my-mod-long" class="io.mycat.route.function.PartitionByMod"> <property name="count">3</property><!--求模取餘的數--> </function>
schema.xml
配置
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="data" primaryKey="id" dataNode="dn1,dn2,dn3" rule="my-mod-long"/> </schema> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost2" database="db2" /> <dataNode name="dn3" dataHost="localhost3" database="db3" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host1" url="192.168.1.199:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host2" url="192.168.1.166:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host3" url="192.168.1.176:3306" user="root" password="123456"/> </dataHost> </mycat:schema>
server.xml
配置
<property name="schemas">TESTDB</property>
啓動MyCat服務/usr/local/mycat/bin/mycat console
使用客戶端端口進行鏈接mysql -uroot -p123456 -h192.168.1.1 -P8066 -DTESTDB
此時,就實現了MyCat的求模分片,每對3進行取餘,而後自動進行分片數據保存處理
序列的使用:
序列的配置,在
usr/local/mycat/conf/sequence_conf.properties
文件中還須要在
server.xml
文件中配置
<property name="sequenceHandlerType">0</property>
在SQL中使用
10020
表示序列增加
INSERT INTO data (id,title) VALUES ( 10020,@@hostname)
;
範圍分庫指的是,根據id的範圍進行不一樣數據庫的保存,或者根據數據大小的不一樣來進行保存
rule.xml
的配置
<tableRule name="my-auto-sharding-long"> <rule> <columns>id</columns> <algorithm>my-auto-sharding-long</algorithm> </rule> </tableRule> <function name="my-auto-sharding-long" class="io.mycat.route.function.AutoPartitionByLong"> <property name="mapFile">partition-long.txt</property><!--範圍規則文件--> </function>
- 此時須要定義一個範圍分庫的規則問津`partition-long.txt`,並存放在`conf`目錄中`vim /usr/local/mycat/conf/partition-long.txt` - partition-long.txt
根據數據編號劃分
0-10000=0
10001-20000=1
20001-30000=2
<table name="data" primaryKey="id" dataNode="dn1,dn2,dn3" rule="my-auto-sharding-long"/>
Hash分庫指的是根據某個字段的的固定內容進行分片,例如:根據省份分片,根據城市分片,通常進行Hash分片處理的,都要有一些固定的值進行匹配
rule.xml
配置
<tableRule name="my-by-intfile"> <rule> <columns>title</columns> <algorithm>my-hash-int</algorithm> </rule> </tableRule> <function name="my-hash-int" class="io.mycat.route.function.PartitionByFileMap"> < property name="type">1</property><!--0表示數字型分片,1表示字符串分片--> <property name="mapFile">partition-hash-int.txt</property><!--Hash規則文件--> </function>
- `schema.xml`配置
<table name="data" primaryKey="title" dataNode="dn1,dn2,dn3" rule="my-by-intfile"/>
每月存入每月單獨的數據庫中
rule.xml
配置
<tableRule name="my-by-month"> <rule> <columns>saledate</columns> <algorithm>my-partbymonth</algorithm> </rule> </tableRule> <function name="my-partbymonth" class="io.mycat.route.function.PartitionByMonth"> < property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2017-01-01</property> </function>
- `schema.xml`配置
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <!--使用$表示通配符--> <table name="data" primaryKey="id" dataNode="dn$1-12" rule="my-by-month"/> </schema> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost2" database="db2" /> <dataNode name="dn3" dataHost="localhost3" database="db3" /> <dataNode name="dn4" dataHost="localhost4" database="db4" /> <dataNode name="dn5" dataHost="localhost5" database="db5" /> <dataNode name="dn6" dataHost="localhost6" database="db6" /> <dataNode name="dn7" dataHost="localhost7" database="db7" /> <dataNode name="dn8" dataHost="localhost8" database="db8" /> <dataNode name="dn9" dataHost="localhost9" database="db9" /> <dataNode name="dn10" dataHost="localhost10" database="db10" /> <dataNode name="dn11" dataHost="localhost11" database="db11" /> <dataNode name="dn12" dataHost="localhost12" database="db12" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host1" url="192.168.1.166:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host2" url="192.168.1.199:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host3" url="192.168.1.116:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost4" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host4" url="192.168.1.150:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost5" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host5" url="192.168.1.152:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost6" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host6" url="192.168.1.177:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost7" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host7" url="192.168.1.136:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost8" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host8" url="192.168.1.153:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost9" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host9" url="192.168.1.159:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost10" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host10" url="192.168.1.176:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost11" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host11" url="192.168.1.156:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost12" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host12" url="192.168.1.136:3306" user="root" password="123456"/> </dataHost> </mycat:schema>
根據數據庫的ER模型進行分庫,即進行多表關聯分庫管理
schema.xml
配置
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <!--此處表示父表與子表的相互關聯--> <table name="data" primaryKey="id" dataNode="dn$1-3" rule="my-mod-long"> <childTable name="data_details" joinKey="id" primaryKey="ddid" parentKey="id"/> </table> </schema> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost2" database="db2" /> <dataNode name="dn3" dataHost="localhost3" database="db3" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host1" url="192.168.122.166:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host2" url="192.168.122.199:3306" user="root" password="123456"/> </dataHost> <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host3" url="192.168.122.198:3306" user="root" password="123456"/> </dataHost> </mycat:schema>
分佈式數據庫系統中,分片規則用於定義數據與分片的路由關係,也就是 insert,delete,update,select 的基本 sql 操做中,如何將 sql 路由到對應的分片執行。
Mycat 的整體路由圖爲:
- 官方案例分析: