RabbitMQ сохраняет слишком много зеркал очереди после последовательного обновления

#rabbitmq

Вопрос:

Недавно мы обновили наш кластер RabbitMQ до последней версии с помощью скользящего обновления (удаляйте один узел за другим, обновляйте его, а затем добавляйте обратно в кластер с более новой версией).

Грубо говоря, мы поступили следующим образом:

 # Put host into maintenance mode
rabbitmq-upgrade drain

# Install new rabbitmq version

# Re-join cluster
rabbitmqctl join_cluster rabbit@rabbit01
 

Что касается скользящего обновления, мы намеренно не включили здесь все детали, потому что этот процесс не является проблемой. Проблема скорее в следующем: мы хотели убедиться, что реплики лидера очереди будут равномерно распределены после этого. Так мы и сделали:

 # Rebalance queues
rabbitmq-queues rebalance "all" --vhost-pattern ".*" --queue-pattern ".*"
 

Но сейчас у нас сложилась ситуация, когда в некоторых очередях слишком много зеркал! Мы используем классическое зеркальное отображение очередей со следующей политикой:

введите описание изображения здесь

Но на следующем изображении показано, что в некоторых очередях есть 2 зеркала. Обычно это должно указывать только 1.

введите описание изображения здесь

Конечно, вы могли бы сказать, что в этом нет ничего плохого. Но так как мы используем автоматические проверки, чтобы убедиться, что для каждой очереди существует правильное количество mirors, эти тесты теперь терпят неудачу. Мы ищем способ заставить RabbitMQ снова исправить эту ситуацию, чтобы создавалось и продолжалось только настроенное количество зеркал.

Ответ №1:

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

 rabbitmqctl set_policy --vhost customers --priority 1 new-tmp-policy "^ha.sample_queue_" '{"ha-mode": "exactly", "ha-params": 2, "ha-sync-mode": "automatic", "queue-master-locator": "min-masters", "queue-mode": "lazy"}'
 

Это изменит политику для sample_queues на «new-tmp-policy», и зеркала исчезнут. Теперь просто удалите «новую-tmp-политику», и старая политика будет применена снова для sample_queues.

Комментарии:

1. Просто проверил ваше предложение, и оно действительно решает мою проблему. Большое спасибо!