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

HAProxy + Keepalived + MyCat 高可用架構部署實戰:從安裝配置到故障切換驗證

     編輯:MySQL 綜合教學

架構總覽

                                    +------------------+
                                    |   Client App     |
                                    +--------+---------+
                                             |
                                             v
                                    +--------+---------+
                                    |   Keepalived     |  VIP: 192.168.57.180
                                    |  (Master/Backup) |
                                    +--------+---------+
                                             |
                    +------------------------+------------------------+
                    |                        |                        |
                    v                        v                        v
           +--------+--------+       +--------+--------+       +--------+--------+
           |   HAProxy 1     |       |   HAProxy 2     |       |   HAProxy N     |
           | 192.168.57.181  |       | 192.168.57.179  |       |      ...        |
           +--------+--------+       +--------+--------+       +--------+--------+
                    |                        |                        |
                    +------------------------+------------------------+
                                             |
                    +------------------------+------------------------+
                    |                        |                        |
                    v                        v                        v
           +--------+--------+       +--------+--------+       +--------+--------+
           |    MyCat 1      |       |    MyCat 2      |       |    MyCat N      |
           | 192.168.57.181  |       | 192.168.57.179  |       |      ...        |
           |   Port 8066     |       |   Port 8066     |       |   Port 8066     |
           +--------+--------+       +--------+--------+       +--------+--------+
                    |                        |                        |
                    +------------------------+------------------------+
                                             |
                    +------------------------+------------------------+
                    |                        |                        |
                    v                        v                        v
           +--------+--------+       +--------+--------+       +--------+--------+
           |  MySQL Shard 1  |       |  MySQL Shard 2  |       |  MySQL Shard N  |
           |   (Master/Slave) |       |   (Master/Slave) |       |   (Master/Slave) |
           +-----------------+       +-----------------+       +-----------------+

一、HAProxy 部署與配置 (雙節點 181/179)

1. 編譯安裝

global
    log 127.0.0.1 local0
    maxconn 4096
    chroot /usr/local/haproxy
    user haproxy
    group haproxy
    daemon
    pidfile /var/run/haproxy.pid

defaults
    log global
    option dontlognull
    retries 3
    option redispatch
    maxconn 2000
    timeout connect 5s
    timeout client 30s
    timeout server 30s

# 統計頁面 (VIP:48800)
listen admin_stats
    bind 192.168.57.180:48800
    mode http
    option httplog
    stats enable
    stats uri /admin-status
    stats auth admin:AdminPass123!
    stats refresh 30s

# MyCat 負載均衡 (VIP:8098)
listen mycat_cluster
    bind 192.168.57.180:8098
    mode tcp
    option tcplog
    option tcp-check
    balance roundrobin
    default-server inter 5s rise 2 fall 3
    server mycat_181 192.168.57.181:8066 check port 48700
    server mycat_179 192.168.57.179:8066 check port 48700
    timeout server 20s

3. 日誌配置 (rsyslog)

## 安裝 xinetd
yum install -y xinetd

## /etc/xinetd.d/mycat_status
service mycat_status
{
    flags = REUSE
    socket_type = stream
    port = 48700
    wait = no
    user = nobody
    server = /usr/local/bin/mycat_status
    log_on_failure += USERID
    disable = no
}

## /usr/local/bin/mycat_status
#!/bin/bash
MYCAT_STATUS=$(/usr/local/mycat/bin/mycat status 2>/dev/null | grep -c 'running')
if [ $MYCAT_STATUS -eq 1 ]; then
    echo -e "HTTP/1.1 200 OK\r\n"
    exit 0
else
    echo -e "HTTP/1.1 503 Service Unavailable\r\n"
    exit 1
fi

## 權限與服務
chmod 755 /usr/local/bin/mycat_status
echo "mycat_status 48700/tcp" >> /etc/services
systemctl restart xinetd && systemctl enable xinetd

5. HAProxy 管理腳本


二、Keepalived 部署與配置 (雙節點 181/179)

1. 安裝 (源碼編譯)

global_defs {
    router_id LVS_MASTER_181
    script_user root
    enable_script_security
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/scripts/check_haproxy.sh"
    interval 2
    weight 2
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.57.180/24 dev eth0 label eth0:VIP
    }
    track_script {
        chk_haproxy
    }
    notify_master "/etc/keepalived/scripts/notify_master.sh"
    notify_backup "/etc/keepalived/scripts/notify_backup.sh"
    notify_fault "/etc/keepalived/scripts/notify_fault.sh"
    notify_stop "/etc/keepalived/scripts/notify_stop.sh"
}

3. Backup 節點配置 (192.168.57.179) - 差異點

## /etc/keepalived/scripts/check_haproxy.sh
#!/bin/bash
if ! pidof haproxy >/dev/null; then
    systemctl start haproxy  # 或 /usr/local/haproxy/sbin/start
    sleep 2
fi
if ! pidof haproxy >/dev/null; then
    exit 1
fi
exit 0

## /etc/keepalived/scripts/notify_master.sh
#!/bin/bash
systemctl restart haproxy
logger "Keepalived: Became MASTER, HAProxy restarted"

## /etc/keepalived/scripts/notify_backup.sh
#!/bin/bash
systemctl restart haproxy
logger "Keepalived: Became BACKUP, HAProxy restarted"

## /etc/keepalived/scripts/notify_fault.sh
#!/bin/bash
logger "Keepalived: FAULT state"

## /etc/keepalived/scripts/notify_stop.sh
#!/bin/bash
logger "Keepalived: STOPPED"

chmod +x /etc/keepalived/scripts/*.sh

三、驗證與測試

  1. 統計頁面: https://192.168.57.180:48800/admin-status (admin/AdminPass123!)
  2. MyCat 連線測試: mysql -h 192.168.57.180 -P 8098 -uuser -p
  3. 故障切換測試:
    • Master 上 systemctl stop keepalived → VIP 漂移到 Backup
    • 客戶端連線無感知切換 (TCP 連線需重連,長連接應用需實現重試)

四、關鍵避坑指南

坑點現象解決
腳本權限Keepalived 無法執行通知腳本chmod +x 所有 .sh、shebang 行正確 #!/bin/bash
SELinuxVIP 綁定失敗、腳本執行被阻setenforce 0 或配置策略
防火牆VRRP 組播 (224.0.0.18) / VIP / HAProxy 端口不通開放 VRRP、VIP、8098、48700、48800
網卡標識eth0 vs ens33 不匹配ip link 確認實際網卡名,配置文件統一
優先級抖動Master/Backup 頻繁切換啟用 nopreempt、調大 advert_int、檢查腳本檢查邏輯
HAProxy 重啟衝突notify 腳本並發重啟導致端口佔用腳本加鎖、檢查進程狀態後再啟動

五、生產級擴展建議

  1. HAProxy 多節點 + Keepalived 組集群:3+ HAProxy 節點,VIP 在其中漂移
  2. MyCat 多實例分組:按分片/業務分組,HAProxy 後端配置多組 listen
  3. 監控告警:Prometheus + Grafana 監控 HAProxy 狀態、Keepalived 狀態、MyCat 連接數、QPS、延遲
  4. 配置管理:Ansible/SaltStack 統一分發配置、滾動升級
  5. 災難演練:季度演練 Master 故障、網絡分區、MyCat 掛掉等場景

總結

HAProxy (負載均衡) + Keepalived (VIP 漂移) + MyCat (分庫分表中間件) 構建了完整的讀寫分離、分片路由、高可用轉發三層架構。核心難點在於:健康檢查腳本可靠性、Keepalived 通知腳本與 HAProxy 協同重啟、VRRP 組播網絡環境、防火牆/SELinux 策略。生產部署必須經過完整故障注入測試,建立標準化運維手冊。

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