【发布时间】:2023-08-22 23:28:01
【问题描述】:
对于我们在 Amazon EC2 实例上设置的应用程序,我们使用 MySQL 数据库,安装在 2 个 EC2 实例上,处于主-主复制模式。为了对这些数据库服务器进行负载平衡,我使用了一个部署在另一个 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 更好吗?
【问题讨论】:
-
您尝试过 AWS RDS 吗?它们为高可用性提供了非常好的多可用性区域支持。此外,只需几个步骤,您也可以创建主从。
-
谢谢。但我现在无法尝试。我的实例在同一个可用区
-
如果您的两个数据库实例都在同一个可用区中,您并没有真正提高容错能力。如果一台服务器遇到问题,另一台服务器很可能也会受到影响。我建议将实例移动到不同的可用区。
-
@bwight - 您通常如何对 EC2 上的 MySQL 服务器进行负载平衡?你是使用 HAProxy 还是依赖亚马逊的 LB。我没有成功使用 Amazon 的 LB,因为它没有转发 TCP 请求。
-
我一般不使用 MySQL。但我的观点是,您应该将实例分布在多个区域中,以帮助降低容错能力。但是你是正确的,你不能使用 ELB 来平衡 MySQL。
标签: mysql amazon-ec2 haproxy