Отказоустойчивый кластер RabbitMQ с помощью docker-compose
Для создания отказоустойчивого кластера RabbitMQ с помощью Docker Compose, нужно будет настроить несколько контейнеров для RabbitMQ с необходимыми конфигурациями для кластера, а также обеспечить нужные параметры для взаимодействия между контейнерами.
Вот пример docker-compose.yml
для поднятия отказоустойчивого кластера RabbitMQ с использованием 3-х нод:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
version: '3' services: rabbitmq1: image: rabbitmq:3-management container_name: rabbitmq1 hostname: rabbitmq1 networks: - rabbitmq-net environment: - RABBITMQ_ERLANG_COOKIE=secretcookie - RABBITMQ_NODENAME=rabbit@rabbitmq1 ports: - "15671:15672" # RabbitMQ Management plugin UI - "5671:5672" # RabbitMQ AMQP port volumes: - rabbitmq1-data:/var/lib/rabbitmq deploy: replicas: 1 restart_policy: condition: on-failure rabbitmq2: image: rabbitmq:3-management container_name: rabbitmq2 hostname: rabbitmq2 networks: - rabbitmq-net environment: - RABBITMQ_ERLANG_COOKIE=secretcookie - RABBITMQ_NODENAME=rabbit@rabbitmq2 ports: - "15672:15672" # RabbitMQ Management plugin UI - "5672:5672" # RabbitMQ AMQP port volumes: - rabbitmq2-data:/var/lib/rabbitmq deploy: replicas: 1 restart_policy: condition: on-failure rabbitmq3: image: rabbitmq:3-management container_name: rabbitmq3 hostname: rabbitmq3 networks: - rabbitmq-net environment: - RABBITMQ_ERLANG_COOKIE=secretcookie - RABBITMQ_NODENAME=rabbit@rabbitmq3 ports: - "15673:15672" # RabbitMQ Management plugin UI - "5673:5672" # RabbitMQ AMQP port volumes: - rabbitmq3-data:/var/lib/rabbitmq deploy: replicas: 1 restart_policy: condition: on-failure networks: rabbitmq-net: driver: bridge volumes: rabbitmq1-data: rabbitmq2-data: rabbitmq3-data: |
Объяснение:
- Три RabbitMQ сервера (rabbitmq1, rabbitmq2, rabbitmq3):
- Для каждого контейнера создается отдельный сервис RabbitMQ.
- Каждому сервису назначается свой
hostname
и уникальное имя узла (RABBITMQ_NODENAME
). - Устанавливается одинаковый
RABBITMQ_ERLANG_COOKIE
для всех узлов. Это необходимо для того, чтобы узлы RabbitMQ могли общаться между собой и образовывать кластер.
- Порты:
- Каждый контейнер открыт для использования порта AMQP (5672) и порта для RabbitMQ Management Plugin (15672).
- Каждый сервис использует уникальный порт для UI, чтобы избежать конфликтов.
- Сетевые настройки:
- Контейнеры подключаются к общей сети
rabbitmq-net
, чтобы иметь возможность взаимодействовать между собой.
- Контейнеры подключаются к общей сети
- Docker Volumes:
- Каждому контейнеру выделен отдельный том для хранения данных RabbitMQ.
Шаг 2: Создание кластера
После того как контейнеры будут запущены с помощью docker-compose up -d
, необходимо выполнить следующие шаги для создания кластера.
-
Подключитесь к одному из контейнеров RabbitMQ:
12docker exec -it rabbitmq1 bash - В контейнере rabbitmq1 выполните команду для присоединения его к кластеру:
1234rabbitmqctl stop_apprabbitmqctl join_cluster rabbit@rabbitmq2rabbitmqctl start_app - Повторите этот процесс для других узлов, например, для
rabbitmq2
:
12345docker exec -it rabbitmq2 bashrabbitmqctl stop_apprabbitmqctl join_cluster rabbit@rabbitmq1rabbitmqctl start_app - И для
rabbitmq3
:
12345docker exec -it rabbitmq3 bashrabbitmqctl stop_apprabbitmqctl join_cluster rabbit@rabbitmq1rabbitmqctl start_app
Теперь у вас будет работать отказоустойчивый кластер RabbitMQ с тремя узлами.
Шаг 3: Проверка состояния кластера
Для того чтобы убедиться, что кластер настроен корректно, вы можете использовать команду:
1 2 |
rabbitmqctl cluster_status |
Это должно вывести информацию о том, что все три узла успешно присоединились друг к другу.
Заключение
Теперь у вас есть отказоустойчивый кластер RabbitMQ, состоящий из 3-х узлов, с настройками для работы в Docker с использованием Docker Compose.
Recommended Posts
Что такое oneof в Protobuf?
25.04.2024