MyCat
MyCAT 是一款開源的Mysql企業(yè)級集群應(yīng)用劲室,它是基于阿里的開源產(chǎn)品Cobar發(fā)展出來的霹肝。MyCAT提供了類似Mysql的接口穆趴,可以平滑的將單機(jī)Mysql遷移到Mysql集群上饿凛,解決數(shù)據(jù)存儲和業(yè)務(wù)規(guī)模迅速增長情況下的數(shù)據(jù)瓶頸問題只泼。
配置
schema.xml
中定義邏輯庫剖笙,表、分片節(jié)點(diǎn)等內(nèi)容请唱;
rule.xml
中定義分片規(guī)則弥咪;
server.xml
中定義用戶以及系統(tǒng)相關(guān)變量,如端口等
server.xml
server.xml
是MyCAT對外的“虛擬數(shù)據(jù)庫”配置文件十绑。所謂的“虛擬數(shù)據(jù)庫”是說聚至,MyCAT將多個(gè)Mysql集群整合起來對外提供服務(wù),提供服務(wù)的接口仍然采用Mysql的形式本橙,因此扳躬,通過仿造Mysql接口,讓調(diào)用程序以為自己是在訪問Mysql數(shù)據(jù)庫,就是所謂的“虛擬數(shù)據(jù)庫”贷币。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
</system>
<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
表明該虛擬數(shù)據(jù)庫有一個(gè)schema击胜,TESTDB
;
有2個(gè)用戶test
和user
役纹,密碼分別是test
和user
偶摔,
user
用戶是只讀的,test
用戶未設(shè)置只讀促脉;
默認(rèn)的SQL解析器是druidparser
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3"
rule="mod-long" />
<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile" />
<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id"
parentKey="id">
<childTable name="order_items" joinKey="order_id"
parentKey="id" />
</childTable>
<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
parentKey="id" />
</table>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
</writeHost>
<writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" />
</dataHost>
</mycat:schema>
Schema中主要配置 Mycat 數(shù)據(jù)庫啰挪,MySQL表,分片規(guī)則嘲叔,分片類型
schema
第1塊是schema
塊,主要描述了虛擬數(shù)據(jù)庫的schemaTESTDB
中有哪些表抽活,每個(gè)表分布在哪些數(shù)據(jù)節(jié)點(diǎn)上硫戈,分布的方法采用哪種算法。例如<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
下硕,表示travelrecord
表分布在dn1,dn2,dn3
這3個(gè)節(jié)點(diǎn)上丁逝,分布的方法采用auto-sharding-long
算法。
dataNode
第2塊是dataNode
梭姓,表示該數(shù)據(jù)庫有哪些數(shù)據(jù)節(jié)點(diǎn)霜幼,以及這些數(shù)據(jù)節(jié)點(diǎn)實(shí)際對應(yīng)的數(shù)據(jù)服務(wù)器和數(shù)據(jù)庫名,這里配置了3個(gè)節(jié)點(diǎn)dn1,dn2,dn3
誉尖,都是在localhost1
服務(wù)器上罪既,數(shù)據(jù)庫名分別是db1,db2,db3
,其實(shí)铡恕,這也正是前面schema
塊中用到的琢感。
dataHost
第3塊是dataHost
,這部分是實(shí)際的數(shù)據(jù)庫服務(wù)器配置探熔,這里配置了2個(gè)Mysql數(shù)據(jù)庫驹针,hostM1
和hostS1
,地址分別在“l(fā)ocalhost:3306”诀艰,用戶名都是root
柬甥,密碼是123456
,并且指定了心跳是select user()
其垄。
這里面有兩個(gè)參數(shù)需要注意苛蒲,balance和 switchType。
balance
指的負(fù)載均衡類型绿满,目前的取值有4種:
balance="0", 不開啟讀寫分離機(jī)制撤防,所有讀操作都發(fā)送到當(dāng)前可用的writeHost上。
balance="1",全部的readHost與stand by writeHost參與select語句的負(fù)載均衡寄月,簡單的說辜膝,當(dāng)雙主雙從模式(M1->S1,M2->S2漾肮,并且M1與 M2互為主備)厂抖,正常情況下,M2,S1,S2都參與select語句的負(fù)載均衡克懊。
balance="2"忱辅,所有讀操作都隨機(jī)的在writeHost、readhost上分發(fā)谭溉。
balance="3"墙懂,所有讀請求隨機(jī)的分發(fā)到wiriterHost對應(yīng)的readhost執(zhí)行,writerHost不負(fù)擔(dān)讀壓力
switchType
指的是切換的模式扮念,目前的取值也有4種:
- switchType='-1' 表示不自動切換
- switchType='1' 默認(rèn)值损搬,表示自動切換
- switchType='2' 基于MySQL主從同步的狀態(tài)決定是否切換,心跳語句為 show slave status
- switchType='3'基于MySQL galary cluster的切換機(jī)制(適合集群)(1.4.1),心跳語句為 show status like 'wsrep%'柜与。
rule.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://org.opencloudb/">
<tableRule name="sharding-by-hour">
<rule>
<columns>createTime</columns>
<algorithm>sharding-by-hour</algorithm>
</rule>
</tableRule>
<function name="sharding-by-hour" class="org.opencloudb.route.function.LatestMonthPartion">
<property name="splitOneDay">24</property>
</function>
</mycat:rule >
數(shù)據(jù)切分中作為表切分規(guī)則中最重要的配置巧勤,表的切分方式?jīng)Q定了數(shù)據(jù)切分后的性能好壞,因此也是最重要的配置弄匕。
如上面例子配置了一個(gè)切分規(guī)則颅悉,名為sharding-by-hour 對應(yīng)的切分方式(function )是按日期切分,該配置中:
tableRule
name 為schema.xml 中table 標(biāo)簽中對應(yīng)的 rule="sharding-by-hour" ,也就是配置表的分片規(guī)則迁匠,
columns 是表的切分字段: createTime 創(chuàng)建日期剩瓶。
algorithm 是規(guī)則對應(yīng)的切分規(guī)則:映射到function 的name。
function
function 配置是分片規(guī)則的配置城丧。
name 為切分規(guī)則的名稱儒搭,名字人員取,但是需要與tableRule 中匹配芙贫。
class 是切分規(guī)則對應(yīng)的切分類搂鲫,寫死,需要哪種規(guī)則則配置哪種磺平,例如本例子是按小時(shí)分片:org.opencloudb.route.function.LatestMonthPartion
property 標(biāo)簽是切分規(guī)則對應(yīng)的不同屬性魂仍,不同的切分規(guī)則配置不同。
登陸演示mycat
登陸
登錄方式類似于 mysql 的服務(wù)端登陸拣挪,目前 mycat 有兩個(gè)端口擦酌,8066 數(shù)據(jù)端口,9066 管理端口
登陸方式如:
mysql -h127.0.0.1 -utest -ptest -P9066 [-dmycat]
-h 后面是主機(jī)菠劝,即當(dāng)前 mycat 按照的主機(jī)地址赊舶,本地可用 127.0.0.1 遠(yuǎn)程需要遠(yuǎn)程 ip
-u Mycat server.xml 中配置的邏輯庫用戶
-p Mycat server.xml 中配置的邏輯庫密碼
-P 后面是端口 默認(rèn) 9066,注意 P 是大寫
-d Mycat server.xml 中配置的邏輯庫
數(shù)據(jù)端口與管理端口的配置端口修改:
數(shù)據(jù)端口默認(rèn) 8066,管理端口默認(rèn) 9066 笼平,如果需要修改需要配置 serve.xml
演示
D:\mycat\bin>mysql -utest -ptest -P9066 -Dtestdb
mysql> show @@help; -- 獲取有關(guān)管理的相關(guān)命令
mysql> show @@database; -- 查看邏輯數(shù)據(jù)庫
+----------+
| DATABASE |
+----------+
| testdb |
+----------+
mysql> show @@datanode; --查看分片節(jié)點(diǎn)
mysql> show @@server; --查看服務(wù)器狀態(tài)
mysql> show @@version; --查看版本
+----------------------------------------+
| VERSION |
+----------------------------------------+
| 5.5.8-mycat-1.4-RELEASE-20150922233010 |
+----------------------------------------+
D:\mycat\bin>mysql -utest -ptest -P8066 -Dtestdb
mysql> select database();
+------------+
| DATABASE() |
+------------+
| testdb |
+------------+
mysql> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| company |
| customer |
| customer_addr |
| employee |
| goods |
| hotnews |
| orders |
| order_items |
| travelrecord |
+------------------+
注意
啟動MyCAT之前园骆,需要先檢查一些配置:
java的版本需要是1.7或以上;
Mysql的配置文件需要加一行
lower_case_table_names = 1
在[mysqld]
欄目中寓调,這個(gè)設(shè)置為Mysql大小寫不敏感锌唾,否則可能會發(fā)生表找不到的問題;在示例的2個(gè)數(shù)據(jù)
hostM1
和hostS1
上夺英,新建3個(gè)數(shù)據(jù)庫db1,db2,db3
晌涕,如不新建,可能提示找不到數(shù)據(jù)庫ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0
(這個(gè)提示不夠友好痛悯,是在運(yùn)行很長一段時(shí)間后才提示)余黎;-
ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:1
這個(gè)有可能是Mycat和MySQL部署在同一臺機(jī)器上,而在schema.xml是使用了IP的载萌,但是賬號只能使用localhost登陸惧财,所以會出現(xiàn)本地的Mycat無法連接MySQL
添加
MYCAT_HOME
環(huán)境變量指向解壓的mycat目錄,主要是為了一些bin
目錄下的腳本的使用炒考。