错误 2006 (HY000):MySQL 服务器消失了......(HaProxy / Galera)

Hat*_*ber 6 mysql java haproxy mariadb

我在多主设置中设置了一个由 3 个 MariaDB 服务器组成的集群,它运行良好。我为 HaProxy 添加了第 4 个服务器以进行负载平衡和循环,以便我们可以有一点冗余,这也可以正常工作,除了 1 个问题。

我登录到运行以下查询的 HaProxy 服务器上的 MySQL 客户端:

show variables like 'server_id';
Run Code Online (Sandbox Code Playgroud)

我正在获取结果,但是如果我等待 5 秒或更长时间并再次运行查询,我会收到以下错误:

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    52
Current database: *** NONE ***
Run Code Online (Sandbox Code Playgroud)

在那之后,我得到了不同 server_id 的结果,这表明负载平衡正在工作。这导致的问题是,当我尝试从 Spring/Java 应用程序连接时,我可以在短时间内运行查询并且连接断开。我想如果我可以在 HaProxy 服务器上解决它,那将解决我遇到的其他问题。

编辑:添加 HAPROXY.CFG

global
    log 127.0.0.1 local0 notice
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    user haproxy
    group haproxy
    maxconn 4096
    daemon

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 tcpka
    option mysql-check user haproxy_check
    balance roundrobin
    server mysql-1 192.168.10.241:3306 check inter 1000 rise 3 fall 1
    server mysql-2 192.168.10.242:3306 check inter 1000 rise 3 fall 1
    server mysql-3 192.168.10.243:3306 check inter 1000 rise 3 fall 1

listen stats
    bind 192.168.10.211:8080
    mode http
    stats enable
    stats uri /
    stats realm Strictly\ Private
    stats auth USER:PASSWORD
Run Code Online (Sandbox Code Playgroud)

Gre*_*egL 10

对于空闲的长时间运行的会话,例如mysql在命令行上运行,您的timeout client和timeout server太短了。

对于访问数据库的 Web 服务器来说,它们可能很好,因为连接仅在需要时打开,并且每个页面加载都会创建一个新连接。

要允许连接保持打开状态 10 分钟,请更改

timeout server 5000
timeout client 5000
Run Code Online (Sandbox Code Playgroud)

到

timeout server 10m
timeout client 10m
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以走得更高。我有 7 小时超时的 RDS 集群,它工作得很好。

文档有更多关于超时客户端、超时服务器和用于时间说明符的简写的详细信息。