docker-compose创建emqx单机伪集群

这是文件

version: '3.8'
services:
  emqx:
    image: 111test:1443/library/emqx:4.4.18
    container_name: emqx
    restart: always
    user: "${HOST_UID}:${HOST_GID}"
    ports:
      - 1883:1883
      - 8083:8083
      - 8084:8084
      - 8883:8883
      - 18083:18083
    volumes:
      - ./emqx/data:/opt/emqx/data
      - ./emqx/log:/opt/emqx/log
      - ./emqx/etc/emqx_auth_mysql.conf:/opt/emqx/etc/plugins/emqx_auth_mysql.conf
    network_mode: test_network
    environment:
      - EMQX_NODE_NAME=emqx@${HOST_IP}
      - EMQX_NODE_COOKIE=test001
      - EMQX_CLUSTER__DISCOVERY_STRATEGY=static
      - EMQX_CLUSTER__STATIC__SEEDS=[ "emqx@${HOST_IP}", "emqx2@${HOST_IP}"]
      - EMQX_LISTENER__TCP__EXTERNAL=1883
      - EMQX_LISTENER__WS__EXTERNAL=8083
      - EMQX_LISTENER__WSS__EXTERNAL=8084
      - EMQX_LISTENER__SSL__EXTERNAL=8883
      - EMQX_DASHBOARD__LISTENER__HTTP=18083
  emqx2:
    image: 111test:1443/library/emqx:4.4.18
    container_name: emqx2
    restart: always
    user: "${HOST_UID}:${HOST_GID}"
    ports:
      - 1884:1883
      - 8085:8083
      - 8086:8084
      - 8884:8883
      - 18084:18083
    volumes:
      - ./emqx2/data:/opt/emqx/data
      - ./emqx2/log:/opt/emqx/log
      - ./emqx2/etc/emqx_auth_mysql.conf:/opt/emqx/etc/plugins/emqx_auth_mysql.conf
    network_mode: test_network
    environment:
      - EMQX_NODE_NAME=emqx2@${HOST_IP}
      - EMQX_NODE_COOKIE=test001
      - EMQX_CLUSTER__DISCOVERY_STRATEGY=static
      - EMQX_CLUSTER__STATIC__SEEDS=[ "emqx@${HOST_IP}", "emqx2@${HOST_IP}"]
      - EMQX_LISTENER__TCP__EXTERNAL=1883
      - EMQX_LISTENER__WS__EXTERNAL=8083
      - EMQX_LISTENER__WSS__EXTERNAL=8084
      - EMQX_LISTENER__SSL__EXTERNAL=8883
      - EMQX_DASHBOARD__LISTENER__HTTP=18083

env文件

HOST_UID=0 #echo $(id -u)
HOST_GID=0 #echo $(id -g)
HOST_IP=192.168.8.244

启动是没问题的,但是没有组成集群模式,有大佬遇到过吗


image

你有两个container 不可能都叫一个host ip的

那我是随便给个IP吗

不要随便填 IP。单机上的两个容器应使用 Docker 网络内可解析的两个不同名字;
不要写宿主机 IP,也不要硬编码容器 IP。

先用最小配置把集群跑通。它使用独立的 Docker 数据卷,不会读取你原来 ./emqx/data./emqx2/data 里的旧节点数据:

services:
  emqx1:
    image: emqx/emqx:4.4.18
    restart: unless-stopped
    ports:
      - "1883:1883"
      - "8083:8083"
      - "8084:8084"
      - "8883:8883"
      - "18083:18083"
    environment:
      EMQX_NAME: emqx
      EMQX_HOST: node1.emqx.io
      EMQX_NODE__COOKIE: test001
      EMQX_CLUSTER__DISCOVERY: static
      EMQX_CLUSTER__STATIC__SEEDS: "emqx@node1.emqx.io,emqx@node2.emqx.io"
    healthcheck:
      test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
      interval: 5s
      timeout: 25s
      retries: 12
    volumes:
      - emqx1_data:/opt/emqx/data
      - emqx1_log:/opt/emqx/log
    networks:
      emqx-bridge:
        aliases:
          - node1.emqx.io

  emqx2:
    image: emqx/emqx:4.4.18
    restart: unless-stopped
    ports:
      - "1884:1883"
      - "8085:8083"
      - "8086:8084"
      - "8884:8883"
      - "18084:18083"
    environment:
      EMQX_NAME: emqx
      EMQX_HOST: node2.emqx.io
      EMQX_NODE__COOKIE: test001
      EMQX_CLUSTER__DISCOVERY: static
      EMQX_CLUSTER__STATIC__SEEDS: "emqx@node1.emqx.io,emqx@node2.emqx.io"
    healthcheck:
      test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
      interval: 5s
      timeout: 25s
      retries: 12
    volumes:
      - emqx2_data:/opt/emqx/data
      - emqx2_log:/opt/emqx/log
    networks:
      emqx-bridge:
        aliases:
          - node2.emqx.io

networks:
  emqx-bridge:
    driver: bridge

volumes:
  emqx1_data:
  emqx1_log:
  emqx2_data:
  emqx2_log:

启动:

docker compose up -d --wait
docker compose ps
docker compose exec -T emqx1 /opt/emqx/bin/emqx_ctl cluster status
docker compose exec -T emqx2 /opt/emqx/bin/emqx_ctl cluster status

预期两个节点都看到:

Cluster status: #{running_nodes => ['emqx@node1.emqx.io','emqx@node2.emqx.io'],
                  stopped_nodes => []}

你原配置还有三处要一起改:

  • 4.4.18 用 EMQX_CLUSTER__DISCOVERY=static,不是 EMQX_CLUSTER__DISCOVERY_STRATEGY
  • Cookie 用 EMQX_NODE__COOKIE,不是 EMQX_NODE_COOKIE
  • 删除两处 network_mode: test_network,改用上面的 networks 和 DNS alias。

如果必须使用内网镜像,只替换两处 image

image: 111test:1443/library/emqx:4.4.18

先不要挂回旧的 data 目录。节点名已经写入 Mnesia 数据目录,直接拿 emqx@192.168.8.244 的旧数据启动新节点名,容易得到旧节点残留或启动异常。确认新集群正常后,再处理原数据和 MySQL 认证配置。

这套配置已用 emqx/emqx:4.4.18 实际启动验证,两个容器均为 healthy,两个节点的 cluster status 都能看到完整集群。

提示 4.4.18 已过维护周期,快用 5.x 或才 6.x 吧。 :sweat_smile:

好的,感谢哈,另外想了解下,单机伪集群相比单机版,性能提升大概能有个多少

单机伪集群基本不会提升性能,按 0% 或者 -5% 估算更合适,高负载下还可能比单节点更低。

  • 两个容器仍共享同一台主机的 CPU、内存、磁盘和网卡,没有新增硬件资源;
  • 单个 EMQX/Erlang VM 默认已经会使用多核 CPU,拆成两个 VM 不是把算力翻倍;
  • 集群还多了路由表同步、订阅同步和跨节点消息转发开销。

它的用途主要是验证集群配置、节点发现和故障流程,不是真正的性能扩容或高可用;宿主机宕机时两个节点会一起掉。

要提升容量,把节点放到不同物理机或虚拟机上,前面接 LB 分散连接,再用相同的连接数、消息大小、QoS、订阅扇出做单节点/双节点压测。双节点提升多少没有通用百分比,也不会必然线性翻倍。

如果暂时只有这一台机器,直接跑单节点最佳!

好的,了解了,感谢