Docker-Swarm с RabbitMQ Autocluster

Мы столкнулись со следующей проблемой: Как запустить RabbitMQ в Docker-Swarm с постоянными данными.

В настоящее время у нас следующая установка:

  • Docker-Swarm 3 узла
  • GlusterFS как реплицированная файловая система между всеми узлами
  • RabbitMQ с Consul Image: gavinmroy/alpine-rabbitmq-autocluster

Это работает в большинстве случаев хорошо... но теперь нам нужно использовать долговечные очереди для сохранения данных.

Мы пытались использовать --hostnames или установить RABBITMQ_NODENAME, тогда мы получаем подкаталог для каждого запущенного узла, например "rabbit@CONTAINERID" Проблема: при перезапуске контейнеров для сохранения данных используется новая папка (новый ContainerID)... есть предложения, как получить рабочую установку с использованием возможностей Docker Swarm?

.
3
задан 24 August 2017 в 10:02
1 ответ

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

docker-compose.yaml:

version: "3.6"

services:
rabbitmq-01:
    image: rabbitmq:3.8-management
    hostname: rabbitmq-01
    environment:
    - RABBITMQ_ERLANG_COOKIE=<erlang-cookie-value>
    secrets:
    - source: main-config
        target: /etc/rabbitmq/rabbitmq.conf
    configs:
    - source: definitions
        target: /etc/rabbitmq/definitions.json
    networks:
    - main
    - consul_main
    volumes:
    - rabbitmq-01-data:/var/lib/rabbitmq
    deploy:
    mode: global
    placement:
        constraints: [node.labels.rabbitmq1 == true]

rabbitmq-02:
    image: rabbitmq:3.8-management
    hostname: rabbitmq-02
    environment:
    - RABBITMQ_ERLANG_COOKIE=<erlang-cookie-value>
    secrets:
    - source: main-config
        target: /etc/rabbitmq/rabbitmq.conf
    configs:
    - source: definitions
        target: /etc/rabbitmq/definitions.json
    networks:
    - main
    - consul_main
    volumes:
    - rabbitmq-02-data:/var/lib/rabbitmq
    deploy:
    mode: global
    placement:
        constraints: [node.labels.rabbitmq2 == true]

rabbitmq-03:
    image: rabbitmq:3.8-management
    hostname: rabbitmq-03
    environment:
    - RABBITMQ_ERLANG_COOKIE=<erlang-cookie-value>
    secrets:
    - source: main-config
        target: /etc/rabbitmq/rabbitmq.conf
    configs:
    - source: definitions
        target: /etc/rabbitmq/definitions.json
    networks:
    - main
    - consul_main
    volumes:
    - rabbitmq-03-data:/var/lib/rabbitmq
    deploy:
    mode: global
    placement:
        constraints: [node.labels.rabbitmq3 == true]

secrets:
main-config:
    file: secret.rabbitmq.conf

configs:
definitions:
    file: definitions.json

networks:
main:
consul_main:
    external: true

volumes:
rabbitmq-01-data:
rabbitmq-02-data:
rabbitmq-03-data:

rabbitmq.conf:

# The standard config that each cluster member gets
default_user = rmqadmin
# TODO Might wanna encrypt or use Docker secret into an env var
default_pass = <password>

default_vhost = /

loopback_users.admin = false

cluster_formation.peer_discovery_backend = rabbit_peer_discovery_consul
cluster_formation.consul.host = consul.server
cluster_formation.node_cleanup.only_log_warning = true
cluster_formation.consul.svc_addr_auto = true
cluster_formation.consul.svc = rabbitmq-config-file

cluster_partition_handling = autoheal

# Flow Control is triggered if memory usage above %80.
vm_memory_high_watermark.relative = 0.8

# Flow Control is triggered if free disk size below 5GB.
disk_free_limit.absolute = 5GB

management.load_definitions = /etc/rabbitmq/definitions.json

definitions.json экспортировано из https://your-rabbitmq-admin-ui/api/definitions

Обратите внимание, что rabbitmqs развертываются в «глобальном» режиме, а затем ограничиваются метками узлов.

В нашем кластере есть три узла с меткой «rabbitmqX», например:

$ dt node inspect node01 | grep -i -C 20 label
[
    {
        ...
        "Spec": {
            "Labels": {
                "rabbitmq1": "true"
            },
        },
        ...
    }

Один с «rabbitmq1»: «true», другой с «rabbitmq2»: «true», последний с «rabbitmq3» : "истинный".

Таким образом, один экземпляр RMQ развертывается на каждом из этих трех узлов, поэтому мы получаем кластер RMQ из трех узлов с одним узлом на каждом из трех членов Docker Swarm.

Установлен Consul, доступный на «consul.server» для использования узлами RMQ в качестве серверной части кластера.

Это решит проблему, связанную с тем, что RMQ использует имена хостов своих контейнеров для создания своих каталогов данных, поскольку имена хостов фиксируются как «rabbitmq-0X» в файле docker-compose.

Надеюсь, это поможет всем, кто зайдет!

Найдите это на https://github.com/olgac/rabbitmq

0
ответ дан 7 July 2021 в 11:39

Теги

Похожие вопросы