求助:开源版 5.8.9 版本EMQX集群在通过API kick用户时出现kicked_an_unknown_session

环境说明:

操作系统: Alibaba Cloud Linux 3.2104 U13.4 (OpenAnolis Edition)
内核版本: 5.10.134-19.8.al8.x86_64 
系统架构: x86_64
软件版本: 开源版本 5.8.9
接口地址: 127.0.0.1:18083/api/v5/clients/<clientId>

情况说明:

  1. 通过接口剔除EMQX在线用户时,一个clientId会产生几十条的kicked_an_unknown_session日志.
  2. 再次使用接口剔除同一个clientId情况未改变,还是会产生几十条的kicked_an_unknown_session日志.

统计现有多个区域不同部署方案发现:单节点未出现该情况,三节点或者多节点集群均存在.

以下为部分日志和统计截图信息:

日志为集群节点中的一台.

{"time":"2026-11-10T18:20:40.704476+08:00","level":"warning","msg":"kicked_an_unknown_session","clientid":"im@658665fcf40c4134adffa863565f069c","pid":"<0.18939014.0>","line":648}
{"time":"2026-11-10T18:20:40.805029+08:00","level":"warning","msg":"kicked_an_unknown_session","clientid":"im@6ad7517665b24729a8cf733fd594182b","pid":"<0.19046624.0>","line":648}
{"time":"2026-11-10T18:20:40.855158+08:00","level":"warning","msg":"kicked_an_unknown_session","clientid":"im@0a5986ac1aab48db8df7c2137e18c016","pid":"<0.19046567.0>","line":648}
{"time":"2026-11-10T18:20:40.906157+08:00","level":"warning","msg":"kicked_an_unknown_session","clientid":"im@dcfde166d7f0474289f4a69eaf78e4ab","pid":"<0.19046532.0>","line":648}
{"time":"2026-11-10T18:20:40.957443+08:00","level":"warning","msg":"kicked_an_unknown_session","clientid":"im@7fbb9055372e4d1796d8a3ab431156a8","pid":"<0.19046543.0>","line":648}
{"time":"2026-11-10T18:59:24.835592+08:00","level":"warning","msg":"kicked_an_unknown_session","clientid":"yiaVDvKOonU5tqvd","pid":"<0.19076768.0>","line":648}
{"time":"2026-11-10T19:05:43.221721+08:00","level":"warning","msg":"kicked_an_unknown_session","clientid":"1043631F-CF72-4BFA-83AF-76985EBE918A","pid":"<0.19083001.0>","line":648}
{"time":"2026-11-10T19:10:25.255646+08:00","level":"warning","msg":"kicked_an_unknown_session","clientid":"im@aac1c94a30f04e7dbb95cfb0ac2e70d7","pid":"<0.19086953.0>","line":648}
{"time":"2026-11-10T19:10:51.057152+08:00","level":"warning","msg":"kicked_an_unknown_session","clientid":"im@0aba053e69ea47c181547122c8a5ac2e","pid":"<0.19087720.0>","line":648}
{"time":"2026-11-10T19:23:34.685365+08:00","level":"warning","msg":"kicked_an_unknown_session","clientid":"A83496C4-25B8-48A4-A2C1-EF347ACD95A3","pid":"<0.19100348.0>","line":648}

截图为EMQX集群最近1小时内出现kicked_an_unknown_session的情况。

看了下 5.8.9 的实现,这条 kicked_an_unknown_session 表示执行踢出时没有查到对应的客户端通道,不一定表示踢出失败。

单客户端踢出接口在集群中逐节点执行,前面的调用已经把客户端踢掉后,后续节点再查可能查不到,从而打印这条 warning。

但三节点下一次请求出现几十条,还需要进一步确认。

方便选一个 ClientID,在测试环境复现一次并补充以下信息吗?

  1. 单次 DELETE 的开始、结束时间及 HTTP 返回码,调用方是否有重试;
  2. 同一时间段内该 ClientID 在各节点上的原始日志,以及实际发出的请求次数;
  3. 客户端是否自动重连,踢出前后查询到的连接状态和所在节点。

图中的数量看起来是近一小时的聚合结果,需要结合单次请求日志区分重复调用、重连或日志采集重复等情况。另外,即使接口返回 204,也需要确认客户端连接是否实际断开(我觉得应该是断开了的)

测试环境说明

1. 本地使用Alibaba Cloud Linux 3创建了三个虚拟机搭建三节点的开源版5.8.9集群.
2. 登录5000个客户端,每个客户端sub一个topic,仅登录+订阅无发包.

单个踢除

使用APIFOX/shell调用接口进行踢除操作,具体命令如下:

curl --location --request DELETE 'http://10.10.1.1/api/v5/clients/benchmark@ff94183f-f6db-7a48-5427-e1170555c03b' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Authorization: Basic YWRtaW46Nk9kMWVjYU5yUkdjNvWE0=' \
--header 'Accept: */*' \
--header 'Host: 10.10.1.1' \
--header 'Connection: keep-alive'
  1. 执行接口调用一次,无重试,响应状态码: 204.
  2. 同一时间其中一个节点出现只出现一条kicked_an_unknown_session
  3. 踢除之后客户端实际离线,未重连.

批量踢除

以下为批量踢除shell代码:

# cat clientID.txt 
benchmark@ae0b36b6-404f-18bd-a03c-f0014462f1cd
...
benchmark@3e9d651f-f520-4ae5-c20f-1fe31aac8ab4
# wc -l clientID.txt 
36 clientID.txt
# for i in `cat clientID.txt`;do echo "--> kick $i";curl -XDELETE "http://10.10.1.1/api/v5/clients/$i" --header 'Authorization: Basic YWRtaW46Nk9kMWVjYU5yUkdjNvWE0=';done
--> kick benchmark@ae0b36b6-404f-18bd-a03c-f0014462f1cd
--> kick benchmark@859f0b2e-e234-4eed-2e11-5a11350dd326
--> kick benchmark@806d82e9-7207-d264-5b00-181506436079
--> kick benchmark@d1e34693-9553-56d5-b66f-4c3c87670537
--> kick benchmark@ee7faafd-cca2-239c-0ed1-e51e7d95f581
--> kick benchmark@da6d3657-2f52-9814-05f0-857a1d3014bc
--> kick benchmark@ed85c522-c3ce-dd23-99d8-f3334dd9f47f
--> kick benchmark@488d623d-ccd9-15db-c6be-d0fe59a5ee20
--> kick benchmark@774c95bb-de2c-b74e-450a-dae105a3b3dc
--> kick benchmark@cb64595b-eacd-e8b8-f998-e8ead3648ecb
--> kick benchmark@abf07660-1a75-9aeb-41bd-68df7af5d05d
--> kick benchmark@98b1ff6e-fac3-8a41-a07e-04ead11cda27
--> kick benchmark@6e9c1916-4293-2550-538c-2c3f8726e045
--> kick benchmark@def0ecd3-2ee8-3991-0314-85d07e583dd7
--> kick benchmark@19bde69f-e1da-dfc7-9cee-41b4dff1a91a
--> kick benchmark@3d8887be-52a2-6eea-f529-c60a83c08e95
--> kick benchmark@cf803f1d-7732-557a-e609-4453bb9bf94f
--> kick benchmark@b0349493-e275-0855-6771-ada261258e6f
--> kick benchmark@06429a35-119f-ae03-3fb9-c93f9b424521
--> kick benchmark@7f6e37bb-758c-b8f7-b322-088ddb580532
--> kick benchmark@fe902c04-8597-3b13-b155-19d4d91b8fbb
--> kick benchmark@f3d7e6e4-493a-b5ac-9268-390a3dee4b31
--> kick benchmark@0b8f9906-1c16-a75e-5487-ac58260c4eb2
--> kick benchmark@d60f4efa-5b2c-d688-51a9-fefb1adfe332
--> kick benchmark@f7f32554-984f-0c38-ee8d-8bbdf1cd6d88
--> kick benchmark@c8b19c23-0a90-640c-614f-c26c8611944d
--> kick benchmark@5dda28a7-8a0c-477b-1b1f-d90ee8d1310c
--> kick benchmark@d9ebbf75-98e8-a503-4804-827bf8ac357a
--> kick benchmark@37ab0487-3b04-f511-5e69-2aca00a9987c
--> kick benchmark@9a596136-99fb-856e-6c08-f10ba1aa468d
--> kick benchmark@5a37debc-c96a-61ac-ec52-0d2c3cb10240
--> kick benchmark@6ca9ac8b-4f88-1a4b-1b5c-7a0650ff4d84
--> kick benchmark@f0d36070-916a-d703-9bcb-320bdb460a3c
--> kick benchmark@7f6218c7-5d51-fa89-be1e-a3b12ba5d7d5
--> kick benchmark@4593efe5-8835-67ae-3f21-07aaf25ad64f
--> kick benchmark@3e9d651f-f520-4ae5-c20f-1fe31aac8ab4
# 节点一
# grep kicked_an_unknown_session -a /var/log/emqx/emqx.log.1 |wc -l
29
# 节点二
# grep kicked_an_unknown_session -a /var/log/emqx/emqx.log.1 |wc -l
0
# 节点三
# grep kicked_an_unknown_session -a /var/log/emqx/emqx.log.1 |wc -l
65

批量踢除发现: 重试了几次,只要是批量删除的一个clientId都有可能出现多条kicked_an_unknown_session的情况.

就是这样子机制,第一次就踢成功了,后续的提出一个不存在的 client ID。都会出现这个日志,说明没有找到。这个日志并不会影响你什么,如果你觉得它实在烦的话,你就在剔除之前先查一下。