Mysql

Haproxy mysql故障轉移負載均衡

  • July 31, 2012

我已經設置了 mysql 主-主複製,現在我正在嘗試使用 Haproxy 對 mysql 伺服器進行負載平衡。

  • 負載均衡器:192.168.1.5
  • mysql1:192.168.1.7
  • mysql2:192.168.1.8

下面的 haproxy 配置工作正常,它像輪詢一樣旋轉節點。

# this config needs haproxy-1.1.28 or haproxy-1.2.1

global
   log 127.0.0.1   local0
   log 127.0.0.1   local1 notice
   #log loghost    local0 info
   maxconn 4096
   #chroot /usr/share/haproxy
   chroot /etc/haproxy
   user haproxy
   group haproxy
   pidfile /var/run/haproxy.pid
   daemon
   #debug
   #quiet

defaults
   log global
   #mode   http
   mode    tcp
   #option httplog
   option  dontlognull
   retries 3
   option redispatch
   maxconn 2000
   #contimeout 5000
   contimeout  3600000
   #clitimeout 50000
   clitimeout  3600000
   #srvtimeout 50000
   srvtimeout  3600000

listen mysql_cluster 0.0.0.0:3307
   mode tcp
   balance roundrobin
   option mysql-check user root
   #option httpchk GET /mysqlchk/?port=3306
   option tcpka
   server mysql1 192.168.1.107:3306 
   server mysql2 192.168.1.108:3306

這不是我想要的。

我想要的是Active-Passive設置。就像,一個配置,以便它應該192.168.1.107預設發送所有請求並故障轉移到192.168.1.108如果192.168.1.107不存在。我已經看到一些連結通過提及作為備份來執行此操作,但它對我沒有任何作用。

當我嘗試替換上述配置的最後兩行時,

server mysql1 192.168.1.107:3306 check port 9200 inter 12000 rise 3 fall 3
server mysql2 192.168.1.108:3306 check port 9200 inter 12000 rise 3 fall 3 backup 

我在重新啟動 haproxy 時遇到以下錯誤消息,它會自行停止。

Jan 20 16:18:18 localhost haproxy[523]: proxy mysql_cluster has no server available!
Jan 20 16:18:18 localhost haproxy[523]: proxy mysql_cluster has no server available!

任何人都有任何可靠的 haproxy 工作配置用於 mysql 負載平衡,以便在生產中使用它並提供一些 haproxy 統計資訊?我需要一個主動-被動配置,如果沒有節點可用,我在上面詢問哪個重定向到備份節點。我將在新的 ubuntu 生產伺服器上實現這個。

任何幫助是極大的讚賞!。謝謝!

刪除檢查埠 9200s 然後您的備份選項應該可以工作。您似乎在混合不同的範例,mysql-check 在標準埠上工作,還有另一個使用 http 檢查的常見範例,他們在埠 9200 上設置了一個 xinetd 程序應答,該程序執行一個單獨的檢查腳本。

您可以進行主-主複製,但即便如此,我認為使用 HAProxy 進行 MySQL 負載平衡並不是正確的選擇。

HAProxy 很棒,但是當它作為 TCP 級別的負載均衡器執行時,它不能有任何 SQL 狀態的概念。長時間執行的 SQL 事務的行為不明確且容易出錯;這是你不應該高興的事情。

您的 master-master 設置具有單個節點的寫入容量(因為所有寫入都需要複製)。因此,您通過設置擴展的是讀取和連接。一個更常見且恕我直言更好的設置是:

  1. 從主-主對掛起一些只讀的 MySQL 從屬。
  2. 更改您的應用程式碼以將所有寫入發送到主機,並將幾乎所有讀取(如果可能)發送到只讀從機之一。
  3. 明智地建立與 MySQL 的連接。最好重用來自連接池的連接。

MySQL 代理或其他連接處理中間件之類的東西也可能適用於您的情況。

《高性能 MySQL》是一本非常好的書,其中包含有關如何擴展 MySQL 的實用建議。如果你讀了這本書,我想你會更清楚地看到哪些設計是常見的,並且已經證明了你的具體情況。

引用自:https://serverfault.com/questions/352253