首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

使用 HAProxy 實現 MySQL 複制延遲感知的負載均衡

     編輯:MySQL 資料庫相關知識

HAProxy Agent Check 動態調整從庫權重

在主從架構中,從庫複制延遲會導致讀取舊資料。HAProxy 1.5+ 引入 Agent Check,可根據 `Seconds_Behind_Master` 動態調整後端伺服器權重,實現延遲感知負載均衡。

架構原理

  • HAProxy 定期連線 Agent 端口(如 6789)。
  • Agent 執行 `SHOW SLAVE STATUS` 獲取延遲秒數。
  • 根據延遲閾值返回狀態字串:`down`、`up 100%`、`up 50%`、`up 5%`。
  • HAProxy 依權重分發讀請求,延遲高的從庫流量自動降低。

Agent 腳本實作 (PHP)

<?php
$port = $argv[1]; $mysql_port = $argv[2];
$mysql = "/usr/bin/mysql"; $user = 'haproxy'; $pass = 'haproxy_pwd';
$query = "SHOW SLAVE STATUS";

function set_weight($lag) {
    if ($lag === 'NULL') return "down";
    if ($lag < 10) return "up 100%";
    if ($lag >= 10 && $lag < 60) return "up 50%";
    return "up 5%";
}

$socket = stream_socket_server("tcp://127.0.0.1:$port", $errno, $errstr);
while ($conn = stream_socket_accept($socket)) {
    $cmd = "$mysql -h127.0.0.1 -u$user -p$pass -P$mysql_port -Ee \"$query\" | grep Seconds_Behind_Master | cut -d ':' -f2 | tr -d ' '";
    exec($cmd, $lag);
    fputs($conn, set_weight($lag[0]));
    fclose($conn);
}
fclose($socket);
?>

MySQL 權限授予

GRANT REPLICATION CLIENT ON *.* TO 'haproxy'@'127.0.0.1' IDENTIFIED BY 'haproxy_pwd';

HAProxy 配置範例

frontend read_only_front
  bind *:3307
  mode tcp
  default_backend read_only_back

backend read_only_back
  mode tcp
  balance leastconn
  server slave1 192.168.10.2:3306 weight 100 check agent-check agent-port 6789 inter 1000 rise 1 fall 1 on-marked-down shutdown-sessions
  server slave2 192.168.10.3:3306 weight 100 check agent-check agent-port 6789 inter 1000 rise 1 fall 1 on-marked-down shutdown-sessions

驗證效果

透過 `socat stdio /run/haproxy/admin.sock` 查看 `show stat`,可觀察到權重隨延遲動態變化:延遲 0 秒 → 100%,25 秒 → 50%,NULL(複制中斷) → DOWN。

進階建議

  • 保留傳統健康檢查作為備援。
  • 所有從庫均延遲時,可配置主庫為備用 `backup` 伺服器。
  • 生產環境建議使用 `pt-heartbeat` 替代 `Seconds_Behind_Master` 獲取更精準延遲。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved