MySQL 主從集群 + mycat 雙節(jié)點 + Keepalived 讀寫分離高可用方案
今天分享一下讀寫分離使用 MyCAT 版本來實現(xiàn) MySQL 主從集群與 MyCAT 雙節(jié)點部署,并結(jié)合 Keepalived 實現(xiàn)高可用的完整解決方案。
一、架構(gòu)設(shè)計
1. 場景說明
在大型業(yè)務系統(tǒng)中,數(shù)據(jù)庫壓力大,為了解決單點瓶頸和讀寫分離問題,采用 MySQL 主從集群和 MyCAT 做數(shù)據(jù)中間層。為保證 MyCAT 層面的高可用,部署兩個 MyCAT 節(jié)點,利用 Keepalived 做 VIP 浮動 IP,保障服務不中斷。
架構(gòu)如下:
二、部署環(huán)境規(guī)劃
主機 IP | 安裝服務 | 角色 |
10.0.0.41 | MySQL 主庫 + MyCAT + Keepalived | 主節(jié)點(MASTER) |
10.0.0.42 | MySQL 從庫 + MyCAT + Keepalived | 備節(jié)點(BACKUP) |
VIP | 10.0.0.100 | 客戶端訪問入口 |
mysql集群已經(jīng)部署完成。
三、MyCAT 雙節(jié)點部署
1. 安裝 MyCAT
兩個節(jié)點都需要部署mycat,部署過程一樣。
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 個主要文件:
- server.xml — 配置 MyCAT 相關(guān)服務
- schema.xml — 配置數(shù)據(jù)庫連接、讀寫分離
- rule.xml — 配置分庫分表規(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>
客戶端通過 MyCAT 連接時,使用 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/">
<!-- 定義邏輯庫 -->
<schema name="testdb" checkSQLschema="false" sqlMaxLimit="100">
<table name="*" dataNode="dn1" />
</schema>
<!-- 數(shù)據(jù)節(jié)點配置 -->
<dataNode name="dn1" dataHost="localhost" database="testdb" />
<!-- 主從數(shù)據(jù)庫節(jié)點配置 -->
<dataHost name="localhost" maxCnotallow="1000" minCnotallow="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select 1</heartbeat>
<!-- 主庫 -->
<writeHost host="hostM1" url="10.0.0.41:3306" user="root" password="123456">
<!-- 從庫 -->
<readHost host="hostS1" url="10.0.0.42:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
關(guān)鍵配置說明
配置項 | 說明 |
| 配置讀寫分離,讀操作自動分發(fā)到從庫 |
| 只允許向主庫寫入數(shù)據(jù) |
| 主庫配置 |
| 從庫配置 |
(3) 啟動 MyCAT
cd /usr/local/mycat/bin
./mycat start
(4) 查看 MyCAT 日志
tail -f /usr/local/mycat/logs/wrapper.log
(5) 查看狀態(tài)
mycat status
兩個節(jié)點配置完mycat后,接下來配置keepalived。
四、配置 Keepalived 高可用
1. 安裝 Keepalived
yum install keepalived -y
2. 配置 Keepalived
(1) 主節(jié)點 /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é)點 /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. 啟動 Keepalived 服務
# 啟動keepalived并設(shè)置開機自啟動
systemctl enable --now keepalived
五、客戶端訪問
客戶端或應用通過 VIP(10.0.0.100)和端口 8066 訪問:
mysql -h 10.0.0.100 -P 8066 -uroot -p123456
高可用實現(xiàn):
- 默認情況下,VIP 在主節(jié)點上,MyCAT 監(jiān)聽 8066 端口
- 如果主節(jié)點的 MyCAT 異常,VIP 會自動漂移到備節(jié)點