服务器上每个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;
|
测试就通过了.好奇怪,在我的理解中很不应该, 明天继续看看为什么会这么奇怪。