问题现象
背景介绍
checksum 问题
在合并时,会检测多副本的数据一致性,是通过对比多副本的宏块二进制检验值(data checksum)和列校验值(column checksum),以此保证多副本的数据是一致的。
当出现数据 checksum 问题时,需要结合 Major SSTable 宏块内容找到不一致行,再倒推不一致行的来源,可能需要追溯若干次 minor/mini compaction,甚至要查看事务 clog,才能找到问题的根源,并且需要保证所有 compaction 输出的数据及日志都没有被回收。需要环境留存信息完整,并且排查操作复杂、难度大。
checksum 问题出现可能和以下场景有关:
compaction 执行过程中的问题(本问题)。
事务在多副本的处理不一致等情况。
本问题背景
本问题导致 checksum 问题的原因是 compaction 执行过程中的问题。
每个 SSTable 中每个 Rowkey 按照升序排列,每个 Rowkey 可能存在多个行,数据行分布如下:
未提交行:当事务没有提交时,行在 SSTable 中为未提交的形式。
Compact 行:包含这个 SSTable 中该 Rowkey 所有已提交行的结果。
多版本行:每个事务对该 Rowkey 做出的修改。
在执行 minor merge 的时候,每个 SSTable 会按顺序迭代出行,不同 SSTable 若存在相同 Rowkey 的行,需要合在一起,并遵守:不同 SSTable 的 Compact 行需要将较旧的行合到较新的行,去填充较新行的空值列。
问题场景
在 minor merge 的时候,有如下分布的两个 SSTable:
| SSTable A(Base SSTable) | SSTable B | ||
|---|---|---|---|
| MACRO 1 | Rowkey 未提交行 | Macro 3 | Rowkey 行 |
| MACRO 2 | Rowkey Magic Row | ||
1)minor merge 的时候,多个 SSTable 有同一个 Rowkey 的行。
2)该 Rowkey 的行跨宏块。
第一个宏块的行是未提交行。
第二个宏块有事务回滚形成的 Magic row。
在 minor merge 的时候,若多个sstable拥有同一个 Rowkey,会把每个 SSTable 输出的 compact row 进行 fuse,生成目的 SSTable 的 compact row(这个 compact row 应该包含所有入参 SSTable 的行信息)
在这次出问题的 minor merge 中,由于 SSTable A 中输出的行 row_1 没有打上 compact 标,导致 SSTable B 中相同 Rowkey 的 compact 行 row_2 没有与 row_1 进行 fuse,导致最终的 compact 行丢失了 row_1 的信息。从而导致这个列信息丢失。
可能出现该问题的场景
对同一个 Rowkey 的变更比较多。
有回滚事务。
关键诊断信息
事前巡检
无,尽快升级到带 fix 的版本。
事后诊断
需要满足如下条件:
不一致的 Rowkey 为丢失部分列信息。
不一致的列信息是在 minor merge 中丢失。
minor merge 中入参 SSTable 需要满足本问题的数据分布。
才能推断出是本问题,比较复杂,需要结合 Major SSTable/minor SSTable 的宏块数据分布来综合判断。
问题原因
内核 BUG。
问题的风险及影响
副本间 checksum 不一致。
影响租户
影响 OceanBase 数据库中的 Oracle 租户和 MySQL 租户,对于 SYS 租户无影响。
影响版本
OceanBase 数据库 V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本。
解决方法
升级到问题已修复版本。目前已修复的版本包含 OceanBase 数据库 V3.2.3 BP9 Hotfix3(oceanbase-3.2.3.3-109030012023111713)、V3.2.3 BP9 Hotfix4(oceanbase-3.2.3.3-109040012024071014)、V3.2.3 BP11(oceanbase-3.2.3.3-111000032024070822)及之后版本、V3.2.4 BP7(oceanbase-3.2.4.7-107000012023113010)及之后版本。
按照数据不一致的方式解决:删副本、删表等。
规避方式
无。