0392
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
-
当两台emqx的docker容器都安装好后,执行docker exec -it emqx sh命令进入容器中,进入/opt/emqx/bin目录,执行
在209上面加入208的集群
emqx_ctl cluster join emqx@10.12.14.208
-
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
0392
3
我把nginx关了还是一样的效果,比如我208是主节点,209是子节点,配置和不配置nginx负载都会到209子节点上,就感觉nginx的负载没有生效,就像是这个集群自带有负载一样
emqx 软件没有负载负载,都要靠 nginx 或者 ha 来做。
这个主、子节点是什么意思,怎么配置的,我好像不明白emqx 哪里可以配置这东西。
不太清楚你说的是什么意思,不过你跑一下上面的那个 example 就可以看到效果的。
0392
5
我表达的问题,这个集群中有208和209两个节点,我配置nginx的负载,当mqttx连接208的时候会连接到209上,不配置nginx的负载还是到209上,现在是这个现象
有点懂,但是感觉还是有点迷。
麻烦确定一下:
- 你 mqttx 连接的 IP 是多少?应该是你 nginx 的 IP 才对。不是 208,也不是 209
- 执行了
emqx_ctl cluster join emqx@10.12.14.208
后,在 2 个节点分别再执行一下: emqx_ctl cluster status 确定一下是不是集群组成功了。
你说的
这个情况你是怎么操作不配置 nginx 的,mqttx 连接的 IP 又是哪一个?
0392
8
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上面
好的,我懂了。
- nginx 安装在 208 上,监听了 1883 端口。
- emqx server 208 上启动成功了,但是因为 208 上的 1883 端口已经被 nginx 占用了,所以端口冲突了。emqx 启动成功,但是监听端口是失败的。可以看一下 它的 emqx 日志。
- emqx server 209 启动成功监听到了 1883.
这里的情况就是:
- mqttx → 208:1883(nginx) → 209:1883
- mqttx → 209:1883
所以就出现了无论怎样都到了 209 上。
如果你真的在把 nginx 部署在 208 上的话,换一个端口。不要用 1883.不要让他们冲突。
0392
11
万分感谢感谢,这个问题解决了。还有个问题,我目前是在局域网内部署的,如果是在外网的情况下,两个服务器做集群,配置需要有所更改吗?