У нас есть кластер HA MariaDB, в котором наш балансировщик нагрузки внезапно начал не видеть наши узлы db как подключенные. Мы обновили наше приложение, чтобы напрямую воздействовать на узлы и обходить балансировщик нагрузки, потому что мы не можем понять, что происходит.
конфигурация haproxy
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
#debug
#quiet
user haproxy
group haproxy
defaults
log global
mode http
retries 3
timeout client 50s
timeout connect 5s
timeout server 50s
option dontlognull
option redispatch
option tcplog
balance roundrobin
# Set up application listeners here.
listen admin
bind 0.0.0.0:22002
mode http
stats uri /
listen mysql-cluster
bind 0.0.0.0:3306
balance roundrobin
mode tcp
server db1.my-domain.com XX.XX.XXX.94:3306 check
server db2.my-domain.com XX.XX.XXX.97:3306 check
server db3.my-domain.com XX.XX.XXX.96:3306 check
option mysql-check user balance
Единственная задача этого балансировщика нагрузки - балансировать трафик между узлами db, не любые другие услуги. Я попытался включить отладку, чтобы увидеть более подробный вывод, но не могу найти никаких ошибок, связанных с проверкой mysql-cluster. В журналах я вижу записи журнала, совершенно не связанные с узлами базы данных, указанными в конфигурации. Вот пример:
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[10] : [ttl=3]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[11] : [auth=1 866db534aa49e7d727e7c41caf33020031f26b0e]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: process_status_message: bad node [prod-load-1] in message
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG: Dumping message with 12 fields
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[0] : [t=status]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[1] : [st=active]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[2] : [dt=1388]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[3] : [protocol=1]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[4] : [src=prod-load-1]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[5] : [(1)srcuuid=0x24deb20(36 27)]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[6] : [seq=a8b208]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[7] : [hg=5792730f]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[8] : [ts=58e3e4fb]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[9] : [ld=0.00 0.01 0.05 1/223 49874]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[10] : [ttl=3]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[11] : [auth=1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: process_status_message: bad node [demo-load2] in message
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG: Dumping message with 10 fields
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[0] : [t=NS_ackmsg]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[1] : [dest=demo-load2]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[2] : [ackseq=2717430]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[3] : [(1)destuuid=0x24e0780(37 28)]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[4] : [src=demo-load2]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[5] : [(1)srcuuid=0x24d5540(36 27)]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[6] : [hg=5391a40d]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[7] : [ts=58e3e4fb]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[8] : [ttl=3]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[9] : [auth=1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: process_status_message: bad node [prod-load-1] in message
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG: Dumping message with 12 fields
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[0] : [t=status]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[1] : [st=active]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[2] : [dt=1388]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[3] : [protocol=1]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[4] : [src=prod-load-1]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[5] : [(1)srcuuid=0x24e0640(36 27)]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[6] : [seq=a8b208]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[7] : [hg=5792730f]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[8] : [ts=58e3e4fb]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[9] : [ld=0.00 0.01 0.05 1/223 49874]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[10] : [ttl=3]
Apr 04 18:24:59 database-load-balancer-1 heartbeat: [4048]: ERROR: MSG[11] : [auth=1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]
Что я могу сделать, чтобы выяснить, почему мои узлы БД перечислены как «неработающие»?
Во-первых, убедитесь, что у вас есть пользователь mysql с именем "balance" на всех ваших серверах БД. Затем убедитесь, что пользователь "balance" имеет право подключаться с IP-адреса haproxy, а не только с локального хоста.
Чтобы настроить ведение журнала haproxy, выполните следующие действия:
Вы уже настроили функцию системного журнала local0 для журнала haproxy в конфигурации haproxy.
...
log 127.0.0.1 local0
...
Добавьте это в /etc/rsyslog.conf для записи логов в файл.
# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# haproxy logs
local0.* /var/log/haproxy.log
Перезапустите службы haproxy и rsyslog, а затем проверьте /var/log/haproxy.log на наличие таких строк:
localhost haproxy[1555]: Server mysql/mysql-1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Этот журнал должен содержать достаточно информации, чтобы точно определить проблему.
Вам нужно использовать опцию mysql-check с проверкой, если вы используете только checke, MariaDB открывает соединение и держит его открытым до тех пор, пока не истечет время ожидания, и вы можете довольно быстро закончить соединения. Параметр mysql-check открывает и закрывает соединение, но вам понадобится фиктивный пользователь в БД, который может аутентифицироваться в БД. Вы можете проверить HAProxy документация