Устанавливаю тестовый кластер - Maria Galera Cluster на 3 физических узлах с HAProxy. Он работает, но я сделал какую-то ошибку новичка, которую, похоже, не могу решить - так что, надеюсь, кто-то сможет взглянуть экспертом и помочь мне, пожалуйста ?!
У меня есть 3 физических узла Node1: 10.1.1.120
Узел 2: 10.1.1.121
Узел 3: 10.1.1.124
Использование HAProxy виртуального IP 10.1.1.113
Работает, когда я запрашиваю через виртуальный IP-адрес, я получаю ...
$ mysql -uroot -pPassword -P 3306 -h 10.1.1.113 -e "select @@hostname; show processlist;"
+------------+
| @@hostname |
+------------+
| node2 |
+------------+
+----+-------------+-------------+------+---------+------+--------------------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+-------------+-------------+------+---------+------+--------------------+------------------+----------+
| 1 | system user | | NULL | Sleep | 37 | NULL | NULL | 0.000 |
| 2 | system user | | NULL | Sleep | 37 | wsrep aborter idle | NULL | 0.000 |
| 45 | root | node1:55877 | NULL | Query | 0 | init | show processlist | 0.000 |
+----+-------------+-------------+------+---------+------+--------------------+-
И если я сделаю ip a на узел1 - это действительно то место, где живет мой виртуальный IP-адрес, НО имя хоста возвращается как узел2.
Если я выключу (или просто отключу eth0) на node1, виртуальный IP-адрес сместится в другое место, но имя хоста @@ все равно вернется как node2.
Проблема возникает, если я выключаю node2, а затем, когда я пытаюсь запустить mysql с виртуальным IP, я получаю:
**ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 "Internal error/check (Not system error)"**
(на этом этапе, если я войду на любую из локальных машин без использования виртуального IP-адреса, он будет работать).
Таким образом, похоже, что часть HAProxy работает (поскольку она перемещается соответствующим образом), но MariaDB пытается делать свои собственные вещи и решила, что все должно быть маршрутизировано через Node2.
В моих файлах .cnf нет адреса привязки. Я использую порт 1306 для своей службы sql, чтобы избежать конфликтов с 3306 при перезапуске службы на машине, которая имеет виртуальный IP-адрес и отправляет 3306 одновременно.
Мой файл keepalived ... (не уверен, что это правильно, но все узлы настроены как ведущие, а приоритеты - 100, 101 и 102 соответственно - похоже, не имеет значения)
global_defs {
router_id geordi
}
vrrp_script haproxy {
script "killall -0 haproxy"
interval 1
weight 1
}
vrrp_instance 51 {
virtual_router_id 51
priority 101
state MASTER
interface eth0
virtual_ipaddress {
10.1.1.113 dev eth0
}
track_script {
haproxy
}
}
а мой haproxy.cfg:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
defaults
log global
mode http
option dontlognull
contimeout 5000
clitimeout 50000
srvtimeout 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
listen mysql_proxy 10.1.1.113:3306
mode tcp
balance roundrobin
option tcpka
option httpchk
option mysql-check user haproxy
server node1 10.1.1.120:1306 check
server node2 10.1.1.121:1306 check
server node3 10.1.1.124:1306 check
Любые предложения с благодарностью получены, пожалуйста - я очень близок к тому, чтобы все это заработало, но не совсем так!
Явно установлен bind-address=0.0.0.0
в my.cnf
.
Дополнительно (вы, вероятно, уже сделали это, если зашли так далеко):
10.1.1.113
(если используется keepalived, то через фиктивный интерфейс как / 32).net.ipv4.conf.default.rp_filter = 2
в /etc/sysctl.conf
net.ipv4.conf.default.accept_source_route = 0
в /etc/sysctl.conf
Это позволяет MySQL СЛУШАТЬ на всех интерфейсах и позволяет MySQL ОТВЕТИТЬ на интерфейсе, для которого пакет не предназначен.
Сетевой интерфейс на узле 1 (10.1.1.120) получает пакет как «10.1.1.13» на интерфейсе, соответствующем 10.1.1.120. Обычно это опускают со словами «это не для меня». Это происходит на уровне «Интернет» модели TCP / IP.
Однако в положениях 2 и 3 выше говорится: «просто примите это, это может быть для нас», что затем переходит в MySQL («прикладной» уровень модели TCP / IP). MySQL видит, что мы привязаны ко всем адресам, один из которых - 10.1.1.113 (положение 1), и обрабатывает его.