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 官网

相关推荐
听闻风很好吃2 分钟前
Redis性能优化终极指南:从原理到实战的深度调优策略
数据库·redis·性能优化
别致的影分身12 分钟前
etcd 的安装及使用
数据库·etcd
振鹏Dong19 分钟前
JVM | CMS垃圾收集器详解
java·jvm
情报员00723 分钟前
Java练习6
java·算法·排序算法
andrew_121932 分钟前
JVM的内存管理、垃圾回收、类加载和参数调优
java·jvm
百锦再34 分钟前
Python深度挖掘:openpyxl和pandas的使用详细
java·开发语言·python·框架·pandas·压力测试·idea
microhex39 分钟前
Glide 如何加载远程 Base64 图片
java·开发语言·glide
chilling heart1 小时前
JAVA---集合ArrayList
java·开发语言
ss2731 小时前
基于Springboot + vue实现的中医院问诊系统
java·spring boot·后端
wuqingshun3141591 小时前
经典算法 最长单调递增子序列
java·c++·算法·蓝桥杯·机器人