MySQL 主從集群 + mycat 雙節(jié)點(diǎn) + Keepalived 讀寫分離高可用方案
今天分享一下讀寫分離使用 MyCAT 版本來(lái)實(shí)現(xiàn) MySQL 主從集群與 MyCAT 雙節(jié)點(diǎn)部署,并結(jié)合 Keepalived 實(shí)現(xiàn)高可用的完整解決方案。
一、架構(gòu)設(shè)計(jì)
1. 場(chǎng)景說(shuō)明
在大型業(yè)務(wù)系統(tǒng)中,數(shù)據(jù)庫(kù)壓力大,為了解決單點(diǎn)瓶頸和讀寫分離問(wèn)題,采用 MySQL 主從集群和 MyCAT 做數(shù)據(jù)中間層。為保證 MyCAT 層面的高可用,部署兩個(gè) MyCAT 節(jié)點(diǎn),利用 Keepalived 做 VIP 浮動(dòng) IP,保障服務(wù)不中斷。
架構(gòu)如下:
二、部署環(huán)境規(guī)劃
主機(jī) IP | 安裝服務(wù) | 角色 |
10.0.0.41 | MySQL 主庫(kù) + MyCAT + Keepalived | 主節(jié)點(diǎn)(MASTER) |
10.0.0.42 | MySQL 從庫(kù) + MyCAT + Keepalived | 備節(jié)點(diǎn)(BACKUP) |
VIP | 10.0.0.100 | 客戶端訪問(wèn)入口 |
mysql集群已經(jīng)部署完成。
三、MyCAT 雙節(jié)點(diǎn)部署
1. 安裝 MyCAT
兩個(gè)節(jié)點(diǎn)都需要部署mycat,部署過(guò)程一樣。
mycat官網(wǎng):https://github.com/MyCATApache/Mycat-Server
(1) 安裝java
yum install -y java
(2) 下載并解壓 MyCAT
# 下載mycat
wget https://github.com/MyCATApache/Mycat-Server/releases/download/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
tar -xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
# 解壓好的文件遷移到/usr/local
mv mycat /usr/local/mycat
(3) 創(chuàng)建 MyCAT 用戶
useradd mycat
chown -R mycat:mycat /usr/local/mycat
(4) 配置環(huán)境變量
vi /etc/profile
# 在尾部添加
export PATH=/usr/local/mycat/bin:$PATH
# 立即生效
source /etc/profile
2. 配置 MyCAT
配置文件路徑:/usr/local/mycat/conf/涉及 3 個(gè)主要文件:
- server.xml — 配置 MyCAT 相關(guān)服務(wù)
- schema.xml — 配置數(shù)據(jù)庫(kù)連接、讀寫分離
- rule.xml — 配置分庫(kù)分表規(guī)則(此方案中不涉及)
(1) server.xml 配置
路徑:/usr/local/mycat/conf/server.xml
<?xml versinotallow="1.0" encoding="UTF-8"?>
<mycat:server xmlns:mycat="http://mycat.io/">
<user name="root">
<property name="password">123456</property>
<property name="schemas">testdb</property>
</user>
</mycat:server>
客戶端通過(guò) MyCAT 連接時(shí),使用 root/123456 登錄。
(2) schema.xml 配置
路徑:/usr/local/mycat/conf/schema.xml
<?xml versinotallow="1.0" encoding="UTF-8"?>
<mycat:schema xmlns:mycat="http://mycat.io/">
<!-- 定義邏輯庫(kù) -->
<schema name="testdb" checkSQLschema="false" sqlMaxLimit="100">
<table name="*" dataNode="dn1" />
</schema>
<!-- 數(shù)據(jù)節(jié)點(diǎn)配置 -->
<dataNode name="dn1" dataHost="localhost" database="testdb" />
<!-- 主從數(shù)據(jù)庫(kù)節(jié)點(diǎn)配置 -->
<dataHost name="localhost" maxCnotallow="1000" minCnotallow="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select 1</heartbeat>
<!-- 主庫(kù) -->
<writeHost host="hostM1" url="10.0.0.41:3306" user="root" password="123456">
<!-- 從庫(kù) -->
<readHost host="hostS1" url="10.0.0.42:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
關(guān)鍵配置說(shuō)明
配置項(xiàng) | 說(shuō)明 |
| 配置讀寫分離,讀操作自動(dòng)分發(fā)到從庫(kù) |
| 只允許向主庫(kù)寫入數(shù)據(jù) |
| 主庫(kù)配置 |
| 從庫(kù)配置 |
(3) 啟動(dòng) MyCAT
cd /usr/local/mycat/bin
./mycat start
(4) 查看 MyCAT 日志
tail -f /usr/local/mycat/logs/wrapper.log
(5) 查看狀態(tài)
mycat status
兩個(gè)節(jié)點(diǎn)配置完mycat后,接下來(lái)配置keepalived。
四、配置 Keepalived 高可用
1. 安裝 Keepalived
yum install keepalived -y
2. 配置 Keepalived
(1) 主節(jié)點(diǎn) /etc/keepalived/keepalived.conf
global_defs {
router_id MyCAT_1
}
vrrp_script chk_mycat {
script "/usr/local/mycat/bin/check_mycat.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface ens33 # 確保網(wǎng)卡名正確
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100
}
track_script {
chk_mycat
}
}
(2) 備節(jié)點(diǎn) /etc/keepalived/keepalived.conf
global_defs {
router_id MyCAT_2
}
vrrp_script chk_mycat {
script "/usr/local/mycat/bin/check_mycat.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100
}
track_script {
chk_mycat
}
}
(3) 健康檢查腳本
vi /usr/local/mycat/bin/check_mycat.sh
#!/bin/bash
MYCAT_PORT=8066
if ! netstat -ntlp | grep $MYCAT_PORT > /dev/null
then
echo "MyCAT is down, stopping keepalived"
systemctl stop keepalived
fi
(4) 授權(quán)執(zhí)行權(quán)限
chmod +x /usr/local/mycat/bin/check_mycat.sh
3. 啟動(dòng) Keepalived 服務(wù)
# 啟動(dòng)keepalived并設(shè)置開(kāi)機(jī)自啟動(dòng)
systemctl enable --now keepalived
五、客戶端訪問(wèn)
客戶端或應(yīng)用通過(guò) VIP(10.0.0.100)和端口 8066 訪問(wèn):
mysql -h 10.0.0.100 -P 8066 -uroot -p123456
高可用實(shí)現(xiàn):
- 默認(rèn)情況下,VIP 在主節(jié)點(diǎn)上,MyCAT 監(jiān)聽(tīng) 8066 端口
- 如果主節(jié)點(diǎn)的 MyCAT 異常,VIP 會(huì)自動(dòng)漂移到備節(jié)點(diǎn)