HAProxy 仍存在单点故障

HAProxy 仍存在单点故障

我正在使用 HAProxy 在 3 个物理节点上设置一个测试集群 - Maria Galera 集群。它正在运行,但我犯了一些初学者错误,似乎无法解决 - 所以希望有人能以专家的眼光帮助我?!

我有3个物理节点Node1:10.1.1.120

节点2:10.1.1.121

节点3:10.1.1.124

使用 HAProxy 的虚拟 IP 10.1.1.113

启动并运行,当我通过虚拟 IP 查询时,我得到...

$ mysql -uroot -pPassword -P 3306 -h 10.1.1.113 -e "select @@hostname; show processlist;"
+------------+
| @@hostname |
+------------+
| node2      |
+------------+
+----+-------------+-------------+------+---------+------+--------------------+------------------+----------+
| Id | User        | Host        | db   | Command | Time | State              | Info                 | Progress |
+----+-------------+-------------+------+---------+------+--------------------+------------------+----------+
|  1 | system user |             | NULL | Sleep   |   37 | NULL               | NULL                 |    0.000 |
|  2 | system user |             | NULL | Sleep   |   37 | wsrep aborter idle | NULL             |    0.000 |
| 45 | root        | node1:55877 | NULL | Query   |    0 | init               | show processlist |    0.000 |
+----+-------------+-------------+------+---------+------+--------------------+-

如果我这么做知识产权节点1- 这确实是我的虚拟 IP 地址,但主机名返回为节点2

如果我关闭 node1 上的(或者只是禁用 eth0),虚拟 IP 地址会转移到其他地方,但 @@hostname 仍然会返回为 node2。

问题出现如果我关闭 node2,然后当我尝试使用虚拟 IP 访问 mysql 时,我得到:

**ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 "Internal error/check (Not system error)"**

(此时,如果我不使用虚拟 IP 登录到任何本地机器,它就会起作用)。

因此,看起来好像 HAProxy 部分正在工作(因为它适当地移动),但是 MariaDB 正在尝试做自己的事情并决定一切都需要通过 Node2 进行路由。

我的 .cnf 文件中没有绑定地址。我将端口 1306 用于我的 sql 服务,以避免在恰好具有虚拟 IP 并同时发布 3306 的机器上重新启动服务时与 3306 发生任何冲突。

我的 keepalived 文件是......(不确定这是否正确,但所有节点都设置为主节点,优先级分别为 100、101 和 102 - 似乎没有区别)

global_defs {
  router_id geordi
}
vrrp_script haproxy {
  script "killall -0 haproxy"
  interval 1
  weight 1
}

vrrp_instance 51 {
  virtual_router_id 51
  priority 101
  state MASTER
  interface eth0
  virtual_ipaddress {
    10.1.1.113 dev eth0
  }
  track_script {
    haproxy
  }
}

我的 haproxy.cfg 是:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode    http
    option  dontlognull
    contimeout 5000
    clitimeout 50000
    srvtimeout 50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

listen mysql_proxy 10.1.1.113:3306
        mode tcp 
        balance roundrobin
        option tcpka 
        option httpchk
        option mysql-check user haproxy
        server node1 10.1.1.120:1306 check 
        server node2 10.1.1.121:1306 check 
        server node3 10.1.1.124:1306 check

如有任何建议,我将不胜感激——尽管我已经接近完成所有工作,但还是很沮丧,因为还没有完成!

答案1

明确bind-address=0.0.0.0设置my.cnf

此外(如果您已经到了这一步,那么您可能已经这样做了):

  1. 确保每个主机都有 IP 地址10.1.1.113(如果使用 keepalived,则通过虚拟接口作为 /32)。
  2. 开始net.ipv4.conf.default.rp_filter = 2/etc/sysctl.conf
  3. 开始net.ipv4.conf.default.accept_source_route = 0/etc/sysctl.conf

这允许 MySQL 在所有接口上侦听,并允许 MySQL 在数据包未发送的接口上响应。

节点 1 (10.1.1.120) 上的网络接口在与 10.1.1.120 对应的接口上将数据包作为“10.1.1.13”接收。通常,该数据包会被丢弃,并提示“这不适合我”。这种情况发生在 TCP/IP 模型的“Internet”层。

但是,上面的第 2 和第 3 条规定说“接受它,它可能适合我们”,然后将其传递给 MySQL(TCP/IP 模型的“应用程序”层)。MySQL 看到我们绑定到所有地址,其中一个是 10.1.1.113(第 1 条规定),并对其进行处理。

相关内容