TDengine 订阅不到数据问题排查

简介

TDengine 在实际生产应用中,经常会遇到订阅程序订阅不到数据的问题,总结大部分都为使用不当或状态不正确等问题,需手工解决。

查看服务端状态

通过 sql 命令查看有问题的 topic 和consumer_group 组订阅是否正常。

sql 复制代码
     select * from information_schema.ins_subscriptions where topic_name = 'db_32471_topic' and consumer_group='g122';

topic_name 和 consumer_group 换成对应的)

结果如下图:

  1. 如果offset 里分子在变大,或者 rows 列也在增大,证明服务端消费数据正常。consumer_id 为正在消费的消费者。根据 consumer_id 去客户端排查。
  2. 如果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 查看是否有消费请求发送到服务端
  1. 如果某些行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/。

  1. 首先打开客户端日志,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以及以后得版本支持)。

  1. 找到对应的taoslog(可以通过查看客户端进程,然后 ll /proc/id/fd|grep taoslog,查看具体的日志文件,因为可能存在多个客户端日志)

    然后根据 consumer_id 查找消费信息。没有consumer_id 的话,可以通过查找 start to poll at 来判断是否有 poll 调用过来。

下图第一行标识收到 poll 消息,第二行标识返回消费到多少数据
出现如下日志说明消费者没有权限消费数据。

消费者不存在问题

通过show consumers; 或者 show subscriptions,找不到消费者时,就是消费者被删除了。下列几种情况会删除消费者:

  1. 消费者断线超时,超时时间通过消费者配置参数 session.timeout.ms 控制,默认 12s。
  2. 消费者超过固定时间不再poll 数据,通过消费者配置参数 max.poll.interval.ms 控制,默认为 300s。
  3. 消费者主动取消订阅。

访问官网

更多内容欢迎访问 TDengine 官网

相关推荐
snoopyfly~3 分钟前
Ubuntu 24.04 LTS 服务器配置:安装 JDK、Nginx、Redis。
java·服务器·ubuntu
挺菜的29 分钟前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法
掘金-我是哪吒1 小时前
分布式微服务系统架构第156集:JavaPlus技术文档平台日更-Java线程池使用指南
java·分布式·微服务·云原生·架构
亲爱的非洲野猪2 小时前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
wfsm2 小时前
spring事件使用
java·后端·spring
老纪的技术唠嗑局2 小时前
OceanBase PoC 经验总结(二)—— AP 业务
数据库
微风粼粼2 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
缘来是庄2 小时前
设计模式之中介者模式
java·设计模式·中介者模式
阿里云大数据AI技术2 小时前
OpenSearch 视频 RAG 实践
数据库·人工智能·llm
rebel2 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端