生產環境對 MySQL 高可用與讀寫分離需求日益增長。本文詳細記錄 Keepalived(VIP 漂移與健康檢查) + HAProxy(四層負載均衡) 搭建 MySQL Cluster 高可用架構的完整配置流程,含腳本化故障切換邏輯。
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight -2
}
vrrp_instance VI_1 {
interface eth1
state MASTER
virtual_router_id 51
priority 101
nopreempt
debug
virtual_ipaddress {
10.1.6.173
}
track_script {
chk_haproxy
}
notify_master /etc/keepalived/scripts/start_haproxy.sh
notify_fault /etc/keepalived/scripts/stop_keepalived.sh
notify_stop /etc/keepalived/scripts/stop_haproxy.sh
}
| 參數 | 說明 |
|---|---|
| state | 初始狀態,實際以 priority 競選決定 |
| priority | 優先級,數值大者成為 MASTER |
| nopreempt | 非搶佔模式,避免頻繁切換 |
| track_script | 引用 vrrp_script,檢查失敗自動降低 priority |
| notify_* | 狀態變更觸發腳本,實現業務邏輯聯動 |
# start_haproxy.sh - 成為 MASTER 時啟動 HAProxy
#!/bin/bash
sleep 5
get=$(ip addr | grep 10.1.6.173 | wc -l)
if [ $get -eq 1 ]; then
echo "$(date) success to get vip" >> /etc/keepalived/scripts/start_ha.log
/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg
else
echo "$(date) can not get vip" >> /etc/keepalived/scripts/start_ha.log
fi
# stop_haproxy.sh - 停止 HAProxy
#!/bin/bash
pid=$(pidof haproxy)
echo "$(date) stop haproxy" >> /etc/keepalived/scripts/stop_ha.log
kill -9 $pid
# stop_keepalived.sh - 故障時停止 Keepalived
#!/bin/bash
pid=$(pidof keepalived)
if [ -z "$pid" ]; then
echo "$(date) no keepalived process" >> /etc/keepalived/scripts/stop_keep.log
else
echo "$(date) will stop keepalived" >> /etc/keepalived/scripts/stop_keep.log
/etc/init.d/keepalived stop
fi
state BACKUPpriority 100(略低於 Master)weight 2(檢查通過時增加優先級)wget https://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.22.tar.gz tar xvfz haproxy-1.4.22.tar.gz cd haproxy-1.4.22 make TARGET=linux26 && make install
global
maxconn 51200
daemon
nbproc 1
pidfile /etc/haproxy/haproxy.pid
defaults
mode tcp
option redispatch
option abortonclose
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
balance roundrobin
listen proxy
bind 10.1.6.173:3366
mode tcp
option httpchk
server db1 10.1.6.203:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3
server db2 10.1.6.205:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3
listen haproxy_stats
bind 10.1.6.173:8888
mode http
option httplog
stats refresh 5s
stats uri /status
stats realm Haproxy Manager
stats auth admin:password
check port 9222:使用自定義端口檢查 MySQL 存活(非 3306,避免誤判)inter 12000:檢查間隔 12 秒rise 3 / fall 3:連續 3 次成功/失敗才判定上線/下線apt-get install xinetd
service mysqlchk
{
flags = REUSE
socket_type = stream
port = 9222
wait = no
user = nobody
server = /opt/mysqlchk
log_on_failure += USERID
disable = no
bind = 10.1.6.173
}
mysqlchk 9222/tcp
#!/bin/bash MYSQL_HOST="localhost" MYSQL_SOCKET="/var/run/mysqld/mysqld.sock" MYSQL_USERNAME="mysqlchkusr" MYSQL_PASSWORD="secret" MYSQL_BIN="/opt/mysqlcluster/bin/mysql" CHECK_QUERY="select 1" # 返回 HTTP 200 表示健康,503 表示異常 # 供 HAProxy httpchk 使用 ...
ip addr | grep 10.1.6.173
netstat -tunlp | grep haproxy # 應見 10.1.6.173:3366 (MySQL) 和 10.1.6.173:8888 (Stats)
mysql -udave -p -h 10.1.6.173 -P 3366
注意:MySQL 帳號需授權三個 IP:203、205、173 (VIP)。
https://10.1.6.173:8888/status 查看節點健康狀態nbproc 多進程模式提升並發能力timeout 參數適配業務延遲容忍度vrrp_script 監控 MySQL 進程、磁碟空間、主從延遲Keepalived + HAProxy 方案架構清晰、元件輕量、成熟穩定,是中小型 MySQL 高可用架構的首選組合。關鍵在於健康檢查腳本的可靠性與狀態切換邏輯的完備性,建議在上線前完成完整的故障注入測試。