Configuração automática do RabbitMQ do cluster

3

O documento de agrupamento RabbitMQ

link

descreve um processo através do qual você pode implantar um arquivo de configuração para clustering, de forma que um cluster seja criado automaticamente quando o seu rabbitmq nodes boot.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 rabbit2 e rabbit3 ainda não tiver aparecido, o serviço não será iniciado em rabbit2, pois está tentando criar um cluster com rabbit3.

Da mesma forma, se você aplicar a configuração apenas em rabbit1 e já tiver pré-iniciado rabbit2 e rabbit3, rabbit1 formará um cluster apenas com rabbit2, pois, de acordo com a documentação (não entendo por que):

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

A única maneira que isso parece funcionar é se você aplicar o arquivo de configuração em todos os 3 nós e fazer com que eles comecem exatamente ao mesmo tempo. Eu estou tentando implantar isso com Ansible, que cria os nós sequencialmente, para que não funcione.

O que estou perdendo aqui?

    
por Garreth McDaid 14.05.2015 / 17:05

2 respostas

0

Eu fiz algum progresso sobre isso.

O problema parece estar relacionado à escolha de usar nós ram em vez de disco no arquivo rabbitmq.config. Da documentação:

RAM nodes are an advanced use case; when setting up your first cluster you should simply not use them. You should have enough disc nodes to handle your redundancy requirements, then if necessary add additional RAM nodes for scale.

A cluster containing only RAM nodes is fragile; if the cluster stops you will not be able to start it again and will lose all data. RabbitMQ will prevent the creation of a RAM-node-only cluster in many situations, but it can't absolutely prevent it.

Quando eu altero 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}}]}].
    
por 15.05.2015 / 12:40
3

Eu também implanto clusters RabbitMQ com Puppet, e você realmente não precisa girar todos os nós exatamente ao mesmo tempo.

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

  • instale o RabbitMQ (RPM ou DEB)
  • configura o arquivo hosts em cada nó, para associar as 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 estamos agrupando juntos (porque não quero depender de DNS disponível) * 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 o erlang.cookie

Para criar um cookie erlang, geralmente uso o link e o configuro para criar uma cadeia de 20 caracteres consistente apenas com caracteres maiúsculos. Então, coloque esta string em /var/lib/rabbitmq/.erlang.cookie, assim:

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

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

    
por 14.05.2015 / 23:44