Я устанавливаю кластер из 3 серверов MariaDB в конфигурации с несколькими мастерами, которая работает нормально. Я добавил 4-й сервер для HaProxy для балансировки нагрузки и циклического перебора, чтобы у нас была небольшая избыточность, которая также работает, за исключением одной проблемы.
Я вошел в клиент MySQL на сервере HaProxy, выполняя следующий запрос:
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
Для длительной сессии, которая простаивает, например, работает mysql
в командной строке ваш timeout client
и timeout server
слишком короткие.
Они, вероятно, подходят для веб-сервера, обращающегося к БД, потому что соединение открыто только столько, сколько ему нужно, и каждая загрузка страницы создает новое соединение.
Чтобы соединения оставались открытыми в течение 10 минут, измените
timeout server 5000
timeout client 5000
к
timeout server 10m
timeout client 10m
Если хотите, можете подняться еще выше. У меня есть кластеры RDS с 7-часовым таймаутом, и он отлично работает.
В документах есть более подробная информация о клиент тайм-аута, сервер тайм-аута, и сокращение, используемое для спецификатор времени.
Попробуй настроить max_allowed_packet
в mariaDB. Вот относительная ссылка, которая может решить вашу проблему.
http://stackoverflow.com/questions/10474922/error-2006-hy000-mysql-server-has-gone-away