本文詳細記錄基於 LVS(IPVS)+ Keepalived + MySQL 主從復制的高可用負載均衡集群搭建全過程,採用 DR(直接路由)模式實現讀寫分離與故障自動切換,包含架構設計、IPVS 內核模塊驗證、Keepalived 雙主熱備配置、VIP 漂移驗證、TCP CHECK 健康檢查、故障注入測試及核心問題排查,為生產環境讀密集型業務提供可落地的部署方案。
10.24.6.5:3306(寫入節點)10.24.6.6:3306(讀取節點,同步 Master 數據)10.24.6.410.24.6.710.24.6.2:3306(對外統一訪問入口)
bind-address 限制: 注釋 /etc/mysql/my.cnf 中 bind-address = 127.0.0.1,否則 VIP 無法訪問。/sbin/iptables -F(或精確放行 3306、VRRP 協議、Keepalived 端口)。sudo /etc/init.d/networking restart 確保 VIP 綁定生效。# 檢查 ipvsadm 是否安裝 ipvsadm # 未安裝提示: bash: /sbin/ipvsadm: No such file or directory # 安裝 apt-get install ipvsadm # 驗證安裝成功 ipvsadm # 輸出: IP Virtual Server version 1.2.1 (size=4096)... # 檢查內核模塊加載 modprobe -l | grep ipvs # 或 lsmod | grep ip_vs
Ubuntu 9.10+ (內核 2.6+) 無需編譯內核,安裝 ipvsadm 即可自動加載模塊。
apt-get install keepalived
/etc/keepalived/keepalived.confglobal_defs {
router_id HaMySQL_1
}
vrrp_instance VI_MYSQL {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.24.6.2
}
}
virtual_server 10.24.6.2 3306 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 10.24.6.5 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
real_server 10.24.6.6 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
vrrp_instance VI_MYSQL {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
# 其他完全相同...
}
| 參數 | 含義 |
|---|---|
lb_algo wrr | 加權輪詢調度算法 |
lb_kind DR | 直接路由模式(高性能,需 Real Server 配置 VIP 隧道/arp_ignore) |
persistence_timeout 60 | 會話保持 60 秒(同一客戶端 60 秒內固定後端) |
TCP_CHECK | TCP 端口健康檢查(3 秒超時、3 次重試、3 秒間隔) |
virtual_router_id 51 | VRRP 組 ID,主備必須一致 |
priority | 優先級,數值大者為 Master |
/usr/local/keepalived/sbin/keepalived -D
查看進程:應有 3 個 keepalived 進程(父進程、VRRP 子進程、健康檢查子進程)。
tail -f /var/log/syslog (Ubuntu)關注 VRRP 狀態轉換、VIP 綁定、健康檢查結果。
# Master 應顯示 VIP ip addr show eth0 # 輸出包含: inet 10.24.6.2/32 scope global eth0 # Backup 暫不綁定 VIP ip addr show eth0 # 無 10.24.6.2
⚠️ ifconfig **無法顯示 VIP**,必須用 ip addr。
ipvsadm -Ln # Master 輸出: # TCP 10.24.6.2:3306 wrr persistent 60 # -> 10.24.6.5:3306 Route 3 0 0 # -> 10.24.6.6:3306 Route 3 0 0 # Backup 應無規則(或為備用同步)
分別連接 10.24.6.5:3306 和 10.24.6.6:3306,驗證主從復制正常。
mysql -h 10.24.6.2 -u user -p # 多次連接觀察是否輪詢分發到 10.24.6.5 和 10.24.6.6
直連 Real IP (10.24.6.5:3306) 正常,但連 VIP (10.24.6.2:3306) 報錯 ERROR 111: Can't connect to MySQL server。
tcpdump -i eth0 host 10.24.6.2 and port 3306 # 發現: SYN -> SYN/ACK -> RST (重置連接) # 說明 3306 端口有進程監聽並響應,但主動發送 RST 拒絕連接
結合 MySQL 錯誤碼 111,**確認為 MySQL 服務端主動拒絕連接**。查閱資料發現:MySQL 默認綁定 bind-address = 127.0.0.1,導致非本地 IP(含 VIP)連接被拒。
修改兩台 MySQL 服務器 /etc/mysql/my.cnf:
[mysqld] # bind-address = 127.0.0.1 # 註釋掉或改為 0.0.0.0 bind-address = 0.0.0.0
重啟 MySQL:service mysql restart。
再次連接 VIP,連接成功,負載均衡生效。
arp_ignore=1, arp_announce=2 或配置 VIP 隧道)。arp_ignore/arp_announce 內核參數解決 DR 模式 ARP 衝突Seconds_Behind_Master、Slave_IO_Running/Slave_SQL_RunningMISC_CHECK 執行自定義腳本驗證主從同步狀態notify_master/notify_backup 腳本觸發業務感知此架構適合讀多寫少、對高可用性要求高、可接受最終一致性的互聯網業務場景。