首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Keepalived + HAProxy 打造 MySQL 高可用負載均衡叢集

     編輯:MySQL 綜合教學

Keepalived + HAProxy 打造 MySQL 高可用負載均衡叢集

生產環境對 MySQL 高可用與讀寫分離需求日益增長。本文詳細記錄 Keepalived(VIP 漂移與健康檢查) + HAProxy(四層負載均衡) 搭建 MySQL Cluster 高可用架構的完整配置流程,含腳本化故障切換邏輯。

一、架構拓撲

  • MySQL Cluster 節點:10.1.6.203 (Master)、10.1.6.205 (Backup)
  • VIP:10.1.6.173,對外服務端口 3366
  • HAProxy 監聽:VIP:3366 → 輪詢轉發至 203:3306、205:3306
  • Keepalived 監控:雙機熱備,Master 持有 VIP,故障自動漂移至 Backup

二、Keepalived 配置詳解

1. 核心組件說明

  • 父進程:記憶體管理、子進程監控
  • VRRP 子進程:實現虛擬路由器冗餘協議,處理 VIP 漂移
  • Healthcheck 子進程:執行健康檢查腳本,支援 L3/L4/L5 多層檢測

2. Master 節點配置

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
}

3. 關鍵參數解析

參數說明
state初始狀態,實際以 priority 競選決定
priority優先級,數值大者成為 MASTER
nopreempt非搶佔模式,避免頻繁切換
track_script引用 vrrp_script,檢查失敗自動降低 priority
notify_*狀態變更觸發腳本,實現業務邏輯聯動

4. 狀態切換腳本

# 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

5. Backup 節點配置差異

  • state BACKUP
  • priority 100(略低於 Master)
  • weight 2(檢查通過時增加優先級)

三、HAProxy 配置詳解

1. 安裝與編譯

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

2. 核心配置 /etc/haproxy/haproxy.cfg

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

3. 關鍵健康檢查參數

  • check port 9222:使用自定義端口檢查 MySQL 存活(非 3306,避免誤判)
  • inter 12000:檢查間隔 12 秒
  • rise 3 / fall 3:連續 3 次成功/失敗才判定上線/下線

四、MySQL 健康檢查機制(xinetd + mysqlchk)

1. 安裝 xinetd

apt-get install xinetd

2. 定義服務 /etc/xinetd.d/mysqlchk

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
}

3. 註冊端口 /etc/services

mysqlchk 9222/tcp

4. 檢查腳本 /opt/mysqlchk

#!/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 使用
...

五、驗證與測試

1. 檢查 VIP 掛載

ip addr | grep 10.1.6.173

2. 檢查 HAProxy 監聽

netstat -tunlp | grep haproxy
# 應見 10.1.6.173:3366 (MySQL) 和 10.1.6.173:8888 (Stats)

3. 測試連線

mysql -udave -p -h 10.1.6.173 -P 3366

注意:MySQL 帳號需授權三個 IP:203、205、173 (VIP)。

4. 故障演練

  • 手動停止 Master MySQL → VIP 漂移至 Backup,連線不中斷
  • 停止 HAProxy → Keepalived 偵測腳本失敗,觸發切換
  • 訪問 https://10.1.6.173:8888/status 查看節點健康狀態

六、生產環境優化建議

  • HAProxy 啟用 nbproc 多進程模式提升並發能力
  • 調整 timeout 參數適配業務延遲容忍度
  • Stats 頁面啟用 HTTPS 與強密碼,限制來源 IP
  • Keepalived 增加 vrrp_script 監控 MySQL 進程、磁碟空間、主從延遲
  • 配合 MHA/Orchestrator 實現主庫自動故障轉移

Keepalived + HAProxy 方案架構清晰、元件輕量、成熟穩定,是中小型 MySQL 高可用架構的首選組合。關鍵在於健康檢查腳本的可靠性與狀態切換邏輯的完備性,建議在上線前完成完整的故障注入測試。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved