出现partition后订阅端无法收到消息

环境

  • EMQX 版本:5.6.1
  • 操作系统版本:使用的是docker

重现此问题的步骤

不知道如何复现



今天我们的测试环境发现了mqtt节点无法接受消息现象,我查看了emqx的告警发现了partition错误
这个环境一共只有2台节点emqx1和emqx2
订阅模式是通过分组订阅的,主题类似$share/ctms/device/+/monitor", qos: 1
在partition错误之前,该订阅客户端一直正常工作,可以正常收消息,发生错误后此客户端显示在线状态,但是看log只有心跳log(图2),已经没有收到消息的log
我再去确认集群状态,两个节点都是正常状态

我再尝试把订阅客户端踢下线再连线就恢复正常了

我这里有几个疑问:
1:为什么会出现partition错误,如何预防或者监控
2:节点个数是否不推荐只有2个node,要么3个节点,方便选leader?
3:如果出现partition错误后即使集群显示状态正常,我也应该强制重启所有节点吗?否则就会出现我目前的情况:之前的连接无法收消息(消息也丢了),只能重连恢复

预期行为

2个节点的集群自动从partition错误中恢复后,不影响现有连接的客户端消息收发

实际行为

emqx不会向之前已连接的客户端发消息,并丢失消息,需要客户端重连后才能继续订阅到消息

这个错非常的致命。原因就是节点间网络断断开开(不稳定了)持续了一段时间。这个不一定是你的节点的网络问题,更有可能是节点间的流量太大了,他只有一条 tcp 的路在传输(虽然你的带宽完全没有跑满,但这一根管子已经满了,我的经验是rpc 达到每秒 4W,就容易出现这种问题。)
监控,你得升级到 5.8.6 里面有 alarm 事件,你可以规则引擎把他 webhook 到你的服务止告警。当然也可以用:https://emqx.dev/

2 个也行,如果你的连接数都不超过 10W,用一个16 核的 1节点,都比 2 个 8 核的 2 节点强。
节点多了,出现partition时更难恢复。。。

是的。所有强制重启是最稳的。
如果启动不了,就得找专业的支持了,必竟这个非常的致命。。。