mycat安裝完成後,目錄以下:html
Mycat的配置文件都在conf目錄裏面,介紹幾個經常使用的文件:java
文件 | 說明 |
---|---|
server.xml | Mycat的配置文件,設置帳號、參數等 |
schema.xml | Mycat對應的物理數據庫和數據庫表的配置 |
rule.xml | Mycat分片(分庫分表)規則 |
server.xml文件其實跟讀寫分離策略關係不大,可是須要用此文件來配置鏈接MyCat的用戶及權限等。node
....... <user name="bobo"> <property name="password">bo@123</property> <property name="schemas">mycat/property> <!-- 表級 DML 權限設置 --> <!-- <privileges check="false"> <schema name="TESTDB" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> --> </user> <!-- #注意,因爲這裏只定義了一個標籤,因此把多餘的都註釋了。若是這個打開,也須要將TESTDB庫改成和上面同樣的mycat庫名。 <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user> --> </mycat:server> .......
參數 | 說明 |
---|---|
user | 用戶配置節點 |
name | 登陸的用戶名,也就是鏈接Mycat的用戶名。 |
password | 登陸的密碼,也就是鏈接Mycat的密碼 |
schemas | 數據庫名,這裏會和schema.xml中的配置關聯,多個用逗號分開,例如須要這個用戶須要管理兩個數據庫db1,db2,則配置db1,db2 |
privileges | 配置用戶針對表的增刪改查的權限 |
readOnly | mycat邏輯庫所具備的權限。true爲只讀,false爲讀寫都有,默認爲false。 |
注意:mysql
schema.xml是最主要的配置項,此文件關聯mysql讀寫分離策略!讀寫分離、分庫分表策略、分片節點都是在此文件中配置的!算法
MyCat做爲中間件,它只是一個代理,自己並不進行數據存儲,須要鏈接後端的MySQL物理服務器,此文件就是用來鏈接MySQL服務器的!
schema.xml 文件定義了 MyCat 到底鏈接那個數據庫實例,鏈接這個數據庫實例的哪一個數據庫。MyCat 一共有幾個邏輯數據庫,MyCat 一共有幾個邏輯表。sql
schema.xml 文件一共有四個配置節點:DataHost、DataNode、Schema、Table。mongodb
– balance屬性數據庫
負載均衡類型,目前的取值有3 種:
balance=「0」, 不開啓讀寫分離機制,全部讀操做都發送到當前可用的writeHost 上。
balance=「1」,所有的readHost 與stand by writeHost 參與select 語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,而且M1 與M2 互爲主備),正常狀況下,M2,S1,S2 都參與select 語句的負載均衡。
balance=「2」,全部讀操做都隨機的在writeHost、readhost 上分發。
balance=「3」,全部讀請求隨機的分發到wiriterHost 對應的readhost 執行,writerHost 不負擔讀壓
力,注意balance=3 只在1.4 及其之後版本有,1.3 沒有。後端
– writeType 屬性服務器
負載均衡類型,目前的取值有3 種: writeType=「0」,
全部寫操做發送到配置的第一個writeHost,第一個掛了切到還生存的第二個
writeHost,從新啓動後已切換後的爲準,切換記錄在配置文件中:dnindex.properties .
writeType=「1」,全部寫操做都隨機的發送到配置的writeHost,1.5 之後廢棄不推薦。
參數 | 說明 |
---|---|
schema | 數據庫設置,此數據庫爲邏輯數據庫,name與server.xml中schema對應 |
dataNode | 分片信息,也就是分庫相關配置 |
dataHost | 物理數據庫,真正存儲數據的數據庫 |
配置說明:
每一個節點的屬性逐一說明:
table:
屬性 | 說明 |
---|---|
name | 表名,物理數據庫中表名 |
dataNode | 表存儲到哪些節點,多個節點用逗號分隔。節點爲下文dataNode設置的name |
primaryKey | 主鍵字段名,自動生成主鍵時須要設置 |
autoIncrement | 是否自增 |
rule | 分片規則名 |
dataNode:
屬性 | 說明 |
---|---|
name | 節點名,與table中dataNode對應 |
datahost | 物理數據庫名,與datahost中name對應 |
database | 物理數據庫中數據庫名 |
dataHost:
屬性 | 說明 |
---|---|
name | 物理數據庫名,與dataNode中dataHost對應 |
balance | 均衡負載的方式 |
writeType | 寫入方式 |
dbType | 數據庫類型 |
heartbeat | 心跳檢測語句,注意語句結尾的分號要加 |
schema.xml文件中有三點須要注意:balance=「1」,writeType=「0」 ,switchType=「1」 。
schema.xml中的balance的取值決定了負載均衡對非事務內的讀操做的處理。balance 屬性負載均衡類型,目前的取值有 4 種:
writeType 屬性,負載均衡類型,目前的取值有 3 種:
對於事務內的SQL默認走寫節點:
以 /balance/ 開頭,能夠指定SQL使用特定負載均衡方案。例如在大環境開啓讀寫分離的狀況下,特定強一致性的SQL查詢需求;
slaveThreshold:近似的主從延遲時間(秒)Seconds_Behind_Master < slaveThreshold ,讀請求才會分發到該Slave,確保讀到的數據相對較新。schema.xml中的writeType的取值決定了負載均衡對寫操做的處理:
writeType=「0」:全部的寫操做都發送到配置文件中的第一個write host。(第一個write
host故障切換到第二個後,即便以後修復了仍然維持第二個爲寫庫)。推薦取0值,不建議修改.
主從切換(雙主failover):switchType 屬性:
若是細心觀察schem.xml文件的話,會發現有一個參數:switchType,以下配置: <dataHost name="237_15" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"switchType="1" slaveThreshold="100"> 參數解讀 switchType="-1": 不自動切換 switchType="1": 默認值,自動切換 switchType="2": 基於MySQL主從同步的狀態來決定是否切換。需修改heartbeat語句(即心跳語句):show slave status switchType="3": 基於Mysql Galera Cluster(集羣多節點複製)的切換機制。需修改heartbeat語句(即心跳語句):show status like 'wsrep%'
dbType屬性:
dbDriver屬性指定鏈接後端數據庫使用的:
Driver,目前可選的值有native和JDBC。
使用native的話,由於這個值執行的是二進制的mysql協議,因此可使用mysql和maridb。
其餘類型的數據庫則須要使用JDBC驅動來支持。從1.6版本開始支持postgresql的native原始協議。
若是使用JDBC的話須要將符合JDBC 4標準的驅動JAR包放到MYCAT\lib目錄下,並檢查驅動JAR包中包括以下目錄結構的文件:
META-INF\services\java.sql.Driver。在這個文件內寫上具體的Driver類名,例如:com.mysql.jdbc.Driver。
heartbeat標籤:
這個標籤內指明用於和後端數據庫進行心跳檢查的語句。例如,MYSQL可使用select user(),Oracle可使用select 1 from dual等。
這個標籤還有一個connectionInitSql屬性,主要是當使用Oracla數據庫時,須要執行的初始化SQL
語句就這個放到這裏面來。例如:altersession set nls_date_format=‘yyyy-mm-dd hh24:mi:ss’
1.4主從切換的語句必須是:showslave status
writeHost標籤、readHost標籤:
DataHost 節點定義了 MyCat 要鏈接哪一個 MySQL 實例,鏈接的帳號密碼是多少。默認的 MyCat 爲咱們定義了一個名爲 localhost1 的數據服務器(DataHost),它指向了本地(localhost)3306 端口的 MySQL 服務器,對應 MySQL 服務器的帳號是 root,密碼是 123456。
<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"> <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" /> </writeHost> <writeHost host="hostS1" url="localhost:3316" user="root" password="123456" /> </dataHost>
DataNode 節點指定了須要鏈接的具體數據庫名稱,其使用一個 dataHost 屬性指定該數據庫位於哪一個數據庫實例上。默認的 MyCat 爲咱們建立了三個數據節點(DataNode),dn1 數據節點對應 localhost1 數據服務器上的 db1 數據庫,dn2 數據節點對應 localhost1 數據服務器上的 db2 數據庫,dn1 數據節點對應 localhost1 數據服務器上的 db3 數據庫。
<dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost1" database="db2" /> <dataNode name="dn3" dataHost="localhost1" database="db3" />
Schema 節點定義了 MyCat 的全部邏輯數據庫,Table 節點定義了 MyCat 的全部邏輯表。默認的 MyCat 爲咱們定義了一個名爲 TESTDB 的邏輯數據庫,在這個邏輯數據庫下又定義了名爲 travaelrecord、company 等 6 個邏輯表。
<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" /> …… </schema>3、rule.xml
rule.xml 定義了邏輯表使用哪一個字段進行拆分,使用什麼拆分算法進行拆分。rule.xml 中有兩個配置節點,分別是:TableRule 和 Function 配置節點。
TableRule 配置節點定義了邏輯表的拆分信息,例如使用哪一個字段進行拆分,使用什麼拆分算法。默認的 MyCat 爲咱們配置了一個名爲 rule2 的表拆分規則,表示根據 user_id 字段進行拆分,拆分算法是 func1。
<tableRule name="rule2"> <rule> <columns>user_id</columns> <algorithm>func1</algorithm> </rule> </tableRule>
Function 配置節點則定義了具體的拆分算法。例如使用對 1000 取餘的拆分算法,對 100 取餘的拆分算分等等。默認的 MyCat 爲咱們定義了一個名爲 func1 的拆分算法,這個拆分算法定義在 o.mycat.route.function.PartitionByLong 類中,而且還傳入了兩個參數值。
<function name="func1" class="io.mycat.route.function.PartitionByLong"> <property name="partitionCount">8</property> <property name="partitionLength">128</property> </function>應用場景
Mycat讀寫分離(負載均衡)、主從自動切換
主要使用mycay的特性:
大多數讀寫分離的案例是同時支持高可用性的,即Mycat+MySQL主從複製的集羣,並開啓Mycat的讀寫分離功能,這種場景需求下,Mycat是最爲簡單而且功能最爲豐富的一類Proxy,正常狀況下,配置文件也最爲簡單,不用每一個表配置,只須要在schema.xml中的元素上增長dataNode=「defaultDN」屬性,並配置此dataNode對應的真實物理數據庫的database,而後dataHost開啓讀寫分離功能便可。
修改mycat的schema.xml:
僅僅進行讀寫分離的schema.xml配置(備份原來的schema.xml文件,清空,直接複製下面內容):不想要自動切換功能,即MySQL寫節點宕機後不自動切換到備用節點:
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="haha"> </schema> <dataNode name="haha" dataHost="Mycat-node" database="kevin" /> <dataHost name="Mycat-node" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>show slave status</heartbeat> <writeHost host="Mysql-node1" url="192.168.10.205:3306" user="root" password="123456"> <readHost host="Mysql-node2" url="192.168.10.206:3306" user="root" password="123456"> </readHost> </writeHost> </dataHost> </mycat:schema>
實現主從自動切換的schema.xml配置:即MySQL寫節點宕機後自動切換到備用節點(也就是把從機也配置成writeHosts):
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="haha"> </schema> <dataNode name="haha" dataHost="Mycat-node" database="kevin" /> <dataHost name="Mycat-node" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>show slave status</heartbeat> <writeHost host="Mysql-node1" url="192.168.10.205:3306" user="root" password="123456"> <readHost host="Mysql-node2" url="192.168.10.206:3306" user="root" password="123456"> </readHost> </writeHost> <writeHost host="Mysql-node2" url="192.168.10.206:3306" user="root" password="123456"> </writeHost> </dataHost> </mycat:schema>
上面配置中,balance改成1,表示讀寫分離。
以上配置達到的效果就是192.168.10.205爲主庫,192.168.10.206爲從庫。
注意:要保證192.168.10.205和192.168.10.206機器能使用root/123456權限成功登陸mysql數據庫。同時,也必定要受權mycat機器能使用root/123456權限成功登陸這兩臺機器的mysql數據庫!!這很重要,不然會致使登陸mycat後,對庫和表操做失敗!
一主一從結構是最簡單的配置。
MyCat支持雙主多從,若是有N個主,那麼就配置N個writeHost兄弟節點;若是有M個從節點,那麼就配置M個readHost節點便可。
也能夠有多臺MySQL服務器,或者SQL Server、Oracle等,配置多個dataHost節點就能夠。
須要注意的是:
Mycat主從分離只是在讀的時候作了處理,寫入數據的時候,只會寫入到writehost,須要經過mycat的主從複製將數據複製到readhost!這個問題須要弄明白!!
若是沒有提早作mysql主從複製,會發現Mycat讀寫分離配置後,數據寫入writehost後,readhost一直沒有數據!由於Mycat就沒有實現主從複製的功能,畢竟數據庫自己自帶的這個功能纔是最高效穩定的。
特別注意:
1)本案例採用的一主一從模式的兩個mysql實例,而且針對單一的數據庫名進行測試;大多數mycat使用場景都是在多主多從模式並針對多個庫進行的。 2)要想登陸Mycat後看到mysql的真實數據庫的表內容,須要在schema.xml文件中指明database,其中dataNote和dataHost名稱能夠自定義,database名稱要是mysql上的庫名。 3)若是針對的是mysql的多個庫,好比mysql的真實庫名是kevin、grace、shanshan,那麼schema.xml文件裏應該指明多個庫名,如: <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="haha,heihei,hengheng"> </schema> <dataNode name="haha" dataHost="Mycat-node" database="kevin" /> <dataNode name="heihei" dataHost="Mycat-node" database="grace" /> <dataNode name="hengheng" dataHost="Mycat-node" database="shanshan" /> ........ 4)主從自動切換配置後,第一個writeHost故障後,會自動切換到第二個,第二個故障後自動切換到第三個; 若是當是1主3從模式,能夠把第1個從節點配置爲writeHost 2,第2個和第3個從節點則配置爲writeHost 1的readHost;