xiahou
1
问题:
通过k3s部署3个节点的emqx集群。客户端连接到某个节点并订阅指定的业务TOPIC,发布该TOPIC数据,消费不到
排查过程:
1、定位是否订阅成功
通过log trace验证该客户端已完成TOPIC订阅,有SUBSCRIBE、SUBACK日志。在控制台根据ClientId能查询到订阅列表中存在,且该clientId唯一
2、其他节点是否异常
连接上其他节点,可以正常消费,只有其中一个固定的消费不了
3、发布订阅的测试过程,通过MQTTX工具完成。
4、将订阅的TOPIC换成通配符
原订阅TOPIC为config/lmt,修改成config/#,连上那个问题节点也能消费上。
5、qos配置
QOS=2 或QOS=0都试过,客户端连接到该节点,并订阅指定TOPIC也无法消费。
其他配置:clean_session=true
- emqx 的版本是多少。
- 出问题时:在三个节点内部使用3 个命令行分别看结果:
./bin/emqx eval "ets:tab2list(emqx_route)."
./bin/emqx eval "emqx_router:get_schema_vsn()."
./bin/emqx eval "emqx_router:topics()."
xiahou
4
版本是4.4.3,想问下这三个命令分别是什么作用?
查看路由信息。如果是 4 的话,就不要用中间那个命令了。
你得在 3 个 pod 里面都运行,看看有问题的一个是不是有。
xiahou
8
刚刚这个就是问题节点的,剩下四张图按顺序分别是节点0和节点1的
而且现在我刚试了下发,连上node2问题节点的客户端又能收到消息了。
是不是这个节点自身在这个topic上发布订阅有阻塞?
不会阻塞的。如果已经开了 log trace,
你就看有问题的时候,这个 emqx 的trace 日志里面有没有发出过这条消息,如果发出来了,mqttx 没有收到,那估计就是 mqttx 哪里设置有问题,要是没发出来,就是 emqx 内部的问题。
xiahou
10
是trace topic吗?是不是看到publish topic的日志,就代表发出来了
trace 客户端 clientid 就行, topic 看不出来的
xiahou
13
trace客户端没收到消息,估计是emqx内部的问题。订阅的TOPIC后面接一个#通配符,又能收到。之前有遇到过类似的问题吗?,是不是这个低版本的bug
我在4.4.3 以上的 changelog 找了一下,并没有发现有相似的。
如果路由表里有,应该能发送才对。
xiahou
15
路由怎么看?,每个node上路由表都不一样。
比如node0、node1、node2集群中:node1有路由:[{config/lmt - > emqx@node1},{config/lmt - > emqx@node0}]。
是否表示当config/lmt主题消息生产完后,node1根据这个路由表,只能将消息分发到node1和node0中
xiahou
17
我之前没理解对,从这个截图结果中看,问题节点node2路由表的数据和node0、node1不一致,按理这三个节点路由表数据应该得同步。
之前有这个路由表数据不同步得情况吗?
有。但都是极端情况才会发生。
解决方法:升到 4.4.19 打开
broker.perf.trie_compaction=true