Configuração automática do cluster RabbitMQ

Configuração automática do cluster RabbitMQ

O documento de clustering RabbitMQ

https://www.rabbitmq.com/clustering.html

descreve um processo pelo qual você pode implantar um arquivo de configuração para clustering para que um cluster seja criado automaticamente quando seus nós do RabbitMQ inicializarem.eg

[{rabbit,
  [{cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'], ram}}]}].

Você aplica este arquivo em cada um dos 3 nós em /etc/rabbitmq/rabbitmq.config e, em seguida, inicia o RabbitMQ em cada um e um cluster aparentemente será formado.

Isso não parece funcionar muito bem, por exemplo

Se você iniciar o coelho2 e o coelho3 ainda não tiver aparecido, o serviço não será iniciado no coelho2, pois está tentando criar um cluster com o coelho3.

Da mesma forma, se você aplicar apenas a configuração no coelho1 e tiver pré-iniciado o coelho2 e o coelho3, o coelho1 formará um cluster apenas com o coelho2, conforme a documentação (não entendo o porquê):

RabbitMQ will try to cluster to each node provided, and stop after it can cluster with one of them.

A única maneira de isso funcionar é aplicar o arquivo de configuração em todos os três nós e fazer com que eles iniciem emexatamenteo mesmo tempo. Estou tentando implantar isso com Ansible, que cria os nós sequencialmente, então não funciona.

O que estou perdendo aqui?

Responder1

Também implanto clusters RabbitMQ com Puppet e, na verdade, você não precisa ativar todos os nós exatamente ao mesmo tempo.

O que costumo fazer e até agora funcionou para mim é:

  • instale RabbitMQ (RPM ou DEB)
  • configure o arquivo hosts em cada nó, para conter entradas para todos os três. exemplo:

.

192.168.1.11    dev-c1n01-rabbitmq.example.com  dev-c1n01-rabbitmq
192.168.1.12    dev-c1n02-rabbitmq.example.com  dev-c1n02-rabbitmq
192.168.1.13    dev-c1n03-rabbitmq.example.com  dev-c1n03-rabbitmq

nós que estamos agrupando (porque não quero depender da disponibilidade do DNS) * implantar RabbitMQ.config

.

[
  {rabbit, [
    {cluster_nodes, {['rabbit@dev-c1n01-rabbitmq', 'rabbit@dev-c1n02-rabbitmq', 'rabbit@dev-c1n03-rabbitmq'], disc}},
    {cluster_partition_handling, pause_minority},
    {disk_free_limit, 2147483648},
    {heartbeat, 0},
    {tcp_listen_options, [binary, {backlog, 1024}, {nodelay, true}, {keepalive, true} ]},
    {vm_memory_high_watermark, 0.6},
    {default_user, <<"admin">>},
    {default_pass, <<"somedefaultpass">>}
  ]},
  {kernel, [

  ]}
,
  {rabbitmq_management, [
    {listener, [
      {port, 15672}
    ]}
  ]}
].
% EOF
  • implantar erlang.cookie

Para criar cookie erlang, eu costumo usarhttp://passwordsgenerator.net/e configure-o para criar uma sequência de 20 caracteres consistente apenas com caracteres maiúsculos. Em seguida, coloque esta string em /var/lib/rabbitmq/.erlang.cookie, assim:

echo -n 'LCQLSHVOPZFHRUXMMAPF' > /var/lib/rabbitmq/.erlang.cookie
  • nós iniciais (a ordem não importa, desde que tenham o mesmo erlang.cookie e RabbitMQ.config)

Isso deve funcionar para você. Testado nas versões 3.2, 3.3 e 3.5.

Responder2

Eu fiz algum progresso nisso.

A questão parece estar relacionada com a escolha de utilizarbaternós em vez dedisconós no arquivo RabbitMQ.config. Da documentação:

Os nós de RAM são um caso de uso avançado; ao configurar seu primeiro cluster você simplesmente não deve usá-los. Você deve ter nós de disco suficientes para lidar com seus requisitos de redundância e, se necessário, adicionar nós de RAM adicionais para escalar.

Um cluster contendo apenas nós RAM é frágil; se o cluster parar, você não poderá iniciá-lo novamente e perderá todos os dados. O RabbitMQ impedirá a criação de um cluster somente de nó RAM em muitas situações, mas não pode impedi-lo de forma absoluta.

Quando alterei o arquivo de configuração para usar “disco” em vez de “ram”, a criação do cluster ficou muito mais estável.

[{rabbit,
    [{cluster_nodes, {['rabbit@rabbit1', 'rabbit@rabbit2', 'rabbit@rabbit3'],disc}}]}].

informação relacionada