Haproxy mysql 故障转移负载平衡

Haproxy mysql 故障转移负载平衡

我已经设置了 mysql 主-主复制,现在我正在尝试使用 Haproxy 对 mysql 服务器进行负载平衡。

  • 负载均衡器:192.168.1.5
  • mysql1:192.168.1.7
  • mysql2:192.168.1.8

下面的 haproxy 配置运行良好,并且它像 roundrobin 一样旋转节点。

# 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.107192.168.1.108192.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 生产服务器上实现这一点。

非常感谢您的帮助!谢谢!

答案1

删除检查端口 9200,然后您的备份选项应该可以工作。您似乎混合了不同的示例,mysql-check 在标准端口上工作,而另一个常见示例使用 http 检查,其中他们设置了一个 xinetd 进程在端口 9200 上应答,该进程运行单独的检查脚本。

答案2

您已经实现了主-主复制,但即便如此,我也不认为使用 HAProxy 进行 MySQL 负载平衡是正确的选择。

HAProxy 很棒,但当作为 TCP 级负载均衡器运行时,它无法了解 SQL 状态。长时间运行的 SQL 事务的行为不明确且容易出错;这是您不应该感到高兴的事情。

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

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

就像是MySQL 代理或者其他连接处理中间件也可能适合您的情况。

“高性能 MySQL”是一本非常好的书,其中包含有关如何扩展 MySQL 的实用建议。如果您阅读了这本书,我认为您会更清楚地看到哪些设计是常见的,并且适合您的特定情况。

答案3

这个配置正好符合你的要求:)

global
       log 127.0.0.1 local0
       maxconn 4096
       user haproxy
       group haproxy
       daemon

defaults
       log global
       mode tcp
       option tcplog
       option dontlognull
       retries 3
       option redispatch
       maxconn 2000
       contimeout 4000
       clitimeout 50000
       srvtimeout 30000
       stats enable
       stats scope .

frontend mysql_cluster
       bind 3.3.3.3:3307
       #bind *:3307
       default_backend mysql_cluster

backend mysql_cluster
       mode tcp
       option mysql-check
       balance roundrobin
       server db01_1.1.1.1       1.1.1.1:3306      weight 1        check port 3306
       server db02_2.2.2.2       2.2.2.2:3306      weight 100      check port 3306 backup


listen stats 3.3.3.3:10000
       mode http
       option httpclose
       balance roundrobin
       stats uri /
       stats realm Haproxy\ Statistics
       #stats auth user:pass

答案4

要与 haproxy 结合建立真正的主-主 MySQL 集群,请尝试使用 codership Galera 或 percona XtraDB Cluster。

相关内容