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

相关推荐
TDengine (老段)2 小时前
TDengine taosAdapter — 多协议网关详解
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
Nturmoils2 小时前
SQL Server 迁移到 KingbaseES:一次复杂 BI 查询的性能实测
数据库
ChaHae-In3 小时前
MyBatis入门操作
java·mybatis
xcLeigh3 小时前
Go入门:短变量声明的陷阱与最佳实践
java·redis·golang·教程·变量
青山木3 小时前
Hot 100 --- 最小栈
java·数据结构·算法·leetcode
疯狂打码的少年3 小时前
【数据结构】栈的应用:表达式求值(后缀表达式)
java·数据结构·笔记·算法
szephyr3 小时前
腾讯云 ADP 智能体的 Skills 版本回滚总是回到旧配置,是缓存没清还是版本管理没开?
java·缓存·腾讯云
云烟成雨TD3 小时前
Micrometer 系列【39】链路追踪:入门案例 | 环境准备
java·云原生·链路追踪
chuan.bai3 小时前
Java RAG 实战(第 3 篇):从交互式聊天到多轮上下文
java·人工智能·macos·ai
952363 小时前
Sentinel
java·后端·spring·sentinel·springcloud