案例背景:

我们有一个小型的 Percona 集群,2 主 1 从,双主复制。由于服务器是创建在 OpenStack 上的,如果使用 KeepAlived 还需要开通 'allow address pair',需要其它运维组协助提供额外的配置。

在参考了 https://www.digitalocean.com/community/tutorials/how-to-use-haproxy-to-set-up-mysql-load-balancing--3 后,我决定改用 HAProxy 来实现。

首先我们看 DB 服务器的架构,它们是互相复制的,这个就不展开敷述。

|hostname|ip|role| |:--------|:-----------:|-----------:| |db1|192.168.7.11|master1| |db2|192.168.7.12|master2|
这样的优势在于,往哪个数据库写入数据,另一个都会把执行结果复制。但为了减少错误的产生,我们一般只往其中一个库做读写。而不是参考文章里的负载均衡模式。

然后我的 haproxy(IP:192.168.7.17) 的配置是:

listen mysql-for-console
  bind 0.0.0.0:3306
  mode tcp
  timeout connect 3000s
  timeout client  10800s
  timeout server  10800s
  balance leastconn
  option tcplog
  option tcpka
  option clitcpka
  option srvtcpka
  option mysql-check
  option tcp-check
  server db1 192.168.7.11:3306 weight 1 check
  server db2 192.168.7.12:3306 weight 1 check backup

这样,我们的应用程序只需要访问 192.168.7.17:3306 即可。如果 db1 不可访问,haproxy 就会把连接转移到 db2 上。

haproxy 的这种用法,还可以配置成读写分离,只需要额外多监听一个端口,设置不同的后端服务器(一般是 slave 库)。查询在 slave,写入在 master。

haproxy 方案相对来说,配置简单,扩展容易,值得使用。