EMQ4.3.22 同一个clientid不会takeover, 客户端disconnect的时候反而会takeover

环境

  • EMQX 版本:4.3.22
  • 操作系统版本:CENTOS7

重现此问题的步骤

这个时间点没有连接,反而进了takeover

这个时间点有连接了,反而不进takeover了。

数据库里面存的消息

没理解12图的对比,下的表述

”这个时间点没有连接,反而进了takeover, 这个时间点有连接了,反而不进takeover了。“

从第一张图的来看,这个客户端ID连接了俩次,第一次的外网下客户端的端口是 31141,新的链接的端口是 31264,但他们 Clientid 相同,所以新的把旧的踢下线了。才有你图1的2,3,4行日志打印说 这个端口的客户端被takeover断开了。

这是符合预期的

6:37:43 这个时间点应该是没有连接的吧,因为31141已经在14:37:10 (UTC+8,时间UTC时间应该是6:37:10)keepalive timeout了。

所以这是我的第一个问题,为什么 6:37:43 这个时间点会进takeover

到了6:37:45这个时间点有个连接连上来,按我理解,这时候6:37:43连上了的连接不是已经存在了吗?这时候不是应该进入takeover么?但是看日志好像他直接进入连接。

你的意思是 6:37:45 这个连接时导致 6:37:43 这个takeover日志的原因?不可能吧,差2秒钟呢,中间除了PINGREQ和PINGRESP就没有其他日志了

第一张图,第一行日志。

RECV CONNECT(...

就表示 EMQX 收到了新的链接请求了,一旦认证成功就会进行takeover等流程。具体你可以根据客户端的端口号,来区分那个日志是那条链接的。例如下面这俩个示例:

JBVT***@109.38.135.114:31141
JBVT***@109.38.135.114:31264

虽然 ClientID 相同,但是是分别来自 31141 和 31264 这俩个端口的不同的链接进程

好的,明白你意思。

但是我继续往下看日志之后发现一个很有趣的情况

2024-08-24T06:37:59 过了十几秒钟,客户端又连了一个上来,这时候服务器没有进行takeover的过程,31264 和 31141 都没有心跳了,但是我没有收到 31264 offline的消息

理论上,只要是同名的客户端都会踢出的。

可以检查下历史的日志看看这里是否在 31265 上来之前,就断开了。

没有断开的日志,这段时间这个clientid只有这些日志了,剩下的都是心跳了。