HAProxy 仅向一个节点发送流量

HAProxy 仅向一个节点发送流量

我有一个 HAProxy,IP 为 10.60.61.20,还有三个 MariaDB 节点,IP 为 .21、.22、.23,当然它们都在同一个子网中。我已同步 MariaDB 集群,它们可以相互读取/写入,但是当我设置 HAProxy 时,它只会将流量发送到 10.60.61.21(第一个节点)。即使在我关闭第一个节点上的 mysql 后,HAProxy 仍会说出现连接错误,并且不会将流量发送到其他两个节点。有人见过这种情况吗?我刚刚构建了 4 个 Ubuntu 12.04 服务器,其中 3 个用于节点,另一个用于 HAProxy。这是我的 HAProxy .conf 文件:

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 0.0.0.0:3306
    mode tcp
    option mysql-check user haproxy_check
    balance roundrobin
    server mariadb1 10.60.61.22:3306 check
    server mariadb2 10.60.61.21:3306 check
    server mariadb3 10.60.61.23:3306 check

任何帮助,将不胜感激。

答案1

我会猜测你的问题出在应用程序方面。

由于这是 TCP 模式,因此平衡各个服务器之间的 TCP 连接而不是 SQL 事务。这意味着如果你的应用程序不使用水池连接数,但只维护一个打开的连接,该连接将对一个服务器保持打开状态。如果您的应用程序没有在失败的连接上重试,HAProxy 不会神奇地将失败的 TCP 连接移至另一台服务器。

我认为一个简单的测试就是针对 haproxy IP 反复运行以下命令(但是,不要在单个控制台会话中运行它):

mysql -u monitor -p -e "show variables like 'server_id'"

答案2

我会检查负载均衡器上的日志haproxy

# less /var/log/haproxy.log

你应该看到向上向下消息。如果您发现它失败得不够快,您可以随时更改:

server mariadb1 10.60.61.22:3306 check
server mariadb2 10.60.61.21:3306 check
server mariadb3 10.60.61.23:3306 check

采取一些更具攻击性的措施,例如fail over after 2 failed checks, check ever second

server mariadb1 10.60.61.22:3306 check fall 2 inter 1000
server mariadb2 10.60.61.21:3306 check fall 2 inter 1000
server mariadb3 10.60.61.23:3306 check fall 2 inter 1000

DigitalOcean 拥有很棒的教程关于这一点。

答案3

感谢大家提供的所有意见。我终于解决了这个问题,事情是这样的,在安装过程中,我访问了第一个 MariaDB 主机,并说(我不是 mysql 专家)“授予用户 haproxy_check 对任何数据库的完全权限访问权”。但我没有对其他服务器也这样做。因此,HAProxy 能够使用正确的用户名/密码登录到第一个服务器,但这些用户权限没有复制到其他数据库,因此我不得不手动进入每个 MariaDB 服务器并为该用户创建登录任何数据库的条目。一旦发生这种情况,一切都会立即开始工作。再次感谢大家的见解。我假设因为我的 galera 集群处于完全复制状态,所以我在第一个服务器上的条目将接管其余部分,但用户访问条目并非如此。但是,所有表、字段和编辑等都在复制,这让我相信权限也是如此,但遗憾的是,它们没有。

相关内容