在EC2服务器上将MySql与HAProxy进行负载均衡

时间:2013-01-30 07:21:44

标签: mysql amazon-ec2 haproxy

对于我们的应用程序,在Amazon EC2实例上进行设置,我们使用安装在2个EC2实例上的MySQL数据库,采用主 - 主复制模式。要对这些数据库服务器进行负载平衡,我正在使用部署在另一个配置

的EC2实例上的HAProxy
listen  mysql <public dns of haproxy>:<port>
mode tcp
balance roundrobin
server mysql-db-s1 <elastic ip of db server1>:<port> maxconn 2000
server mysql-db-s2 <elastic ip of db server2>:<port> maxconn 2000

所有三个实例都分配了弹性ip,我使用haproxy的公共dns从我的应用程序连接。但有时我得到错误

 `com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: C
  ommunications link failure The last packet successfully received from the server was  58,085 milliseconds ago.  
  The last packet sent successfully to the server was 0 milliseconds ago.`

这与我在这里给出的配置有什么关系吗?使用弹性ip而不是公共DNS更好吗?

2 个答案:

答案 0 :(得分:1)

这本质上不是HAProxy问题,因为我在直接连接到其中一个数据库后遇到了同样的错误。稍微调整了数据库并修复了我的应用程序中的一些代码,现在我至少在过去12小时内没有得到这个。谢谢你的建议。我将其中一个DB移动到另一个可用区。

答案 1 :(得分:0)

Web服务器和数据库由于对大量网站的请求而负载平衡概念。因此,我们需要知道如何通过负载平衡处理大量请求。

在本文中,我们将使用HAProxy讨论这个MySQL负载平衡概念。让我们考虑一下MySQL节点1的ip地址是192.168.1.172,而MySQL节点2的ip地址是192.168.2.82。

步骤1:创建MySQL用户并安装MySQL客户端首先我们需要确保MySQL服务器必须配置为执行Master-Master复制,因为负载平衡涉及读取和写入所有后端。我们需要为HAPorxy创建MySQL用户的初始事项。 HAProxy将使用第一个用户来检查服务器的状态

$ mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('192.168.1.172','haproxy_check'); FLUSH PRIVILEGES;"
$ mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'192.168.1.172' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES"

$ sudo apt-get install mysql-client

$ sudo apt-get install haproxy
$ sed -i "s/ENABLED=0/ENABLED=1/" /etc/default/haproxy

$ sudo nano /etc/haproxy/haproxy.cfg 

并将此内容添加到该新配置文件

global
log 127.0.0.1 local0 notice
user haproxy
group haproxy
defaults
log global
retries 2
timeout connect 3000
timeout server 5000
timeout client 5000

listen mysql-cluster
bind 127.0.0.1:3306
mode tcp
option mysql-check user haproxy_check
balance roundrobin
server mysql-1 192.168.1.172:3306 check
server mysql-2 192.168.2.82:3306 check

第3步:测试负载平衡

$ mysql -u haproxy_root -p -e "show variables like 'server_id'"