emqx的集群用nginx去负载,但是客户端连接emqx都连接到同一台服务器中

环境

  • EMQX 版本:4.1.0
  • 操作系统版本:

重现此问题的步骤

  1. docker run --name emqx --restart=always --network host -e EMQX_LISTENER__TCP__EXTERNAL=1883 -e EMQX_NAME=emqx -e EMQX_HOST=10.12.14.208 -e EMQX_MANAGEMENT__LISTENER__HTTP=18080 -e EMQX_CLUSTER__NAME=emqxcl -e EMQX_CLUSTER__DISCOVERY=manual -e EMQX_NODE__DIST_LISTEN_MIN=6369 -e EMQX_NODE__DIST_LISTEN_MAX=7369 -e EMQX_NODE__COOKIE=emqxsecretcookie -v /root/docker/emq/conf/acl.conf:/opt/emqx/etc/acl.conf -v /root/docker/emq/conf/emqx_auth_mysql.conf:/opt/emqx/etc/plugins/emqx_auth_mysql.conf -d emqx/emqx:v4.1.0

  2. 当两台emqx的docker容器都安装好后,执行docker exec -it emqx sh命令进入容器中,进入/opt/emqx/bin目录,执行
    在209上面加入208的集群
    emqx_ctl cluster join emqx@10.12.14.208

  3. nginx负载
    stream {
    upstream mqttCluster {
    server 10.12.14.208:1883 weight=1;
    server 10.12.14.209:1883 weight=5;
    }

    server {
    listen 1883;
    proxy_pass mqttCluster;
    proxy_connect_timeout 30;
    proxy_timeout 60;
    }
    }

实际行为

当用mqttx工具去连接mqtt时,全都连到了同一台服务器上,并没有负载

看你这个个配置是没有问题的。应该是你使用mqttx 只有 少量的连接,所以 nginx 的负载均衡没有那么均匀,推荐你连接 1000 个再看看。

建议:
非常推荐使用升级到 5.8.1,4.1.0 已经过了维护周期了,文档和 bug 修复 都没有最新的好。

负载均衡的配置用例可以参考这个:https://github.com/emqx/emqx-usage-example
最新版本的文档可以参考这个:Load Balance EMQX Cluster with HAProxy | EMQX Docs

我把nginx关了还是一样的效果,比如我208是主节点,209是子节点,配置和不配置nginx负载都会到209子节点上,就感觉nginx的负载没有生效,就像是这个集群自带有负载一样

emqx 软件没有负载负载,都要靠 nginx 或者 ha 来做。

这个主、子节点是什么意思,怎么配置的,我好像不明白emqx 哪里可以配置这东西。

不太清楚你说的是什么意思,不过你跑一下上面的那个 example 就可以看到效果的。

我表达的问题,这个集群中有208和209两个节点,我配置nginx的负载,当mqttx连接208的时候会连接到209上,不配置nginx的负载还是到209上,现在是这个现象

有点懂,但是感觉还是有点迷。
麻烦确定一下:

  1. 你 mqttx 连接的 IP 是多少?应该是你 nginx 的 IP 才对。不是 208,也不是 209
  2. 执行了
    emqx_ctl cluster join emqx@10.12.14.208
    后,在 2 个节点分别再执行一下: emqx_ctl cluster status 确定一下是不是集群组成功了。

你说的

这个情况你是怎么操作不配置 nginx 的,mqttx 连接的 IP 又是哪一个?

所以是不是我上面的配置有问题

stream {
upstream mqttCluster {
server 10.12.14.208:1883 weight=1;
server 10.12.14.209:1883 weight=5;
}

server {
listen 1883;
proxy_pass mqttCluster;
proxy_connect_timeout 30;
proxy_timeout 60;
}
},我nginx配置的server 10.12.14.208:1883 weight=1;
server 10.12.14.209:1883 weight=5;这两个个服务器,mqttx向10.12.14.208发起连接,最后是连接到了209上面,我不配置nginx的这个stream,mqttx向10.12.14.208发起连接,最后还是连接到了209上面

集群是成功了的

好的,我懂了。

  1. nginx 安装在 208 上,监听了 1883 端口。
  2. emqx server 208 上启动成功了,但是因为 208 上的 1883 端口已经被 nginx 占用了,所以端口冲突了。emqx 启动成功,但是监听端口是失败的。可以看一下 它的 emqx 日志。
  3. emqx server 209 启动成功监听到了 1883.

这里的情况就是:

  1. mqttx → 208:1883(nginx) → 209:1883
  2. mqttx → 209:1883
    所以就出现了无论怎样都到了 209 上。

如果你真的在把 nginx 部署在 208 上的话,换一个端口。不要用 1883.不要让他们冲突。

万分感谢感谢,这个问题解决了。还有个问题,我目前是在局域网内部署的,如果是在外网的情况下,两个服务器做集群,配置需要有所更改吗?

都是一样的,就是要公网 IP 就行了。

好的,谢谢