Cing
Published on 2026-03-12 / 3 Visits
0

Doris 主键模型顺序列的选择策略

本篇主要讲解一下使用 doris 的主键模型时,需要指定 sequence_col ,如何选择合适的字段是值得思考的

文章内容主要来源于生产环境实践,仅将脱敏部分放出来供大家参考

Doris 的主键模型表需要指定 sequence_col 列来去重数据,在通过 mysql -> binlog -> flink -> doris 链路处理 MySQL 数据同步时需要自行处理这个字段

sequence_col 用来指定 sequence 列到表中某一列的映射,该列可以为整型和时间类型(DATE、DATETIME),创建后不能更改该列的类型。

有以下几种方案来做 sequence_col,需要各位根据自身业务情况选择,没有银弹呦~

注:以下方案均是在没有版本号字段的情况下的选择,如果您的业务有版本号字段,那么可以考虑版本号字段(注意更新要符合预期)

方案更新不冲突全量流多次处理主库迁移不受时钟回拨影响不受offset重复消费影响支持非顺序消费不漏更新说明
update_time毫秒级时间戳存在较低的冲突可能
时钟回拨时会导致丢失数据
update_time 可能漏更新
binlog_time秒级时间戳存在较高的冲突可能
时钟回拨时会导致丢失数据
GTID主库迁移 GTID 会重置,需人工介入
无法通过 Task 或重复消费全量流做数据刷新
如果是单主,在检测到主库变更时可以通过计算修正 seq 的偏移,解决不能应对迁移的问题
逻辑时钟 + 顺序性消费重复消费时会导致旧数据覆盖新数据但最终一致
多线程消费会乱序无法确保最终为最新版本
binlog_time + 逻辑时钟 + 顺序性消费在顺序性消费的情况下,使用缓存存储2秒的数据,遇到相同时间就+1(本地缓存在重启时可能出现版本号回拨,存到 redis 可以避免该问题,但性能会差一点并依赖了额外中间件)
时钟回拨时会导致丢失数据