我已经设置了 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.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 生产服务器上实现这一点。
非常感谢您的帮助!谢谢!
答案1
删除检查端口 9200,然后您的备份选项应该可以工作。您似乎混合了不同的示例,mysql-check 在标准端口上工作,而另一个常见示例使用 http 检查,其中他们设置了一个 xinetd 进程在端口 9200 上应答,该进程运行单独的检查脚本。
答案2
您已经实现了主-主复制,但即便如此,我也不认为使用 HAProxy 进行 MySQL 负载平衡是正确的选择。
HAProxy 很棒,但当作为 TCP 级负载均衡器运行时,它无法了解 SQL 状态。长时间运行的 SQL 事务的行为不明确且容易出错;这是您不应该感到高兴的事情。
您的主-主设置具有单个节点的写入容量(因为所有写入都需要复制)。因此,您要通过设置扩展的是读取和连接。更常见且在我看来更好的设置是:
- 从主-主对中挂出一些只读 MySQL 从属服务器。
- 更改应用程序代码,将所有写入操作发送到主服务器,并将几乎所有读取操作(如果可能)发送到其中一个只读从服务器。
- 明智地建立与 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。