Я новичок в этом, так что проявите терпение.
Моя установка - это, по сути, три устройства, использующие 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 или keepalived работать должным образом. Когда у меня брокер 1 работает только с haproxy (keepalived не запущен) и подключается напрямую к IP-адресу брокера 1 от клиента, кажется, что он пересылает соединения только брокеру 2. Кажется, он не может подключиться к брокеру 1. (и да, я проверил, что они оба работают. Если работает только брокер 2, клиент просто не подключается). Покопавшись, я подумал, что это может быть потому, что haproxy и брокер используют один и тот же IP-адрес. Итак, я попытался использовать виртуальный IP-адрес от keepalived. Но после этого я обнаружил, что не могу даже подключиться к виртуальному IP. Клиент при попытке подключиться к нему выдавал мне ошибку «OSError: [Errno 113] No route to host».
что мне не хватает?
Изменить: после обработки журналов с помощью 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 остановлен (25/12/2016)
Кажется, постоянно выходит из строя на строчке Использование "отражателя netlink ядра LinkWatch"
Первая проблема: HAProxy настроен на прослушивание всех интерфейсов на том же порту, который используется emqx. Это должно вызвать у вас проблемы.
Либо настройте конкретную сетевую карту для прослушивателя keepalived / haproxy, если вы хотите, чтобы они использовали один и тот же порт, либо заставьте HAProxy и emqx прослушивать разные порты.
Когда у вас все получится, пора взглянуть на Keepalived. Мой лучший совет - следить за своими журналами. Убедитесь, что идентификаторы маршрутизатора идентичны между главным и резервным маршрутизаторами и что резервная копия имеет более низкий приоритет, чем мастер. Я, честно говоря, не помню, нужно ли вам разрешить спуфинг Mac или что-то подобное в переключателе для работы VRRP (протокола, используемого keepalived).