1. Mycat簡介
- 一個徹底開源的,面向企業應用開發的大數據庫集群
- 支持事務、ACID、可以替代MySQL的加強版數據庫
- 一個可以視為MySQL集群的企業級數據庫,用來替代昂貴的Oracle集群
- 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
- 結合傳統數據庫和新型分布式數據倉庫的新一代企業級數據庫產品
- 一個新穎的數據庫中間件產品
官網:http://www.mycat.org.cn/
2. Mycat優勢
基於阿里開源的Cobar產品而研發,Cobar的穩定性、可靠性、優秀的架構和性能以及眾多成熟的使用案例使得MYCAT一開始就擁有一個很好的起點,站在巨人的肩膀上,我們能看到更遠。業界優秀的開源項目和創新思路被廣泛融入到Mycat的基因中,使Mycat在很多方面都領先於目前其他一些同類的開源項目,甚至超越某些商業產品。
Mycat背后有一支強大的技術團隊,其參與者都是5年以上軟件工程師、架構師、DBA等,優秀的技術團隊保證了Mycat的產品質量。
Mycat並不依托於任何一個商業公司,因此不像某些開源項目,將一些重要的特性封閉在其商業產品中,使得開源項目成了一個擺設。
3. 前期准備
- 安裝Mysql主從復制(請參考以下文檔)
Linux安裝Mysql8.0.20並配置主從復制(一主一從,雙主雙從)
Docker部署Mysql8.0.20並配置主從復制 - 安裝JDK1.8
# yum源安裝
yum search jdk
yum -y install java-1.8.0-openjdk.x86_64
# 查看jsk版本
java -version
- 下載Mycat1.6.7.4安裝包
http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/ - 上傳到服務器/opt目錄下
4. 安裝Mycat
# 進入安裝包所在目錄
cd /opt
# 解壓
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
# 改名(可忽略)
mv mycat/ mycat-1.6.7.4
# 移動到/usr/local目錄
mv mycat-1.6.7.4/ /usr/local/
5. 配置(一主一從)

# 進入配置文件目錄,並查看文件
cd /usr/local/mycat-1.6.7.4/conf
ls
# 修改server.xml
vi server.xml
# 修改底部管理員用戶和只讀用戶信息及密碼,配置schemas
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
<property name="defaultSchema">TESTDB</property>
</user>
# 退出並保存
:wq
# 修改schema.xml
vi schema.xml
# 替換為以下內容
# 其中192.168.133.129為寫主機(主數據庫)IP,192.168.133.130為讀主機(從數據庫)IP。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="host1" database="test" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.133.129:3306" user="root" password="password">
<readHost host="hostS1" url="192.168.133.130:3306" user="root" password="password" />
</writeHost>
</dataHost>
</mycat:schema>
# 退出並保存
:wq
dataHost節點中的balance(負載均衡類型)屬性值共四種情況:
- 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"
所有讀請求隨機的分發到readhost 執行,writerHost不負擔讀壓力。
6. 啟動並測試(一主一從)
# 啟動
cd /usr/local/mycat-1.6.7.4/bin/
./mycat start
# 查看啟動狀態
./mycat status
# 關閉防火牆
# 查看防火牆狀態
systemctl status firewalld
# 關閉防火牆
systemctl stop firewalld
# 使用工具連接
# IP:192.168.133.132
# 端口:8066
# 用戶名:root
# 密碼:123456
# 創建測試表
create table t_data(`id`int not null primary key auto_increment, `value` varchar(255));
# 插入一條記錄
insert into t_data(`value`) values('C3Stones');
# 查詢
select * from t_data;
# 模擬主從數據庫不一致情況,驗證數據庫讀寫分離
# 查詢主從數據庫所在的服務器主機名稱是否一致
hostname
# 若一致,可修改為不同的主機名
# 分別在不同的主機上執行
vi /etc/hostname
# 修改為不同的名稱,並保存
# 例如:Mysql01、Mysql02
# 修改完重啟
reboot
# 重啟之后檢查
# 檢查hostname
hostname
# 檢查mysql服務
mysql -uroot -p
# 啟動mysql
service mysql start
# 關閉防火牆
# 查看防火牆狀態
systemctl status firewalld
# 關閉防火牆
systemctl stop firewalld
# 檢查從數據庫同步狀態
mysql -uroot -p -h192.168.133.130 -P3306
show slave status\G
# 如果參數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則正常
# 使用Mycat插入一條記錄,但使用變量,造成主從數據庫不一致情況
insert into t_data(`value`) values(@@hostname);
# 查詢(查詢結果與上述schema.xml中dataHost節點配置的balance屬性有關)
# 上述配置值為2,即讀操作在主從數據庫上分發
select * from t_data;
7. 配置(雙主雙從)

# 修改schema.xml
vi schema.xml
# 替換為以下內容
# 其中192.168.133.129為寫主機1(主數據庫1)IP,192.168.133.130為讀主機1(從數據庫1)IP,192.168.133.131為寫主機2(主數據庫2)IP,192.168.133.132為讀主機2(從數據庫2)IP。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="host1" database="test" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100" >
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.133.129:3306" user="root" password="password">
<readHost host="hostS1" url="192.168.140.130:3306" user="root" password="password" />
</writeHost>
<writeHost host="hostM2" url="192.168.140.131:3306" user="root" password="password">
<readHost host="hostS2" url="192.168.140.132:3306" user="root" password="password" />
</writeHost>
</mycat:schema>
dataHost節點中的屬性值解釋:
- balance
balance="1",全部的readHost與stand by writeHost參與select語句的負載均衡; - writeType
writeType="0" ,所有寫操作發送到配置的第一個writeHost,第一個掛了切到正常的第二個writeHost;writeType="1",所有寫操作都隨機的發送到配置的 writeHost,1.5版本后不推薦使用。 - writeHost
Mycat重新啟動后以切換后的為准,即可能因為寫主機異常而發送寫主機變動的情況,切換記錄在配置文件中:dnindex.properties。 - switchType
switchType="1",默認值,自動切換;switchType="-1",表示不自動切換;switchType="2",基於Mysql 主從同步的狀態決定是否切換。
8. 啟動並測試(雙主雙從)
# 重新啟動
cd /usr/local/mycat-1.6.7.4/bin/
./mycat restart
# 查看啟動狀態
./mycat status
# 關閉防火牆
# 查看防火牆狀態
systemctl status firewalld
# 關閉防火牆
systemctl stop firewalld
# 使用工具連接
# IP:192.168.133.132
# 端口:8066
# 用戶名:root
# 密碼:123456
# 創建測試表
create table t_data2(`id`int not null primary key auto_increment, `value` varchar(255));
# 插入一條記錄
insert into t_data2(`value`) values('C3Stones');
# 查詢
select * from t_data2;
# 模擬主從數據庫不一致情況,驗證數據庫讀寫分離
# 查詢主從數據庫所在的服務器主機名稱是否一致
hostname
# 若一致,可修改為不同的主機名
# 分別在不同的主機上執行
vi /etc/hostname
# 修改為不同的名稱,並保存
# 例如:Mysql01、Mysql02、Mysql03、Mysql04
# 修改完重啟
reboot
# 重啟之后檢查
# 檢查hostname
hostname
# 檢查mysql服務
mysql -uroot -p
# 啟動mysql
service mysql start
# 關閉防火牆
# 查看防火牆狀態
systemctl status firewalld
# 關閉防火牆
systemctl stop firewalld
# 檢查數據庫同步狀態
mysql -uroot -p -h192.168.133.129 -P3306
show slave status\G
mysql -uroot -p -h192.168.133.130 -P3306
show slave status\G
mysql -uroot -p -h192.168.133.131 -P3306
show slave status\G
mysql -uroot -p -h192.168.133.132 -P3306
show slave status\G
# 如果參數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則正常
# 使用Mycat插入一條記錄,但使用變量,造成主從數據庫不一致情況
insert into t_data2(`value`) values(@@hostname);
# 查詢(查詢結果與上述schema.xml中dataHost節點配置的balance屬性有關)
# 上述配置值為1,即讀操作在主數據庫2、從數據庫1、從數據庫2數據庫上分發
select * from t_data2;
9. 高可用測試(雙主雙從)
# 停止主數據庫1
service mysql stop
# Mycat查詢
select * from t_data2;
# 再次插入數據
insert into t_data2(`value`) values(@@hostname);
# Mycat查詢
select * from t_data2;
# 啟動主數據庫1
service mysql start
# Mycat查詢
# 讀操作在主數據庫1、從數據庫1、從數據庫2數據庫上分發
select * from t_data2;
雙主雙從環境下,Master1、Master2互做備機,負責寫的主機宕機,備機切換負責寫操作,保證了數據庫讀寫分離的高可用性。
