【问题标题】:Load balancing MySql with HAProxy on EC2 Servers在 EC2 服务器上使用 HAProxy 对 MySql 进行负载平衡
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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'"
    

    【讨论】:

      最近更新 更多