错误 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 clienttimeout 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 集群,它工作得很好。

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