Я прочитал главы clustering и HA и получил хорошее понимание кластеризации RabbitMQ. Одна вещь, которую я не понимал, состоит в том, что у вас есть 2+ узла в кластере и набор очередей HA, как клиенты могут создавать соединения, чтобы, если один узел терпит неудачу, они автоматически и легко подключаются к остальным узлам (узлам). Можно ли это сделать с помощью балансировщика нагрузки, такого как, например, Amazon ELB для развертывания в AWS?RabbitMQ HA & Failover
ответ
Использование балансировщика нагрузки, такого как Amazon ELB или HAProxy, - это именно то, как вы должны маршрутизировать трафик на доступные узлы в кластере Rabbit.
Я бы рекомендовал HAProxy. Вот пример конфигурации HAProxy:
global
log 127.0.0.1 local1
maxconn 4096
#chroot /usr/share/haproxy
user haproxy
group haproxy
daemon
#debug
#quiet
defaults
log global
mode tcp
option tcplog
retries 3
option redispatch
maxconn 2000
timeout connect 5000
timeout client 50000
timeout server 50000
listen stats :1936
mode http
stats enable
stats hide-version
stats realm Haproxy\ Statistics
stats uri/
listen aqmp_front :5672
mode tcp
balance roundrobin
timeout client 3h
timeout server 3h
option clitcpka
server aqmp-1 rabbitmq1.domain:5672 check inter 5s rise 2 fall 3
server aqmp-2 rabbitmq2.domain:5672 backup check inter 5s rise 2 fall 3
Обратите внимание на последние две строки. Вам нужно будет заменить rabbitmq1.domain
и rabbitmq2.domain
с расположением ваших двух узлов. Поскольку второй сервер настроен как backup check
HAProxy будет балансировать запрос только на первом узле, и если этот узел не будет выполнен, запрос будет маршрутом ко второму узлу.
Я бы использовал простой keepalived
deamon на всех узлах кролика. Он просто добавляет виртуальный IP-адрес, общий для узлов, который вы можете использовать для доступа клиента. Конфигурация очень проста, проверьте это Hollenback's page.
Пример конфигурации:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 1
priority 100
virtual_ipaddress {
192.168.1.1/24 brd 192.168.1.255 dev eth0
}
}
Вы должны настроить очередь зеркальную между RabbitMQ-серверами.
rabbitmqctl set_policy HA '^(?!amq\.).*' '{"ha-mode": "all"}'
В примере rabbitmq будет зеркальная очередь иметь префикс с amq. Когда сервер A выходит из строя, эти очереди очереди выходят на сервер B. Вы также используете HA для кода (подключайтесь к серверу сбой, затем подключайтесь к серверу B) или используя порт кролика с помощью keepalive