Haproxy mysql 故障转移负载均衡

use*_*864 5 mysql load-balancing haproxy ubuntu-10.04

我已经设置了 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
Run Code Online (Sandbox Code Playgroud)

这不是我想要的。

我想要的是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 
Run Code Online (Sandbox Code Playgroud)

我在重新启动 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!
Run Code Online (Sandbox Code Playgroud)

任何人都有用于 mysql 负载平衡的 haproxy 的任何可靠工作配置,以便在生产中使用一些 haproxy 统计信息?我需要一个主动-被动配置,我在上面询问如果没有可用节点,哪个重定向到备份节点。我将在新的 ubuntu 生产服务器上实现这个。

任何帮助是极大的赞赏!。谢谢!

Jes*_*r M 5

您有主-主复制工作,但即便如此,我也不认为将 HAProxy 用于 MySQL 负载平衡是正确的选择。

HAProxy 很棒,但是当作为 TCP 级别的负载均衡器运行时,它不能有任何 SQL 状态的概念。长时间运行的 SQL 事务的行为不清楚且容易出错;这是你不应该高兴的事情。

您的主-主设置具有单个节点的写入容量(因为所有写入都需要复制)。因此,您在设置中扩展的是读取和连接。一个更常见的,恕我直言更好的设置是:

  1. 从主-主对中挂起一些只读的 MySQL 从服务器。
  2. 更改您的应用程序代码以将所有写入发送到主设备,并将几乎所有读取(如果可能)发送到只读从设备之一。
  3. 明智地建立与 MySQL 的连接。最好重用连接池中的连接。

MySQL 代理或其他连接处理中间件之类的东西也可能适用于您的情况。

“高性能 MySQL”是一本非常好的书,提供了有关如何扩展 MySQL 的实用建议。如果你读了这本书,我想你会更清楚地看到哪些设计是常见的,并且在你的特定情况下得到了证明。