前言
Mycat 是一個數據庫分庫分表中間件
MyCAT 是作為通用代理設計的,后端是以 Mysql協(xié)議 和 JDBC 的方式連接數據庫,可以支持 Oracle、DB2、SQL Server 、 mongodb、mysql
這里簡單分享一下 Mycat 中的概念及配置的相關基礎 ,詳細內容可以參考 官方文檔 、 Mycat-Server 和 Get Start
Tip: 當前的最新版本為 Mycat server 1.5 GA
概要
概念
數據庫中間件
Mycat 其實只是一個數據中間件,或數據庫代理
Tip: 所有難搞定的事情都可以通過中間件有效處理,中間件能有效解耦并專注于特定領域問題,LVM、LVS、MQ 都是這個思路(房屋中介,銀行也都是這個思路)
所以Mycat沒有存儲引擎,本身并不存儲數據,只是起到了請求分析,拆解,路由與結果聚合的作用,為前端應用提供統(tǒng)一接口,Mycat 與后端的數據庫集群有機組合才一起構成一個分布式數據庫系統(tǒng)
邏輯庫(schema)
類似于LVM中VG的概念(VG由一個或多個PV構成),邏輯庫是由一個或多個后端數據庫構成的,展示給應用的是一個單一視圖,是分布式數據庫在邏輯上的一個抽象
邏輯表(table)
與數據庫中表相對應的,分布式數據表在邏輯上的一個抽象
數據表切分后的一個部分(原表的一個真子集)
沒有分片的表,就是非分片表
保留了實體關系特性的表,就是ER表
關系型數據庫是基于實體關系模型的相關理論來構建的數據庫,表與表間有依賴關系,通過表分組(Table Group) 讓有依賴的表在同一實例庫中從而避免了數據Join不會跨庫操作
全局表是所有分片上都有一份完整拷貝的表
字典表或符合字典特性的表可以被設置為全局表
有以下特點的表,被稱作字典表:
- 變動不頻繁
- 數據量總體變化不大
- 數據規(guī)模不大(很少超過十萬條記錄)
- 會與其它表發(fā)生關聯(lián)
這類表可以通過冗余來解決join問題,也就是所有的分片都放上一份數據的拷貝來避免跨分片聯(lián)查
Tip: 數據冗余和表分組是解決跨分片數據join的好思路,也是數據切分規(guī)劃的重要規(guī)則
分片節(jié)點(dataNode)
每個表分片所在的數據庫就是分片節(jié)點
節(jié)點主機(dataHost)
分片節(jié)點所在的服務器就是節(jié)點主機
Tip: 盡量將讀寫壓力高的分片節(jié)點均衡放在不同的節(jié)點主機上,以避免單節(jié)點主機并發(fā)數限制
分片規(guī)則(rule)
分片規(guī)則就是切分數據的規(guī)則
全局序列號(sequence)
保證數據全局唯一性標識的外部機制就是全局序列號
Tip: 單機(單實例)環(huán)境下的主鍵約束在分布式環(huán)境中將失效,因此得通過外部機制以全局視角來保證數據唯一性
多租戶
多租戶技術也叫多重租憑技術,就是在確保用戶間數據隔離的前提下實現(xiàn)在多用戶環(huán)境中共用相同系統(tǒng)或程序等軟硬件資源的一種軟件架構技術
Tip: web 中廣范使用的 VirtualHost 就是一種典型的多租戶技術,多租戶技術是為了更充分的使用到現(xiàn)有資源,同時不失權限控制的一種技術
- 獨立數據庫
- 共享數據庫,隔離數據架構
- 共享數據庫,共享數據架構
隔離級別越來越低,共享程度越來越高,均攤成本越來越低
整體關系
配置
Mycat 的大部分配置都是以 XML 的格式設定的
[root@h102 mycat]# ll conf/schema.xml
-rwxrwxrwx 1 root root 4129 Feb 17 10:30 conf/schema.xml
[root@h102 mycat]# ll conf/rule.xml
-rwxrwxrwx 1 root root 4510 Feb 17 10:30 conf/rule.xml
[root@h102 mycat]# ll conf/server.xml
-rwxrwxrwx 1 root root 2507 Feb 17 10:30 conf/server.xml
[root@h102 mycat]# ll conf/wrapper.conf
-rwxrwxrwx 1 root root 4318 Feb 24 21:20 conf/wrapper.conf
[root@h102 mycat]#
Conf | Comment |
conf/wrapper.conf |
JVM運行環(huán)境配置 |
conf/server.xml |
用來定義系統(tǒng)相關變量 |
conf/schema.xml |
用來定義邏輯庫,表,分片節(jié)點 |
conf/rule.xml |
用來定義分片規(guī)則 |
wrapper.conf
我們使用這個文件來配置JVM的相關運行參數
[root@h102 conf]# cat wrapper.conf | egrep "(Xm|MaxDirectMemorySize)"
#wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G
wrapper.java.additional.5=-XX:MaxDirectMemorySize=256m
#wrapper.java.additional.10=-Xmx4G
wrapper.java.additional.10=-Xmx512m
#wrapper.java.additional.11=-Xms1G
wrapper.java.additional.11=-Xms128m
[root@h102 conf]#
以上配置是常用的對JVM內存的控制
server.xml
XML的格式就是各類標簽
注釋
這個標簽用來框定注釋范圍
mycat:server
這個標簽用來框定服務配置范圍
<mycat:server xmlns:mycat="http://org.opencloudb/">
</mycat:server>
system
這個標簽用來框定系統(tǒng)配置范圍,用來保存幾乎所有mycat需要的系統(tǒng)配置信息(其在代碼內直接的映射類為SystemConfig )
property
用來設定服務的具體參數
<property name="defaultSqlParser">druidparser</property>
<property name="processors">2</property>
<property name="serverPort">8066</property>
<property name="managerPort">9066</property>
<property name="bindIp">0.0.0.0</property>
user
用來設定一個租戶,與相關權限
這里設定了一個 cc 的租戶,密碼為 cc , 可以訪問 cctest 的數據庫(schema)
<user name="cc">
<property name="password">cc</property>
<property name="schemas">cctest</property>
</user>
schema.xml
mycat:schema
這個標簽用來框定shema的配置范圍
<mycat:schema xmlns:mycat="http://org.opencloudb/">
</mycat:schema>
schema
用來配置一個邏輯庫(schema)
這里配置了一個名叫 cctest 的邏輯庫,不檢查SQL,默認limit為100(sql中不添加limit的情況下,mycat會隱式添加,以避免返回太多結果),其中包含兩個邏輯表,catworld 和 catworld4 ,catworld 有三個分片,使用 mod-long 的規(guī)則,catworld4 有四個分片,使用 mod4-long 的分片規(guī)則
<schema name="cctest" checkSQLschema="false" sqlMaxLimit="100">
<table name="catworld" dataNode="sd1,sd2,sd3" rule="mod-long" />
<table name="catworld4" dataNode="sd1,sd2,sd3,sd4" rule="mod4-long" />
</schema>
Attribute | Comment |
checkSQLschema |
隱式刪除schema前綴 |
sqlMaxLimit |
隱式添加limit語句 |
table
Attribute | Comment |
dataNode |
指定所屬數據節(jié)點 |
rule |
指定分片規(guī)則 |
dataNode
這個標簽用來定義數據節(jié)點(數據分片存放的地方)
<dataNode name="sd1" dataHost="h101" database="my1" />
<dataNode name="sd2" dataHost="h101" database="my2" />
<dataNode name="sd3" dataHost="h101" database="my3" />
<dataNode name="sd4" dataHost="h202" database="my4" />
Attribute | Comment |
dataHost |
指定所屬數據庫實例 |
database |
指定數據庫實例上的實際數據庫名(一定要和真實庫一樣的名字,這個不是被標簽定義的,是要提前在實例中手動創(chuàng)建的) |
dataHost
節(jié)點主機的相關配置
<dataHost name="h101" maxCon="100" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="h101M1" url="192.168.100.101:3306" user="root" password="mysql">
<!-- can have multi read hosts -->
</writeHost>
</dataHost>
<dataHost name="h202" maxCon="100" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="h202M1" url="192.168.100.202:3306" user="root" password="mysql">
<!-- can have multi read hosts -->
</writeHost>
</dataHost>
Attribute | Comment |
maxCon |
一個讀寫實例鏈接池的最大連接數 |
minCon |
一個讀寫實例鏈接池的最小連接數,初始化連接池的大小 |
balance |
負載均衡類型:0 代表不開啟讀寫分離機制,只使用writeHost; 1 代表readHost與writeHost分擔讀請求; 2 代表隨機分配讀請求和1類似; 3 代表只由readHost來承擔讀請求 |
writeType |
負載均衡類型:0 代表發(fā)到第一個writeHost,掛了后切到還生存的第二個writeHost,重新啟動后以切換后的為準,也就是不漂回;1 代表寫操作隨機發(fā)送到writeHost,這樣不安全; |
dbType |
后端數據庫類型 |
dbDriver |
mysql系可以使用native,其它系列得使用JDBC |
switchType |
切換類型:-1 代表不切換,1 代表自動切換, 2 代表基于主從同步狀態(tài)決定是否切換 |
slaveThreshold |
slave讀的安全邊界,如果Seconds_Behind_Master 大于這個值,這臺slave會被臨時剔除,以免被讀 |
heartbeat
里面包含一個語句,用語句執(zhí)行成功與否來判定數據庫的可用性
writeHost/readHost
Attribute | Comment |
host |
一個主機標識,便于區(qū)分,不必和真實主機名一致 |
url |
后端實例連接地址 |
user |
連接賬戶 |
password |
連接密碼 |
Tip: 用戶名和密碼要提前在各實例中賦予相應連接和操作權限
rule.xml
此配置用來定義分片規(guī)則
mycat:rule
框定rule的配置范圍
<mycat:rule xmlns:mycat="http://org.opencloudb/">
</mycat:rule>
tableRule
定義一個分片規(guī)則
定義了一個 mod-long 的分片規(guī)則,對 id 列進行分片,使用 mod-long 算法;定義了一個 mod4-long 的分片規(guī)則,對 id 列進行分片,使用 mod4-long 算法
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<tableRule name="mod4-long">
<rule>
<columns>id</columns>
<algorithm>mod4-long</algorithm>
</rule>
</tableRule>
function
<function name="mod-long" class="org.opencloudb.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
<function name="mod4-long" class="org.opencloudb.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">4</property>
</function>
Attribute | Comment |
class |
使用的類 |
property |
通過 count=3/4 來指定分片數(指定模數) |
注意
XML中定義的標簽有順序,如果不按照順序進行配置,會報錯
比如 schema.xml 中的順序為
- 1.定義 schema
- 2.定義 dataNode
- 3.定義 dataHost
如果不按順序,會無法啟動mycat,并且 mycat.log 中會報錯
這里只對一套簡單基礎的配置進行了分析,只涵蓋了一小部分,還未涵蓋到的,可以參考 官方文檔
命令匯總
ll conf/schema.xml
ll conf/rule.xml
ll conf/server.xml
ll conf/wrapper.conf
cat wrapper.conf | egrep "(Xm|MaxDirectMemorySize)"
|