haproxy - MySQl 的负载均衡

服务器上每个PHP进程占用一个数据库链接,当有 n 台服务器, 每台服务器用用100 * m 个PHP 进程的时候,数据库的压力是有点小大。

为了解决这个问题, 可以有的选择是:

  • 业内炒的比较火的有,奇虎Atlas, 淘宝前架构师写的OneProxy, 官方的MySQL-Proxy;
  • 从连接层解决负载均衡的压力,Haproxy 所擅长的事情

对于第一个选择,同事做过调研,使用起来不太放心。官方库就无人维护, 于是,最后选择了 Haproxy 来承担数据库的前端代理.链接数下降明显。


一些关键的配置

参考连接:

以下是配置内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
listen mysql-cluster
bind 127.0.0.1:3306 # 连接本地3306 到后端的DB
mode tcp
option mysql-check user haproxy_check # haproxy_check 是该haproxy用户
balance roundrobin
server mysql-1 10.0.0.1:3306 check # 后端DB
server mysql-2 10.0.0.2:3306 check # 后端DB

listen 0.0.0.0:8080 # 监控页面
mode http
stats enable
stats uri /
stats realm Strictly\ Private
stats auth A_Username:YourPassword
stats auth Another_User:passwd

值得注意的是,我们需要在DB 里面添加用户 haproxy_check,使得它有权限访问这个数据库。一开始我习惯用

1
2
3
假设我的内网ip是 192.168.1.5
create user 'haproxy_check'@'192.168.1.5' identified by 'xxx';
flush privileges;

事实上这样连接 haproxy 会报:

1
2
mysql -h127.0.0.1 -uusername -p
lost connection to mysql server at 'reading initial communication packet'

后来老实按照 digitalocean 的文章修改成

1
2
INSERT INTO mysql.user (Host,User) values ('192.168.1.5','haproxy_check');
flush privileges;

测试就通过了.好奇怪,在我的理解中很不应该, 明天继续看看为什么会这么奇怪。