
在使用 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. 收集基本信息
获取用户表的 schema:
表类型(Dup 表 Unique 表)。 如果是 Unique 表,判断是 MoR 还是 MoW。 是否使用了 sequence 列。 确认操作:
导入方式及参数 用户是否执行过删除操作(如 DELETE
语句或delete sign
导入)。确认问题类型及 SQL:
查询结果是否符合预期? 查询结果是否出现跳变? 数据条数是否少于预期?
Step 2. 定性问题类型
通过以下特征,确定是存储层还是查询层问题:
注:下文中➡️ 代表分支,🔴 代表终结点,如果走到了终结点,就不需要继续走了
存储层问题的判断条件:
执行 SELECT COUNT(*)
(无 WHERE 条件),数据少于导入的数据量。修改 use_fix_replica
的 session 变量为 0/1/2,若查询结果行数不同,则说明多副本不一致。三副本行数一致,但某些 key 的内容在副本中不同。 查询层问题: 以上条件都不符合时,那就是查询层的问题了。
Step 3. 存储层问题细化
根据具体现象进一步定位:
注:下文中➡️ 代表分支,🔴 代表终结点,如果走到了终结点,就不需要继续走了
select ${keys}, count (*) a from ${table} group by ${keys} having a > 1insert into select的方式进行导入,如果是,则采取如下方式处理
session variable set global enable_strict_consistency_dml=trueinsert into select导入,说明不是个常见的问题导致的不一致,先找到某些key,在多个副本中的数据不同。然后联系社区同学进行处理。
3
MoW 重复 key 问题分析
如果确定是 MoW 表的重复 key 问题:
检查使用的版本:
版本 1.2.x:升级到 1.2最新版本。 版本 2.0.x:若低于 2.0.4,建议升级到2.0最新版本。 版本 2.1.x:若使用了列更新功能,建议升级到 2.1最新版本。 定位有问题的副本:
修改 use_fix_replica
为 0/1/2,分别执行查询:SELECT ${keys}, COUNT(*) a FROM ${table} GROUPBY ${keys} HAVING a > 1;找到有重复 key 的副本,记录问题数据和相关信息。 获取 Debug 数据:
获取有问题的 key 对应的导入版本: SET show_hidden_columns = TRUE;
SELECT ${keys}, __DORIS_VERSION_COL__ FROM ${table} WHERE ${keys} = xxx;查找有问题的 tablet id: EXPLAINSELECT ${keys}, __DORIS_VERSION_COL__ FROM ${table} WHERE ${keys} = xxx;收集日志和 compaction 状态。
日志主要是fe.log 和 be.INFO
查看compaction状态
//查看某个 BE 节点总体的 compaction 状态
GET api/compaction/run_status
//查看指定 tablet 的 compaction 状态。
GET api/compaction/show?tablet_id={int}
4
多副本不一致问题分析
如果确认多个副本行数不同但不存在重复 key,可以按照以下步骤排查:
找到有问题的 tablet。
确认 tablet 的两个副本是否一致:
SET use_fix_replica = 0/1/2;
SELECTCOUNT(*) FROM ${table} tablet(${tablet_id});导出不同副本的数据,进行 diff 比较:
SET use_fix_replica = 0;
SELECT ${keys}, __DORIS_VERSION_COL__ FROM ${table} tablet(${tablet_id}) ORDERBY ${keys} INTOOUTFILE'file:///tmp/replica0';对比数据差异,找出问题导入版本。
获取日志并分析问题导入的具体原因。
日志主要是fe.log 和 be.INFO
5
总结
Doris的查询正确性问题可能涉及查询层和存储层的多种场景。通过对问题的分类和分步排查,可以快速定位并解决问题。如果实在搞不定了,可以联系Doris社区的同学辅助解决~

往期推荐
完
Apache Doris社区是目前国内最活跃的开源社区(之一)。Apache Doris(Apache 顶级项目) 聚集了世界全国各地的用户与开发人员,致力于打造一个内容完整、持续成长的互联网开发者学习生态圈!
如果您对Apache Doris感兴趣,可以通过以下入口访问官方网站、社区论坛、GitHub和dev邮件组:
PowerData是由一群数据从业人员,因为热爱凝聚在一起,以开源精神为基础,组成的数据开源社区。
社区群内会定期组织模拟面试、线上分享、行业研讨、线下Meetup、城市聚会、求职内推等活动,同时在社区群内你可以进行技术讨论、问题请教,结识更多志同道合的数据朋友。
社区整理了一份每日一题汇总及社区分享PPT,内容涵盖大数据组件、编程语言、数据结构与算法、企业真实面试题等各个领域,帮助您提升自我,成功上岸。
可以加作者微信(Faith_xzc)直接进PowrData官方社区群
叮咚✨ “数据极客圈” 向你敞开大门,走对圈子跟对人,行业大咖 “唠” 数据,实用锦囊天天有,就缺你咯!快快关注数据极客圈,共同成长!

点击上方公众号关注我们




