2015-08-26 2 views
0

Я новичок в RabbitMq. Здесь я не могу понять эту концепцию. Пожалуйста, найдите сценарий.RabbitMq Clustering

У меня есть две машины (RMQ1, RMQ2), где я установил rabbitmq на обеих работающих машинах. Снова я кластерный RMQ2 присоединиться RMQ1

cmd:/> rabbitmqctl join_cluster [email protected] 

Если вы видите состояние машин здесь это, как показано ниже

В RMQ1

c:/> rabbitmqctl cluster_status 
    Cluster status of node [email protected] 
    [{nodes,[{disc,[[email protected],[email protected]]}]}, 
    {running_nodes,[[email protected],[email protected]]}] 

В RMQ2

c:\> rabbitmqctl cluster_status 
Cluster status of node [email protected] ... 
[{nodes,[{disc,[[email protected],[email protected]]}]}, 
{running_nodes,[[email protected],[email protected]]}] 

чтобы публиковать и подписываться на сообщение, я подключаюсь к RMQ1. Теперь я вижу, что всякий раз, когда я отправлял сообщение или сообщение в RMQ1, я вижу сообщение, отраженное как в RMQ1, так и в RMQ2. Это я четко понимаю, что, поскольку оба узла находятся в одном кластере, они становятся зеркальными между узлами.

Скажем, я сниму RMQ2, я все еще вижу сообщение, опубликованное в RMQ1.

Но когда я сбиваю RMQ1, я больше не могу публиковать сообщение. Из этого я понимаю, что RMQ1 является ведущим, а RMQ2 является подчиненным.

Теперь у меня есть ниже вопросы, без изменения кода:

  1. Как сделать RMQ2 взять на работу принимать сообщения.
  2. В чем смысл высокодоступных очередей.
  3. Как должна быть стратегия реализации такого рода сценария.

Пожалуйста, помогите

ответ

2

Вопрос № 2 лучше всего первый ответил, так как прояснится много вещей для вас.

В чем смысл высокодоступных очередей?

Хорошим источником информации для этого является the Rabbit doc on high availability. Очень важно понимать, что зеркалирование (именно так вы достигаете высокой доступности у кролика) и кластеризация - это не одно и то же. Вам нужно создать кластер, чтобы зеркалировать, но зеркалирование не происходит автоматически только потому, что вы создаете кластер.

Когда вы кластерируете Кролика, узлы в кластере обмениваются, привязывают, разрешают и другие ресурсы. Это позволяет вам управлять кластером как единым логическим брокером и использовать его для сценариев, таких как балансировка нагрузки. Однако, даже если очереди в кластере доступны с любой машины в кластере, каждая очередь и ее сообщения по-прежнему фактически расположены только на одном узле, где была объявлена ​​очередь.

Именно поэтому в вашем случае сбой RMQ1 сделает очереди и сообщения недоступными. Если это узел, к которому вы всегда подключаетесь, тогда это место, где находятся эти очереди. Они просто не существуют на RMQ2.

Кроме того, даже если в RMQ2 есть очереди и сообщения, вы не сможете получить к ним доступ, если только вы не подключаетесь к RMQ2 после обнаружения того, что ваше соединение с RMQ1 было потеряно. Кролик не будет автоматически связывать вас с каким-то выжившим узлом в кластере.

Кстати, если вы посмотрите на кластер в консоли управления RabbitMQ, то, как вы видите, может заставить вас думать, что сообщения и очереди реплицируются. Они не. Вы просматриваете кластер в консоли управления. Поэтому, независимо от того, с каким узлом вы подключаетесь в консоли, вы увидите представление в масштабе всего кластера.

Так на этом фоне теперь вы знаете ответ на ваши другие два вопроса:

Какой должна быть стратегия для реализации высокой доступности?/Как заставить RMQ2 принимать сообщения?

Из вашего описания вы ищете отказоустойчивость, которую обеспечивает высокая доступность. Вам нужно включить это на своем кластере. Это делается с помощью политики, и существуют различные способы сделать это, но самый простой способ в консоли управления на вкладке Администрирование в разделе Политики:

enter image description here

The previously cited doc имеет более подробно на что означает настройку высокой доступности у кролика.

Это даст вам зеркальное отображение очередей и сообщений в вашем кластере. Таким образом, если RMQ1 терпит неудачу, RMQ2 все равно будет иметь ваши очереди и сообщения, поскольку они зеркалируются на обоих узлах.

Важно отметить, что Rabbit не будет автоматически обнаруживать потерю соединения с RMQ1 и подключить вас к RMQ2. Ваш клиент должен это сделать. Я вижу, что вы отметили свой вопрос EasyNetQ. EasyNetQ предоставляет вам эту функцию «отказоустойчивого подключения». Вам просто нужно указать оба узла в строке подключения. У EasyNetQ doc on clustering есть детали. Обратите внимание, что EasyNetQ даже позволяет вам вводить простую стратегию балансировки нагрузки в этом случае.