EMQX开源版v5.8.2集群只能接入2个节点吗?

我在一台ubuntu 上安装了docker
Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-47-generic x86_64)

按照下面的官方文档,拉取了emqx的镜像

docker pull emqx/emqx:5.8.2

创建了子网络,并启动和映射了3个docker container
docker network rm emqx-net
docker network create --subnet=172.26.0.0/16 emqx-net

docker run -d --name emqx6 --restart always --net emqx-net --ip 172.26.0.6 -p 1886:1883 -p 8086:8083 -p 18086:18083 emqx/emqx:5.8.2
docker run -d --name emqx7 --restart always --net emqx-net --ip 172.26.0.7 -p 1887:1883 -p 8087:8083 -p 18087:18083 emqx/emqx:5.8.2
docker run -d --name emqx8 --restart always --net emqx-net --ip 172.26.0.8 -p 1888:1883 -p 8088:8083 -p 18088:18083 emqx/emqx:5.8.2

配置 EMQX 集群

进入 emqx6 容器:
docker exec -it emqx6 /bin/sh

将 emqx7 加入 emqx6 集群:
emqx_ctl cluster join emqx@172.26.0.7

root@i0wZ:~#
root@i0wZ:~#
root@i0wZ:~# docker exec -it emqx6 /bin/sh
$
$
$ emqx_ctl cluster join emqx@172.26.0.7
Join the cluster successfully.
Cluster status: #{running_nodes => [‘emqx@172.26.0.6’,‘emqx@172.26.0.7’],
stopped_nodes => }
$
$

将 emqx8 加入 emqx6 集群:
emqx_ctl cluster join emqx@172.26.0.8

$
$
$
$ emqx_ctl cluster join emqx@172.26.0.8
Join the cluster successfully.
Cluster status: #{running_nodes => [‘emqx@172.26.0.6’,‘emqx@172.26.0.8’],
stopped_nodes => }
$
$

上面就出现了bug,‘emqx@172.26.0.8’ 把 ‘emqx@172.26.0.7’ 替换掉了,貌似开源版本的EMQX集群只能2个节点,不能支持3个节点。

再次将 emqx7 加入 emqx6 集群:

$
$
$ emqx_ctl cluster join emqx@172.26.0.7
Join the cluster successfully.
Cluster status: #{running_nodes => [‘emqx@172.26.0.6’,‘emqx@172.26.0.7’],
stopped_nodes => }
$
root@i0wZ:~#
root@i0wZ:~#
root@i0wZ:~#

这里又出现同样的bug,‘emqx@172.26.0.8’ 把 ‘emqx@172.26.0.7’ 替换掉了,无法支持3个节点集群

emqx.log.1.zip (19.5 KB)

这个日志有个问题,日志时间是UTC时间,为啥不是本地时间

root@iZ2Z:~# timedatectl
Local time: Sun 2024-12-01 23:03:19 CST
Universal time: Sun 2024-12-01 15:03:19 UTC
RTC time: Sun 2024-12-01 15:03:19
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

好的,我等下来试试,
不过我一看你的步骤,就得强烈建议你使用 docker-compose 来做。

这个比你自己手动去创建网络,再手动加集群好用多了。

和:GitHub - emqx/emqx-usage-example: Using Docker Compose to show different usages of EMQX

我试了一下,是可以 3 个以上节点的:你应该是有配置没对,要你自己检查一下。
我的办法是:

  1. 通过https://docker.emqx.dev/ 下载一下生产可用的 yml
  2. 扩展单个节点到3 个节点的集群:
    docker-compose.yml.zip (1.3 KB)
 docker-compose up -d --remove-orphans
[+] Running 4/4
 ✔ Network emqx-docker_emqx_bridge  Created                                                                                                                          0.1s
 ✔ Container emqx1                  Started                                                                                                                          0.3s
 ✔ Container emqx2                  Started                                                                                                                          0.4s
 ✔ Container emqx3                  Started                                                                                                                          0.3s
➜  emqx-docker orbd emqx
➜  emqx-docker
➜  emqx-docker docker ps
CONTAINER ID   IMAGE                                                            COMMAND                  CREATED         STATUS                            PORTS                                                                                                                                       NAMES
c43b1c2840bf   emqx/emqx:latest                                                 "/usr/bin/docker-ent…"   6 seconds ago   Up 5 seconds (healthy)            4370/tcp, 5369/tcp, 8083-8084/tcp, 8883/tcp, 0.0.0.0:1884->1883/tcp, [::]:1884->1883/tcp, 0.0.0.0:18084->18083/tcp, [::]:18084->18083/tcp   emqx2
f8a8008f93d8   emqx/emqx:latest                                                 "/usr/bin/docker-ent…"   6 seconds ago   Up 5 seconds (health: starting)   4370/tcp, 5369/tcp, 8083-8084/tcp, 0.0.0.0:1883->1883/tcp, :::1883->1883/tcp, 0.0.0.0:18083->18083/tcp, :::18083->18083/tcp, 8883/tcp       emqx1
8b9888a67fca   emqx/emqx:latest                                                 "/usr/bin/docker-ent…"   6 seconds ago   Up 5 seconds (health: starting)   4370/tcp, 5369/
  1. 进入每个节点查看状态:
 orbd emqx
container_id: c43b1c2840bf
NEW: OrbStack Debug Shell provides useful commands & tools, making it easy to debug any container (even minimal/distroless).
It also allows installing over 80,000 packages.

To use Debug Shell, get a Pro license: https://orbstack.dev/pricing

Learn more: https://go.orbstack.dev/debug

emqx@docker2:/opt/emqx$ ./bin/emqx ctl cluster status
Cluster status: #{running_nodes =>
                      ['emqx@docker1.emqx.dev','emqx@docker2.emqx.dev',
                       'emqx@docker3.emqx.dev'],
                  stopped_nodes => []}

我需要在ECS上创建1~9个EMQX docker 容器, 并且要能与其它多个ECS进行内网通信,进行测试,手动方式可能更方便些。

感觉执行这个指令,可能有bug
emqx_ctl cluster join emqx@172.26.0.8

要跨机器建集群,千万不要用裸的 docker。
可以选择:

  • 直接在 ecs 上安装 emqx(直接不用 docker)
  • k8s

个人推荐方案一,直接在 ecs 上直接装(ecs 上都能连网了,依赖安装应该很简单才对)

确定,我刚才也试了一下这个,一样的。
你先用 static 来避免一下这个问题:


确实ECS直接部署EMQX要简单的多。我是怕遇到问题,需要重置各台ECS的操作系统,拿了一台ECS来用docker测试集群效果,没想到碰到这个问题了。

第一次遇到开源的项目,做了web后台且体验极好,就是你们的EMQX了,以后多跟你们交流学习。

更正一下:不是 bug,只是体验问题。后续会优化。
在手动模式下,A,B,C 三个节点。
1.当在 A 节点上执行了./bin/emqx ctl cluster join B
会变成 A 节点主动加入 B 所在的集群。AB 组成一个集群。
2. 再在 A 节点主主动加入 C 节点,就会执行:A 离开原来的集群,加入 C 集群。
这时就会 AC 组成集群。


所以正确的组成集群方式应该是:
1.在 A 节点上执行./bin/emqx ctl cluster join B
2. 在 C 节点上执行./bin/emqx ctl cluster join B
3. ABC 就成了一个集群。
后续可能考虑会优化这个命令成:在 A 节点上执行./bin/emqx ctl cluster join B 时会先检查 A 节点是否在一个集群中,如果在的话,就不执行。否则太危险了。

好的 多谢!