
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}}]}].