TDengine 订阅不到数据问题排查
简介
TDengine 在实际生产应用中,经常会遇到订阅程序订阅不到数据的问题,总结大部分都为使用不当或状态不正确等问题,需手工解决。
查看服务端状态
通过 sql 命令查看有问题的 topic 和consumer_group 组订阅是否正常。
select * from information_schema.ins_subscriptions where topic_name = 'db_32471_topic' and consumer_group='g122';
topic_name 和 consumer_group 换成对应的)
结果如下图:
- 如果offset 里分子在变大,或者 rows 列也在增大,证明服务端消费数据正常。consumer_id 为正在消费的消费者。根据 consumer_id 去客户端排查。
- 如果consumer_id 为 NULL,证明这个topic 里这个 consumer_group 组里没有消费者在消费。在服务端继续排查
- 找到consumer_id 为 NULL这个consumer 所在的 vnode,找到vnode 的主节点(show vnodes)
- 在主节点上执行如下命令(日志路径需替换)
打开日志:alter dnode x ‘tqdebugflag 135’
搜索日志:grep “tmq poll" /var/log/taos/taosdlog.0 | grep topic_name | grep consumer_group 查看是否有消费请求发送到服务端
- 如果某些行offset 在变,某些行 offset 没有变,但是consuemr_id 有值。offset 没有变的这个consumer 说明没有在消费数据。在服务端继续排查。
- 找到没有变的这个consumer 所在的 vnode,找到vnode 的主节点(show vnodes)
- 在主节点上执行如下命令(consumer_id 和日志路径需替换)
打开日志: alter dnode x ‘tqdebugflag 135’
搜索日志:grep 0xeca1f9b1d600001 /var/log/taos/taosdlog.0 | grep “tmq poll” | grep -E "set handle|block num"如果没有搜到日志,证明服务端没有收到消费数据的消费请求。继续客户端排查。
如果看到有 send rsp,block num 不为 0,说明有服务端有数据发送给客户端。为0,说明消费0条数据。
查看客户端状态
原生连接客户端是本地消费程序,日志为taos 的日志,目录为 taos.cfg 里配置的logDir,一般为 /var/log/taos/
WebSocket 连接方式客户端为 taosadapter 程序,如果有负载均衡的话,需要找对 taosadapter。日志同样为taos 的日志,目录为 taos.cfg 里配置的logDir,一般为 /var/log/taos/。
- 首先打开客户端日志,cDebugFlag 或者 tqClientDebugFlag。
改配置文件taos.cfg 重启消费程序。
不重启的话,如果为 taosadapter,可以执行如下命令
curl --location ‘http://127.0.0.1:6041/rest/sql’ --header ‘Content-Type: text/plain’ -u root:Tbase129! --data ‘alter local ‘\’‘cdebugflag’\’’ ‘\’‘129’\‘’’ (用户名密码需替换)
也可以通过在mnode 主节点机器上执行 alter dnode x ‘tqclientdebugflag 135’,把开关下推到客户端。(3.3.4.3以及以后得版本支持)。
-
找到对应的taoslog(可以通过查看客户端进程,然后 ll /proc/id/fd|grep taoslog,查看具体的日志文件,因为可能存在多个客户端日志)
然后根据 consumer_id 查找消费信息。没有consumer_id 的话,可以通过查找 start to poll at 来判断是否有 poll 调用过来。
下图第一行标识收到 poll 消息,第二行标识返回消费到多少数据
出现如下日志说明消费者没有权限消费数据。
消费者不存在问题
通过show consumers; 或者 show subscriptions,找不到消费者时,就是消费者被删除了。下列几种情况会删除消费者:
- 消费者断线超时,超时时间通过消费者配置参数 session.timeout.ms 控制,默认 12s。
- 消费者超过固定时间不再poll 数据,通过消费者配置参数 max.poll.interval.ms 控制,默认为 300s。
- 消费者主动取消订阅。
访问官网
更多内容欢迎访问 TDengine 官网