我在多主服务器设置中设置了 3 个 MariaDB 服务器集群,运行良好。我为 HaProxy 添加了第 4 个服务器,用于负载平衡和循环调度,这样我们就可以拥有一些冗余,除了 1 个问题外,它也能正常工作。
我登录了 HaProxy 服务器上的 MySQL 客户端并运行以下查询:
show variables like 'server_id';
我得到了结果,但如果我等待 5 秒或更长时间并再次运行查询,我会收到以下错误:
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 52
Current database: *** NONE ***
之后,我立即获得了具有不同 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
答案1
对于长时间运行的空闲会话(例如mysql
在命令行上运行),您的timeout client
和timeout server
太短了。
对于访问数据库的 Web 服务器来说,它们可能没问题,因为连接只会在需要时才打开,并且每次页面加载都会创建一个新的连接。
要允许连接保持打开状态 10 分钟,请更改
timeout server 5000
timeout client 5000
到
timeout server 10m
timeout client 10m
如果需要,您还可以设置得更高。我有一个 RDS 集群,其超时时间为 7 小时,但运行良好。
答案2
尝试在 mariaDB 中配置max_allowed_packet
。这里有一个相关链接,可能会解决您的问题。
http://stackoverflow.com/questions/10474922/error-2006-hy000-mysql-server-has-gone-away