Mycat 配置

前言

Mycat 是一個數據庫分庫分表中間件前端

MyCAT 是做爲通用代理設計的,後端是以 Mysql協議 和 JDBC 的方式鏈接數據庫,能夠支持 Oracle、DB二、SQL Server 、 mongodb、mysqljava

mycat_middle.jpg

這裏簡單分享一下 Mycat 中的概念及配置的相關基礎 ,詳細內容能夠參考 官方文檔 、 Mycat-Server 和 Get Startnode

Tip: 當前的最新版本爲 Mycat server 1.5 GAmysql


概要


概念

數據庫中間件

db_midware.png

Mycat 其實只是一個數據中間件,或數據庫代理git

Tip: 全部難搞定的事情均可以經過中間件有效處理,中間件能有效解耦並專一於特定領域問題,LVM、LVS、MQ 都是這個思路(房屋中介,銀行也都是這個思路)github

因此Mycat沒有存儲引擎,自己並不存儲數據,只是起到了請求分析,拆解,路由與結果聚合的做用,爲前端應用提供統一接口,Mycat 與後端的數據庫集羣有機組合才一塊兒構成一個分佈式數據庫系統web


邏輯庫(schema)

mycat_schema.png

相似於LVM中VG的概念(VG由一個或多個PV構成),邏輯庫是由一個或多個後端數據庫構成的,展現給應用的是一個單一視圖,是分佈式數據庫在邏輯上的一個抽象算法


邏輯表(table)

  • 邏輯表

與數據庫中表相對應的,分佈式數據表在邏輯上的一個抽象sql

  • 分片表

數據表切分後的一個部分(原表的一個真子集)mongodb

  • 非分片表

沒有分片的表,就是非分片表

  • ER表

保留了實體關係特性的表,就是ER表

關係型數據庫是基於實體關係模型的相關理論來構建的數據庫,表與表間有依賴關係,經過表分組(Table Group) 讓有依賴的表在同一實例庫中從而避免了數據Join不會跨庫操做

  • 全局表

全局表是全部分片上都有一份完整拷貝的表

字典表或符合字典特性的表能夠被設置爲全局表

有如下特色的表,被稱做字典表:

  • 變更不頻繁
  • 數據量整體變化不大
  • 數據規模不大(不多超過十萬條記錄)
  • 會與其它表發生關聯

這類表能夠經過冗餘來解決join問題,也就是全部的分片都放上一份數據的拷貝來避免跨分片聯查

Tip: 數據冗餘和表分組是解決跨分片數據join的好思路,也是數據切分規劃的重要規則

mycat_table.png


分片節點(dataNode)

每一個表分片所在的數據庫就是分片節點


節點主機(dataHost)

分片節點所在的服務器就是節點主機

Tip: 儘可能將讀寫壓力高的分片節點均衡放在不一樣的節點主機上,以免單節點主機併發數限制


分片規則(rule)

分片規則就是切分數據的規則


全局序列號(sequence)

保證數據全局惟一性標識的外部機制就是全局序列號

Tip: 單機(單實例)環境下的主鍵約束在分佈式環境中將失效,所以得經過外部機制以全局視角來保證數據惟一性


多租戶

多租戶技術也叫多重租憑技術,就是在確保用戶間數據隔離的前提下實如今多用戶環境中共用相同系統或程序等軟硬件資源的一種軟件架構技術

mycat_multitenant.png

Tip: web 中廣範使用的 VirtualHost 就是一種典型的多租戶技術,多租戶技術是爲了更充分的使用到現有資源,同時不失權限控制的一種技術

  • 獨立數據庫
  • 共享數據庫,隔離數據架構
  • 共享數據庫,共享數據架構

隔離級別愈來愈低,共享程度愈來愈高,均攤成本愈來愈低

總體關係

mycat_arch.jpg


配置

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運行環境配置
conf/server.xml 用來定義系統相關變量
conf/schema.xml 用來定義邏輯庫,表,分片節點
conf/rule.xml 用來定義分片規則

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

這個標籤用來框定系統配置範圍,用來保存幾乎全部mycat須要的系統配置信息(其在代碼內直接的映射類爲SystemConfig )

<system> </system> 

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 的規則,catworld4 有四個分片,使用 mod4-long 的分片規則

<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 指定所屬數據節點
rule 指定分片規則

dataNode

這個標籤用來定義數據節點(數據分片存放的地方)

<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 指定數據庫實例上的實際數據庫名(必定要和真實庫同樣的名字,這個不是被標籤訂義的,是要提早在實例中手動建立的)

dataHost

節點主機的相關配置

<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 表明發到第一個writeHost,掛了後切到還生存的第二個writeHost,從新啓動後以切換後的爲準,也就是不漂回;1 表明寫操做隨機發送到writeHost,這樣不安全;
dbType 後端數據庫類型
dbDriver mysql系可使用native,其它系列得使用JDBC
switchType 切換類型:-1 表明不切換,1 表明自動切換, 2 表明基於主從同步狀態決定是否切換
slaveThreshold slave讀的安全邊界,若是Seconds_Behind_Master 大於這個值,這臺slave會被臨時剔除,以避免被讀

heartbeat

裏面包含一個語句,用語句執行成功與否來斷定數據庫的可用性

writeHost/readHost

Attribute Comment
host 一個主機標識,便於區分,沒必要和真實主機名一致
url 後端實例鏈接地址
user 鏈接帳戶
password 鏈接密碼

Tip: 用戶名和密碼要提早在各實例中賦予相應鏈接和操做權限


rule.xml

此配置用來定義分片規則

mycat:rule

框定rule的配置範圍

<mycat:rule xmlns:mycat="http://org.opencloudb/"> </mycat:rule> 

tableRule

定義一個分片規則

定義了一個 mod-long 的分片規則,對 id 列進行分片,使用 mod-long 算法;定義了一個 mod4-long 的分片規則,對 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)"
相關文章
相關標籤/搜索