以下是基于 ?Keepalived + VIP? 實現 MySQL 主從復制高可用的詳細步驟,涵蓋主從復制搭建與故障自動切換:
一、MySQL 主從復制搭建(基礎步驟回顧)
1. ?主庫(Master)配置?
修改配置文件? /etc/my.cnf:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=test_db # 指定需要同步的數據庫(可選)
重啟 MySQL:systemctl restart mysqld
創建復制賬號?:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'Repl_Pass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
查看主庫狀態?:
SHOW MASTER STATUS; -- 記錄 File(如 mysql-bin.000001)和 Position(如 154)
2. ?從庫(Slave)配置?
修改配置文件? /etc/my.cnf:
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read_only=1 # 從庫只讀(可選)
重啟 MySQL:systemctl restart mysqld
導入主庫數據?(若主庫已有數據):
# 主庫導出數據
mysqldump -uroot -p --databases test_db > /tmp/backup.sql
# 從庫導入數據
mysql -uroot -p < /tmp/backup.sql
配置主從鏈路?:
CHANGE MASTER TO
MASTER_HOST='主庫IP',
MASTER_USER='repl_user',
MASTER_PASSWORD='Repl_Pass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;START SLAVE;
驗證復制狀態?:
SHOW SLAVE STATUS\G
-- 確保 Slave_IO_Running 和 Slave_SQL_Running 均為 Yes
二、Keepalived + VIP 高可用配置
1. ?環境規劃?
角色? | IP? | VIP? |
---|---|---|
MySQL Master | 192.168.1.10 | 192.168.1.100 |
MySQL Slave | 192.168.1.11 |
2. ?Install Keepalived?
在兩臺 MySQL 節點安裝 Keepalived:
yum install keepalived -y # CentOS
apt install keepalived -y # Ubuntu
3. ?配置 Keepalived?
主庫(Master)配置? /etc/keepalived/keepalived.conf:
global_defs {router_id mysql_ha_master
}vrrp_script chk_mysql {script "/etc/keepalived/check_mysql.sh" # 檢測MySQL是否存活interval 2weight 2
}vrrp_instance VI_1 {state MASTERinterface eth0 # 網卡名稱virtual_router_id 51priority 100 # 主庫優先級高于從庫(如從庫設為90)advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.100/24 # VIP}track_script {chk_mysql # 綁定健康檢查腳本}
}
從庫(Slave)配置? /etc/keepalived/keepalived.conf:
global_defs {router_id mysql_ha_slave
}vrrp_script chk_mysql {script "/etc/keepalived/check_mysql.sh"interval 2weight 2
}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.100/24}track_script {chk_mysql}
}
4. ?編寫 MySQL 健康檢查腳本?
創建 /etc/keepalived/check_mysql.sh(兩節點均需配置):
#!/bin/bash
if ! systemctl is-active mysqld >/dev/null 2>&1; thenexit 1 # MySQL停止,觸發VIP漂移
elseexit 0
fi
賦予執行權限:
chmod +x /etc/keepalived/check_mysql.sh
5. ?啟動 Keepalived?
systemctl start keepalived
systemctl enable keepalived
三、驗證高可用性
1. ?查看 VIP 綁定狀態?
在主庫執行:
ip addr show eth0 | grep 192.168.1.100
應看到 VIP 綁定在主庫的網卡上。
2. ?模擬主庫故障?
停止主庫的 MySQL 服務:
systemctl stop mysqld
觀察 VIP 是否漂移到從庫(約 2~5 秒):
# 在從庫執行
ip addr show eth0 | grep 192.168.1.100
3. ?恢復主庫后 VIP 回切?
重啟主庫的 MySQL 和 Keepalived:
systemctl start mysqld
systemctl restart keepalived
VIP 應自動回到主庫(需確保主庫優先級更高)。
四、注意事項
腦裂問題?:
- 使用 vrrp_script 檢測 MySQL 服務狀態,避免僅依賴網絡存活導致腦裂。
- 可在防火墻中禁止 VRRP 協議的多播包(iptables 或 firewalld 配置)。
主從切換后的處理?:
- 若 VIP 漂移到從庫,需手動或通過腳本執行 STOP SLAVE; 并提升為新的主庫。
- 原主庫恢復后,需重新配置為主從復制中的從庫。
應用連接配置?:
- 應用程序應通過 VIP(192.168.1.100)連接數據庫,而非直接使用物理 IP。
五、方案優缺點
優點? | ? 缺點? |
---|---|
簡單輕量,快速切換(秒級) | 需手動處理主從復制鏈路切換 |
與應用解耦,無需修改應用配置 | 依賴腳本實現故障檢測,可靠性依賴腳本邏輯 |
適合小規模集群 | 不自動處理數據一致性校驗 |