首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用副本参数部署到Docker上时,RabbitMQ集群的非resovalbe主机名

当使用副本参数部署到Docker上时,RabbitMQ集群的非resovalbe主机名
EN

Stack Overflow用户
提问于 2020-10-15 20:19:08
回答 1查看 722关注 0票数 2

我使用Docker部署了3个RabbitMQ和领事实例,以便进行对等发现。

代码语言:javascript
复制
version: '3.7'

services:
  rabbitmq-1:
    image: rabbitmq:3.8.9-alpine
    hostname: "rabbitmq-1"
    environment:
      - RABBITMQ_ERLANG_COOKIE="SECRET_COOKIE"
    networks:
      - prod-net
    configs:
      - source: rabbitmq-config
        target: /etc/rabbitmq/rabbitmq.conf
      - source: rabbitmq-plugins-config
        target: /etc/rabbitmq/enabled_plugins
    volumes:
      - /shared/rabbitmq/1/config:/etc/rabbitmq
      - /shared/rabbitmq/1/data:/var/lib/rabbitmq
    deploy:      
      replicas: 1

  rabbitmq-2:
    image: rabbitmq:3.8.9-alpine
    hostname: "rabbitmq-2"
    environment:
      - RABBITMQ_ERLANG_COOKIE="SECRET_COOKIE"
    networks:
      - prod-net
    configs:
      - source: rabbitmq-config
        target: /etc/rabbitmq/rabbitmq.conf
      - source: rabbitmq-plugins-config
        target: /etc/rabbitmq/enabled_plugins
    volumes:
      - /shared/rabbitmq/2/config:/etc/rabbitmq
      - /shared/rabbitmq/2/data:/var/lib/rabbitmq
    deploy:      
      replicas: 1

  rabbitmq-3:
    image: rabbitmq:3.8.9-alpine
    hostname: "rabbitmq-3"
    environment:
      - RABBITMQ_ERLANG_COOKIE="SECRET_COOKIE"
    networks:
      - prod-net
    configs:
      - source: rabbitmq-config
        target: /etc/rabbitmq/rabbitmq.conf
      - source: rabbitmq-plugins-config
        target: /etc/rabbitmq/enabled_plugins
    volumes:
      - /shared/rabbitmq/3/config:/etc/rabbitmq
      - /shared/rabbitmq/3/data:/var/lib/rabbitmq
    deploy:      
      replicas: 1

networks:
  consul-net:
    external: true
    name: prod-net

configs:
  rabbitmq-config:
    external: true
  rabbitmq-plugins-config:
    external: true

RabbitMQ通过主机名向领事注册自己,这样节点就可以彼此发现。因此,所有主机名都必须在所有节点上解析。在上面的示例中,我对主机名和服务名都使用了相同的值来实现这一点。但是,我想使用一种更紧凑的方式来使用replicas: 3参数来表示集群。

代码语言:javascript
复制
version: '3.7'

services:
  rabbitmq:
    image: rabbitmq:3.8.9-alpine
    hostname: "rabbitmq-{{.Task.Slot}}"
    networks:
      - prod-net
    configs:
      - source: rabbitmq-config
        target: /etc/rabbitmq/rabbitmq.conf
      - source: rabbitmq-plugins-config
        target: /etc/rabbitmq/enabled_plugins
    deploy:      
      replicas: 3
      restart_policy:
        condition: any

networks:
  prod-net:
    external: true

configs:
  rabbitmq-config:
    external: true
  rabbitmq-plugins-config:
    external: true

可悲的是,在这种情况下,主机名不再可以由码头DNS解析,并且节点之间无法看到对方。有办法做到这一点吗?

编辑1:

在rabbitmq-config中使用这些方法会出现以下错误:

代码语言:javascript
复制
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_dns
cluster_formation.dns.hostname = tasks.rabbitmq
代码语言:javascript
复制
2020-10-15 22:06:01.573 [error] <0.272.0> attempted to contact: ['rabbit@rabbitmq-3','rabbit@rabbitmq-2']
2020-10-15 22:06:01.574 [error] <0.272.0> rabbit@rabbitmq-3:
2020-10-15 22:06:01.574 [error] <0.272.0>   * unable to connect to epmd (port 4369) on rabbitmq-3: couldn't resolve hostname
2020-10-15 22:06:01.574 [error] <0.272.0> rabbit@rabbitmq-2:
2020-10-15 22:06:01.575 [error] <0.272.0>   * unable to connect to epmd (port 4369) on rabbitmq-2: couldn't resolve hostname

编辑2:使用领事对等发现的 rabbitmq.conf

代码语言:javascript
复制
# Credentials
default_user = admin
default_pass = Pa$$w0rd1

loopback_users.admin = false
vm_memory_high_watermark.absolute = 1024MiB
disk_free_limit.absolute = 5GB
loopback_users.guest = false

# TLS Support in RabbitMQ
listeners.ssl.default = 5671

# Disables non-TLS listeners, only TLS-enabled clients will be able to connect
listeners.tcp = none

ssl_options.cacertfile = /etc/rabbitmq/ca_certificate.pem
ssl_options.certfile   = /etc/rabbitmq/server_certificate.pem
ssl_options.keyfile    = /etc/rabbitmq/server_key.pem
ssl_options.password   = Pa$$phr@se
ssl_options.verify     = verify_peer
ssl_options.fail_if_no_peer_cert = true

# TLS Support in RabbitMQ UI
management.ssl.port       = 15671
management.ssl.cacertfile = /etc/rabbitmq/ca_certificate.pem
management.ssl.certfile   = /etc/rabbitmq/server_certificate.pem
management.ssl.keyfile    = /etc/rabbitmq/server_key.pem
management.ssl.password   = Pa$$phr@se
management.ssl.verify     = verify_none
management.ssl.fail_if_no_peer_cert = false

management.ssl.honor_cipher_order   = true
management.ssl.honor_ecc_order      = true
management.ssl.client_renegotiation = false
management.ssl.secure_renegotiate   = true

cluster_partition_handling = autoheal

# Consul peer discovery
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_consul

# Consul host (hostname or IP address)
cluster_formation.consul.host = consul_client

# Service name (as registered in Consul) defaults to "rabbitmq"
cluster_formation.consul.svc = rabbitmq

# Compute service address (if not specify it below) 
cluster_formation.consul.svc_addr_auto = true
cluster_formation.consul.use_longname = true
cluster_formation.consul.svc_ttl = 50
cluster_formation.consul.deregister_after = 100
cluster_formation.node_cleanup.only_log_warning = true

或者使用DNS对等发现:

代码语言:javascript
复制
#DNS Peer Discovery
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_dns
cluster_formation.dns.hostname = tasks.rabbitmq
EN

回答 1

Stack Overflow用户

发布于 2021-08-15 13:58:24

为了实现RabbitMQ副本之间的DNS解析,需要修改每个RabbitMQ容器的/etc/hosts

这将允许通过rabbtimq配置文件形成RabbitMQ集群。

参见如何使用单码头群服务创建RabbitMQ集群上的演示。为了简单起见,我从rabbitmq.conf中删除了对领事和TLS的引用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64379098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档