Мы столкнулись со следующей проблемой: Как запустить RabbitMQ в Docker-Swarm с постоянными данными.
В настоящее время у нас следующая установка:
Это работает в большинстве случаев хорошо... но теперь нам нужно использовать долговечные очереди для сохранения данных.
Мы пытались использовать --hostnames или установить RABBITMQ_NODENAME, тогда мы получаем подкаталог для каждого запущенного узла, например "rabbit@CONTAINERID" Проблема: при перезапуске контейнеров для сохранения данных используется новая папка (новый ContainerID)... есть предложения, как получить рабочую установку с использованием возможностей Docker Swarm?
.Хотя это было бездействующим в течение некоторого времени: это то, что мы используем.
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