說明:
MyCAT 是使用 JAVA 語言進行編寫開發,使用前需要先安裝 JAVA 運行環境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必須在 JDK7 以上的版本上運行。
1. jdk1.8安裝
詳見jdk環境安裝
2. Mysql安裝
詳見mysql8.0.11源碼安裝,實際使用的是mysql8.0.16
3. Mysql 主從配置
詳見主從同步原理和mysql的主從同步詳解
3.1 安裝mycat服務
3.1.1 部署mycat
cd /root
wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
tar -xf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /usr/local
cd /usr/local/mycat/conf
- /usr/local/mycat/conf/server.xml:定義用戶以及系統相關變量,如端口等。其中用戶信息是前端應用程序連接 mycat 的用戶信息。
- /usr/local/mycat/conf/schema.xml:定義邏輯庫,表、分片節點等內容。
- /usr/local/mycat/conf/rule.xml:定義分片規則
3.1.2 server.xml配置文件
server.xml文件跟讀寫分離策略關系不大,但是需要用此文件來配置連接MyCat的用戶及權限等(關注user標簽即可),因此在這里簡單說明。
<user name="mycat" defaultAccount="true"> #通過mycat登錄的用戶名和密碼<property name="password">123456</property><property name="schemas">mycatDB</property> <!-- #邏輯庫,真實不存在的庫,可以自定義修改,但一定要對應上,要不然就會報錯 --><property name="defaultSchema">mycatDB</property> <!-- #邏輯庫,真實不存在的庫,可以自定義修改 --><!-- 表級 DML 權限設置 --><!-- <privileges check="false"><schema name="TESTDB" dml="0110" > #0000分表表示數據庫的增刪改查,0比表示關閉,1表示打開,如果配置 name需和前面定義的一致<table name="tb01" dml="0000"></table> #0000分表表示數據表的增刪改查,0比表示關閉,1表示打開<table name="tb02" dml="1111"></table></schema></privileges> --></user><user name="user"> <!-- 這個賬號只能讀不能寫,見下面的定義readOnly --><property name="password">user</property><property name="schemas">mycatDB</property><property name="readOnly">true</property><property name="defaultSchema">mycatDB</property>
</user>
說明:
- server.xml文件里登錄mycat的用戶名和密碼可以任意定義,這個賬號和密碼是為客戶機登錄mycat時使用的賬號信息。
- 邏輯庫名(如上面的mycatDB,也就是登錄mycat后顯示的庫名,切換這個庫之后,顯示的就是代理的真實mysql數據庫的表)要在schema.xml里面也定義,否則會導致mycat服務啟動失敗!
- 這里只定義了一個標簽,所以把多余的都注釋了。如果定義多個標簽,即設置多個連接mycat的用戶名和密碼,那么就需要在schema.xml文件中定義多個對應的庫!
3.1.3 schema.xml配置文件
schema.xml是最主要的配置項,此文件關聯mysql讀寫分離策略!讀寫分離、分庫分表策略、分片節點都是在此文件中配置的!MyCat作為中間件,它只是一個代理,本身并不進行數據存儲,需要連接后端的MySQL物理服務器,此文件就是用來連接MySQL服務器的!
schema.xml文件分為三部分,分別時schema、dataNode、dataHost
- schema
<schema name="mycatDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"> <!-- 其中name要和server.xml中定義的邏輯看必須一致;checkSQLschema 表示是否檢測語法,一般不需要,因為要連接多個數據庫,語法不一樣;sqlMaxLimit 每個sql語句最多返回100條--><!-- 如果不進行分庫分表,下面的配置可以不用管,注釋即可 --><!-- auto sharding by id (long) --><!--splitTableNames 啟用<table name 屬性使用逗號分割配置多個表,即多個表使用這個配置--><!-- <table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/> --><!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"/> -->
</schema>
- dataNode
<!-- dataNode用于配置物理數據庫的名稱,name可以自定義;dataHost自定義,但是需要和后面的dataHost有對應關系;database是真實存在的庫 -->
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> -->
- dataHost
<!-- dataHost 是用于配置讀寫分離的,name 自定義,但需要和dataNode中的dataHost完全一致;maxCon和minCon 表示最大最小連接數量;balance表示負載均衡策略;writeType已廢棄,無需關注;dbType是mycat連接數據庫的類型;dbDriver指數據庫的驅動類型(如果dbType配的是Oracle,dbDriver則是jdbc);switchType 配置故障切換類型,需要配合下面的心跳機制heartbeat;slaveThreshold 指的是從節點的數量--><dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat> <!-- 心跳sql語句,需要配置故障切換類型 --><!-- can have multi write hosts --><!-- 寫節點的配置:host 自定義即可;url 數據庫的url連接地址;user 和 password指訪問這個庫的用戶名和密碼;如果是一主一從就配置一個writeHost和一個readHost,一主多從>就配置一個writeHost和多個readHost,多主多從就配置多個writeHost和多個readHost --><writeHost host="hostM1" url="localhost:3306" user="root"password="123456"><!-- can have multi read hosts --><!-- 讀節點的配置: host 自定義即可;url 數據庫的url連接地址;user 和 password指訪問這個庫的用戶名和密碼 --><readHost host="hostS1" url="localhost:3316" user="root" password="123456" /></writeHost><!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
3.1.4 標簽屬性
Balance屬性
- balance=“0”:不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost 上,即讀請求僅發送到writeHost上。
- balance=“1”:
讀請求隨機分發到當前writeHost對應的readHost和standby的writeHost上。即全部的readHost與stand
by writeHost 參與select 語句的負載均衡,簡單的說,當雙主雙從模式(M1 ->S1 , M2->S2,并且 M1 與
M2 互為主備),正常情況下,M2,S1,S2 都參與 select 語句的負載均衡
balance=“2”:讀請求隨機分發到當前dataHost內所有的writeHost和readHost上。即所有讀操作都隨機的在writeHost、
readhost 上分發。 - balance=“3”:讀請求隨機分發到當前writeHost對應的readHost上。即所有讀請求隨機的分發到 wiriterHost
對應的 readhost 執行,writerHost 不負擔讀壓力,注意 balance=3 只在 1.4 及其以后版本有,1.3 沒有。
writeType屬性(已廢棄,直接跳過)
- writeType=“0”:所有寫操作發送到配置的第一個
writeHost,第一個掛了切到還生存的第二個writeHost,重新啟動后以切換后的為準,切換記錄在配置文件中:dnindex.properties
. - writeType=“1”:所有寫操作都隨機的發送到配置的writeHost。
- writeType=“2”:沒實現。
switchType 屬性,主從切換(雙主failover)
- switchType=“-1”:不自動切換
- switchType=“1”:默認值,自動切換
- switchType=“2”:基于MySQL主從同步的狀態來決定是否切換。需修改heartbeat語句(即心跳語句):show slave status
- switchType=“3”:基于Mysql Galera
Cluster(集群多節點復制)的切換機制。需修改heartbeat語句(即心跳語句):show status like ‘wsrep%’
dbType屬性
指定后端連接的數據庫類型,目前支持二進制的mysql協議,還有其他使用JDBC連接的數據庫。例如:mongodb、oracle、spark等。
dbDriver屬性
指定連接后端數據庫使用的Driver,目前可選的值有native和JDBC。
- native
使用native的話,因為這個值執行的是二進制的mysql協議,所以可以使用mysql和maridb。 - JDBC
其他類型的數據庫則需要使用JDBC驅動來支持。從1.6版本開始支持postgresql的native原始協議。
如果使用JDBC的話需要將符合JDBC 4標準的驅動JAR包放到MYCAT\lib目錄下,并檢查驅動JAR包中包括如下目錄結構的文件:META-INF\services\java.sql.Driver。在這個文件內寫上具體的Driver類名,例如:com.mysql.jdbc.Driver。
3.1.5 讀寫分離配置
cat server.xml
...
...
...<user name="mycat" defaultAccount="true"><property name="password">mycat123</property><property name="schemas">mycatDB</property><property name="defaultSchema">mycatDB</property></user>
...
...
...
cat schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="mycatDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema><dataNode name="dn1" dataHost="localhost1" database="external_service" /><dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>show slave status</heartbeat><writeHost host="hostM1" url="10.99.200.110:3306" user="dba" password="dba110"><readHost host="hostS1" url="10.99.200.111:3306" user="dba" password="dba111" /></writeHost></dataHost>
</mycat:schema>
3.1.6 啟動服務
修改mycat的啟動內存(/usr/local/mycat/conf/wrapper.conf)
啟動方式
cd /usr/local/mycat/bin
./mycat console|stop|start|restart|dump #前臺啟動|停止|后臺啟動|導入
登錄驗證
主從同步ok
手動使得主從的數據不一致
驗證讀寫分離
讀的是從節點的數據