Как заставить haproxy и keepalived работать на одном устройстве с брокером emqx
Я довольно новичок в этом, поэтому, пожалуйста, будьте терпеливы.
Моя установка по существу состоит из трех устройств, использующих mqtt, которые подключаются через двух брокеров, оба из которых работают с emqx. Оба emqx-брокера также должны быть настроены как распределители нагрузки haproxy, с поддержкой активности на случай, если один из них выйдет из строя.
IP брокера 1 - 192.168.1.201
IP-адрес брокера 2: 192.168.1.202
виртуальный IP-адрес keepalived - 192.168.1.200
haproxy.cfg это
frontend emqx_tcp
bind *:1883
option tcplog
mode tcp
default_backend emqx_tcp_back
backend emqx_tcp_back
balance roundrobin
server emqx_node_1 192.168.1.201:1883 check
server emqx_node_2 192.168.1.202:1883 check
keepalived.conf - это
global_defs {
lvs_id haproxy01
}
vrrp_sync_group SyncGroup01 {
group {
VI_1
}
}
vrrp_script chkhaproxy {
script "/usr/bin/killall -0 haproxy"
script "/usr/sbin/service haproxy start"
interval 9
timeout 3
weight 20
rise 2
fall 4
}
vrrp_instance VI_1 {
interface eth0 # interface to monitor
state MASTER
virtual_router_id 51 # Assign one ID for this route
priority 101 # 101 on MASTER, 100 on BACKUP
advert_int 5
authentication {
auth_type PASS
auth_pass password
}
virtual_ipaddress {
192.168.1.200 # the virtual IP
}
track_script {
chkhaproxy
}
}
Проблема в том, что я не могу заставить ни haproxy, ни заставлять работать так, как задумано. Когда у брокера 1 работает только haproxy (keepalived не запущен) и я подключаюсь напрямую к IP-адресу брокера 1 от клиента, кажется, что он только перенаправляет соединения на брокер 2. Похоже, он не может подключиться к брокеру 1 (и да, я проверил, что они оба работали. Если работает только брокер 2, клиент просто не подключается). После некоторых копаний я подумал, что это может быть из-за того, что haproxy и брокер используют один и тот же IP. Поэтому я попытался использовать виртуальный IP-адрес от keepalived. Но после этого я обнаружил, что не могу даже подключиться к виртуальному IP. Клиент, при попытке подключиться к нему, выдаст мне ошибку "OSError: [Errno 113] Нет маршрута к хосту".
что мне не хватает?
Редактировать: после записи логов с помощью tailf /var/log/syslog это результат
7 февраля 14:56:19 pi01 Keepalived_healthcheckers[10453]: открытие файла '/etc/keepalived/keepalived.conf'.
7 февраля 14:56:19 pi01 Keepalived_healthcheckers[10453]: неизвестное ключевое слово 'lvs_id'
7 февраля 14:56:19 pi01 Keepalived_vrrp[10454]: Интерфейс по умолчанию eth0 не существует и интерфейс не указан. Пропуск статического адреса 192.168.1.200.
7 февраля 14:56:19 pi01 Keepalived_vrrp[10454]: невозможно загрузить библиотеку ipset - libipset.so.3: невозможно открыть общий объектный файл: такого файла или каталога нет
7 февраля 14:56:19 pi01 Keepalived_vrrp[10454]: VRRP_Instance(VI_1) Неизвестный интерфейс! 7 февраля 14:56:19 pi01 Keepalived_healthcheckers[10453]: Использование отражателя netlink ядра LinkWatch...
7 февраля 14:56:20 pi01 Keepalived_vrrp[10454]: остановлен
7 февраля 14:56:20 pi01 Keepalived[10450]: Keepalived_vrrp завершился с постоянной ошибкой CONFIG. Нагрузочный
7 февраля 14:56:20 pi01 Keepalived [10450]: остановка
7 февраля 14:56:20 pi01 Keepalived_healthcheckers[10453]: остановлен
7 февраля 14:56:25 pi01 Keepalived[10450]: остановлен Keepalived v1.3.2 (12/25,2016)
Похоже, что на линии постоянно происходит сбой Использование "Отражатель netlink ядра LinkWatch"
1 ответ
Первая проблема: HAProxy настроен на прослушивание всех интерфейсов на одном и том же порту, используемом emqx. Это должно вызвать у вас проблемы.
Либо настройте конкретную NIC для прослушивателя keepalived/haproxy, если вы хотите, чтобы они использовали один и тот же порт, либо заставьте HAProxy и emqx прослушивать разные порты.
Как только у вас это заработает, пришло время взглянуть на Keepalived. Мой лучший совет там, чтобы хвост ваши журналы. Убедитесь, что идентификатор маршрутизатора идентичен между главным и резервным копиями, а резервная копия имеет более низкий приоритет, чем основной. Честно говоря, я не помню, чтобы вы работали с VRFP (протоколом, используемым keepalived), чтобы разрешить подмену Mac или подобное в коммутаторе.