暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Doris 查询正确性问题排查指南

数据极客圈 2025-01-23
166

在使用 Apache Doris 的过程中,Unique Key 的正确性问题可能会对数据查询结果和存储一致性产生影响。本文将为大家详细解析这些问题的分类、排查步骤以及解决方案。希望通过这篇文章,让大家对 Unique Key 的正确性排查有一个清晰的认识。

1


Unique Key 正确性问题分类

1. 查询问题
数据本身没有问题,但由于查询执行层的原因,导致多个副本结果不一致或查询结果不正确。

  • 例 1: 倒排索引优化导致查询结果缺失。

  • 问题描述:少读了一条 key,查询结果不正确。
    相关案例:Unique表(mor)查询结果会变化,但是直接count 数据量是不变的。场景是同一条数据会更新多遍。这时候是有写入的,如果写入停了的话,等一会查询就没有问题了。
    已经修复pr链接

2. 存储问题
存储层的问题更为复杂,常见的场景包括:

  • 导入问题: INSERT INTO SELECT
     写入 Unique 表时,可能会出现多副本行数相同但某些行内容不一致的现象。
  • MoW 正确性问题: 多副本行数不一致或查询表中出现重复 key。
  • Compaction 问题: 数据丢失(出现概率较低)。

2


排查 Unique Key 正确性问题的步骤

Step 1. 收集基本信息
  1. 获取用户表的 schema:

    • 表类型(Dup 表 Unique 表)。
    • 如果是 Unique 表,判断是 MoR 还是 MoW。
    • 是否使用了 sequence 列。
  2. 确认操作:

    • 导入方式及参数
    • 用户是否执行过删除操作(如 DELETE
       语句或 delete sign
       导入)。
  3. 确认问题类型及 SQL:

    • 查询结果是否符合预期?
    • 查询结果是否出现跳变?
    • 数据条数是否少于预期?
Step 2. 定性问题类型

通过以下特征,确定是存储层还是查询层问题:

注:下文中➡️ 代表分支,🔴 代表终结点,如果走到了终结点,就不需要继续走了

  • 存储层问题的判断条件:

    1. 执行 SELECT COUNT(*)
      (无 WHERE 条件),数据少于导入的数据量。
    2. 修改 use_fix_replica
       的 session 变量为 0/1/2,若查询结果行数不同,则说明多副本不一致。
    3. 三副本行数一致,但某些 key 的内容在副本中不同。
  • 查询层问题: 以上条件都不符合时,那就是查询层的问题了。

Step 3. 存储层问题细化

根据具体现象进一步定位:

注:下文中➡️ 代表分支,🔴 代表终结点,如果走到了终结点,就不需要继续走了

➡️ 直接count(*),数据是否比预期的少?
🔴 行数少了,说明有丢数据的问题,联系社区同学处理
➡️ 行数不少,就将session变量use_fix_replica分别设置为0/1/2,查询select count(*),确定三个副本行数是否不同
      ➡️如果行数不同
             🔴 如果是MoR表,按照下面“多副本不一致问题分析”一节的步骤进行分析。
             ➡️ 如果是MoW表
                     🔴 如果存在重复key,跳转到下文的“MoW重复key问题分析”一节的步骤进行分析。
                     ➡️ 执行以下查询判断是否存在重复keyselect ${keys}, count (*) a from ${table} group by ${keys} having a > 1
                              ➡️ 如果不存在重复key,确认用户是否表schema中只包含key列
                                       🔴 如果是,则说明这是个已知的compaction bug,级到2.0.9之后可以解决
                                       🔴 如果不是,按照下面“多副本不一致问题分析”一节的步骤进行分析。
          ➡️ 如果行数相同,看能否找到某些key,在多个副本中的数据不同
                   ➡️ 确认是否使用了insert into select
的方式进行导入,如果是,则采取如下方式处理
                            ➡️ 如果使用的是2.1以下版本
                                    🔴 如果没有使用sequence列,建议选一列能够区分相同key不同版本的列作为sequence列,再重新进行导入
                                     🔴 如果用户使用了sequence列,应该是因为选择的se    quence列无法区分两条相同的key,所以sequence列其实没有起作用
                            ➡️ 使用的是2.1及以上版本,打开全局的session variable set global enable_strict_consistency_dml=true
                     ➡️ 如果没有使用insert into select
导入,说明不是个常见的问题导致的不一致,先找到某些key,在多个副本中的数据不同。然后联系社区同学进行处理。

3


MoW 重复 key 问题分析


如果确定是 MoW 表的重复 key 问题:

  1. 检查使用的版本:

    • 版本 1.2.x:升级到 1.2最新版本。
    • 版本 2.0.x:若低于 2.0.4,建议升级到2.0最新版本。
    • 版本 2.1.x:若使用了列更新功能,建议升级到 2.1最新版本。
  2. 定位有问题的副本:

    • 修改 use_fix_replica
       为 0/1/2,分别执行查询:
      SELECT ${keys}, COUNT(*) a FROM ${tableGROUPBY ${keysHAVING a > 1;

    • 找到有重复 key 的副本,记录问题数据和相关信息。
  3. 获取 Debug 数据:

    • 获取有问题的 key 对应的导入版本:
      SET show_hidden_columns = TRUE;
      SELECT ${keys}, __DORIS_VERSION_COL__ FROM ${tableWHERE ${keys} = xxx;

    • 查找有问题的 tablet id:
      EXPLAINSELECT ${keys}, __DORIS_VERSION_COL__ FROM ${tableWHERE ${keys} = xxx;

  4. 收集日志和 compaction 状态。

    • 日志主要是fe.log 和 be.INFO

    • 查看compaction状态

      //查看某个 BE 节点总体的 compaction 状态
      GET api/compaction/run_status 
      //查看指定 tablet 的 compaction 状态。
      GET api/compaction/show?tablet_id={int}


4


多副本不一致问题分析


如果确认多个副本行数不同但不存在重复 key,可以按照以下步骤排查:

  1. 找到有问题的 tablet。

  2. 确认 tablet 的两个副本是否一致:

    SET use_fix_replica = 0/1/2;
    SELECTCOUNT(*) FROM ${table} tablet(${tablet_id});

  3. 导出不同副本的数据,进行 diff 比较:

    SET use_fix_replica = 0;
    SELECT ${keys}, __DORIS_VERSION_COL__ FROM ${table} tablet(${tablet_id}) ORDERBY ${keysINTOOUTFILE'file:///tmp/replica0';

    对比数据差异,找出问题导入版本。

  4. 获取日志并分析问题导入的具体原因。

    • 日志主要是fe.log 和 be.INFO 

5


总结

 

Doris的查询正确性问题可能涉及查询层和存储层的多种场景。通过对问题的分类和分步排查,可以快速定位并解决问题。如果实在搞不定了,可以联系Doris社区的同学辅助解决~


往期推荐

Doris BE节点下线卡住?快速排障技巧全攻略!

Doris查询报错-230?别慌,教你几招秒解!

Doris Tablet 损坏如何应对?能恢复数据吗?

Doris的Stream Load那些事儿,你踩过哪些“坑”?

如何排查 Apache Doris 中 "Failed to commit txn" 导入失败问题?

Doris的Routine Load导入指南 

Doris 导入慢该如何排查和优化

Doris 建表与分区问题全解析






数据极客圈子介绍

圈子1

Apache Doris社区是目前国内最活跃的开源社区(之一)。Apache Doris(Apache 顶级项目) 聚集了世界全国各地的用户与开发人员,致力于打造一个内容完整、持续成长的互联网开发者学习生态圈! 

如果您对Apache Doris感兴趣,可以通过以下入口访问官方网站、社区论坛、GitHub和dev邮件组

💡官网文档:https://doris.apache.org 
💡社区论坛:https://ask.selectdb.com 
💡GitHub:https://github.com/apache/doris 
💡dev邮件组:dev@doris.apache.org

      可以加作者微信(Faith_xzc)直接进Doris官方社区群
圈子2

PowerData是由一群数据从业人员,因为热爱凝聚在一起,以开源精神为基础,组成的数据开源社区。

社区群内会定期组织模拟面试、线上分享、行业研讨、线下Meetup、城市聚会、求职内推等活动,同时在社区群内你可以进行技术讨论、问题请教,结识更多志同道合的数据朋友。

社区整理了一份每日一题汇总社区分享PPT,内容涵盖大数据组件、编程语言、数据结构与算法、企业真实面试题等各个领域,帮助您提升自我,成功上岸。

可以加作者微信(Faith_xzc)直接进PowrData官方社区群

叮咚✨ “数据极客圈” 向你敞开大门,走对圈子跟对人,行业大咖 “唠” 数据,实用锦囊天天有,就缺你咯!快快关注数据极客圈,共同成长!

 

点击上方公众号关注我们


文章转载自数据极客圈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论