docker 集群部署失败

两台公网云服务器docker配置分别为:

  emqx:
    image: emqx:5.4.1
    container_name: emqx
    environment:
      EMQX_NODE_NAME: emqx@sg1.emqx.xxx.top
      EMQX_CLUSTER__DISCOVERY_STRATEGY: static
      EMQX_NODE__COOKIE: aaa
      EMQX_CLUSTER__STATIC__SEEDS: sg1.emqx.xxx.top,cn1.emqx.xxx.top
    volumes:
      - ./images/app/emqx/data:/opt/emqx/data
      - ./images/logs/emqx:/opt/emqx/log
    networks: 
      kdznnet:
        aliases:
          - sg1.emqx.xxx.top
          - emqx
    ports:
      - 1883:1883
      - 8083:8083
      - 8084:8084
      - 8883:8883
      - 18083:18083 
  emqx:
    image: emqx:5.4.1
    container_name: emqx
    environment:
      EMQX_NODE_NAME: emqx@cn1.emqx.xxx.top
      EMQX_NODE__COOKIE: aaa
      EMQX_CLUSTER__DISCOVERY_STRATEGY: static
      EMQX_CLUSTER__STATIC__SEEDS: sg1.emqx.xxx.top,cn1.emqx.xxx.top
    networks: 
      kdznnet:
        aliases:
          - cn1.emqx.xxx.top
          - emqx
    ports:
      - 1883:1883
      - 8083:8083
      - 8084:8084
      - 8883:8883
      - 18083:18083 

通过:

docker exec -it emqx sh -c "emqx_ctl cluster status"

Cluster status: #{running_nodes => ['emqx@cn1.emqx.kdzn.top'],
                  stopped_nodes => []}

logs

EMQX_RPC__PORT_DISCOVERY [rpc.port_discovery]: manual
EMQX_CLUSTER__STATIC__SEEDS [cluster.static.seeds]: sg1.emqx.xxx.top,cn1.emqx.xxx.top
EMQX_CLUSTER__DISCOVERY_STRATEGY [cluster.discovery_strategy]: static
EMQX_NODE__COOKIE [node.cookie]: ******
EMQX_NODE__NAME [node.name]: emqx@cn1.emqx.xxx.top
Listener ssl:default on 0.0.0.0:8883 started.
Listener tcp:default on 0.0.0.0:1883 started.
Listener ws:default on 0.0.0.0:8083 started.
Listener wss:default on 0.0.0.0:8084 started.
Listener http:dashboard on :18083 started.
EMQX 5.4.1 is running now!

改成dns a 记录的方式也是没效果

  emqx:
    image: emqx:5.4.1
    container_name: emqx
    environment:
      EMQX_NODE_NAME: emqx@sg1.emqx.xxx.top
      EMQX_NODE__COOKIE: aaa
      EMQX_CLUSTER__DISCOVERY_STRATEGY: dns
      EMQX_CLUSTER__DNS__NAME: emqx.xxx.top
      EMQX_CLUSTER__DNS__RECORD_TYPE: a
    volumes:
      - ./images/app/emqx/data:/opt/emqx/data
      - ./images/logs/emqx:/opt/emqx/log
    networks: 
      kdznnet:
        aliases:
          - sg1.emqx.xxx.top
          - emqx
    ports:
      - 1883:1883
      - 6883:6883
      - 8083:8083
      - 8084:8084
      - 8883:8883
      - 18083:18083 
  emqx:
    image: emqx:5.4.1
    container_name: emqx
    environment:
      EMQX_NODE_NAME: emqx@cn1.emqx.xxx.top
      EMQX_NODE__COOKIE: aaa
      EMQX_CLUSTER__DISCOVERY_STRATEGY: dns
      EMQX_CLUSTER__DNS__NAME: emqx.xxx.top
      EMQX_CLUSTER__DNS__RECORD_TYPE: a
    networks: 
      kdznnet:
        aliases:
          - cn1.emqx.xxx.top
          - emqx
    ports:
      - 1883:1883
      - 6883:6883
      - 8083:8083
      - 8084:8084
      - 8883:8883
      - 18083:18083 

请参考 Docker | EMQX 文档

此外看起来是你的 compose 文件写的不对

  • 两个 service 名字一样
  • 导出端口时占用了相同的 host 端口号

我的两个节点是分开在不同的公网云服务器上,共用一个名称和端口也是不行的是吧?

另外两个node_name后面是有差异的,一个是sg1,一个是cn1

分开在不同的公网云服务器上可以导出相同端口,使用相同名称

是不是两台云主机上的 docker network 网络不互通?

seeds 是不是应该用 node name [emqx@cn1.emqx.xxx.top]:

docker run -d \
    --name emqx2 \
    -e "EMQX_NODE_NAME=emqx@node2.emqx.com" \
    -e "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" \
    -e "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.com,emqx@node2.emqx.com]" \
    --network emqx-bridge \
    --network-alias node2.emqx.com \
    emqx/emqx:5.4.1

static_seeds 应是节点名列表

我刚打开了debug日志,有这个错误:
2024-01-24T18:11:26.201474+08:00 [debug] Ekka(AutoCluster): join result: ignore mfa: undefined
2024-01-24T18:11:26.201569+08:00 [info] Ekka(AutoCluster): discovered nodes are not responding: [‘emqx@1.222.222.22’,‘emqx@101.32.170.22’] mfa: undefined

需要确保那些端口是正常的? 云服务器防火墙现在是全端口开放的,docker映射的端口列表是:
- 1883:1883
- 6883:6883
- 8083:8083
- 8084:8084
- 8883:8883
- 18083:18083

两个 EMQX 节点之间集群,网络应该走 docker network
expose 端口只是为了外部客户端访问 host

在这两台机器上还有其他的 emqx 节点在运行么?
两台机器上分别执行下看看呢?

docker container ls -a

应该不是seeds 配置参数问题,看日志已经识别到两台服务器了,docker 的enviroment 参数 没加引号,数组好像是用 , 方式隔开表示数组的

节点1:

CONTAINER ID   IMAGE                           COMMAND                  CREATED       STATUS       PORTS                                                                                                                                                                                                                                                                                                      NAMES
f493bf8980be   emqx:5.4.1                      "/usr/bin/docker-ent…"   2 hours ago   Up 2 hours   4370/tcp, 0.0.0.0:1883->1883/tcp, :::1883->1883/tcp, 0.0.0.0:6883->6883/tcp, :::6883->6883/tcp, 0.0.0.0:8083-8084->8083-8084/tcp, :::8083-8084->8083-8084/tcp, 0.0.0.0:8883->8883/tcp, :::8883->8883/tcp, 0.0.0.0:18083->18083/tcp, :::18083->18083/tcp, 5369/tcp                                          emqx

节点2:

578d007f782c   emqx:5.4.1            "/usr/bin/docker-ent…"   2 hours ago   Up 2 hours   4370/tcp, 0.0.0.0:1883->1883/tcp, :::1883->1883/tcp, 0.0.0.0:6883->6883/tcp, :::6883->6883/tcp, 0.0.0.0:8083-8084->8083-8084/tcp, :::8083-8084->8083-8084/tcp, 0.0.0.0:8883->8883/tcp, :::8883->8883/tcp, 0.0.0.0:18083->18083/tcp, :::18083->18083/tcp, 5369/tcp     

每台服务器只有一个emqx节点

但是你seeds 没有EMQX_NAME 啊, 你先按照官方node_name 去配置seeds 集群先别犟 :laughing:

了解。


是不是两台云主机上的 docker network 网络不互通?

现在是需要让两个 docker 容器跨主机通信进行集群。所以需要检查 overlay 网络是不是正常工作的。

不好意思,前面我理解错了您说的问题点,确实seeds里面的node_name那里我写的是有问题的 :sweat_smile:

现在问题解决了吗

还没有的,等成功了,我回复您哈,
还在检测两台服务器网络互通情况

@seqwait @JimMoen 谢谢两位大佬的帮助,问题解决了,

static方式集群失败的原因是我seeds 里面的node_name 写错了

dns方式集群失败的原因是EMQX_NODE_NAME 方式不对,从emqx@sg1.emqx.xx.top这种名称@域名的风格改为:emqx@1.1.1.1,名称@ip地址就成功了

我也遇到一样的问题了
version: ‘3’
services:
emqx1:
image: emqx/emqx:5.5.0
environment:
- “EMQX_NODE_NAME=emqx02@外网ip”
- “EMQX_CLUSTER__DISCOVERY_STRATEGY=static”
- “EMQX_CLUSTER__STATIC__SEEDS=[emqx01@外网ip,emqx02@外网ip]”
ports:
- 1883:1883
- 8031:1883
- 8083:8083
- 8084:8084
- 8883:8883
- 18083:18083
healthcheck:
test: [“CMD”, “/opt/emqx/bin/emqx_ctl”, “status”]
interval: 5s
timeout: 25s
retries: 5