背景
在一次数据排查时,无意间发现数据对不齐。结合代码及日志分析发现都没问题,且有插入操作,但是 Clickhouse 却查不到改条记录。匪夷所思....
排查过程
最后断定大概率是 Clickhouse 的问题,难道 Clickhouse 存在数据丢失的情况?进一步分析丢失数据部分时间分布发现并无任何规律,排除 Clickhouse 可能出现的定时故障问题。
无奈只能找公司 DBA 寻求帮助,得出大概率是 Clickhouse 的 ReplicatedReplacingMergeTree 问题。该业务表结构大致如下
-- auto-generated definition
create table t_product_request_log_local
(
id String,
merchant_id String,
product_code String,
order_no String,
spend_time UInt16,
create_time DateTime default toDateTime(now())
)
engine = ReplicatedReplacingMergeTree('/***/{shard}',
'{replica}')
ORDER BY (create_time, merchant_id, product_code, order_no)
SETTINGS index_granularity = 8192;
其中若是高并发场景 ORDER BY 相当于主键,使用该存储引擎的话聚合的字段可能一致,而 order_no 字段由于历史设计问题部分数据该字段存储和的为外部时间戳,因为导致多条数据被聚合为一条数据插入。
为了验证这一猜想,编写了一个批量插入的 SQL 发现,虽然 SQL 执行成功但是确实无重复的数据,而修改变更其中某个字段值即又能正常插入得出数据。
解决
因此需在 ORDER BY 中新增一个唯一字段,使得后期插入数据唯一即可。因此在 ORDER BY 新增 ID 列得解。
标题:记一次 Clickhouse 数据写入成功,但是却无数据问题
作者:JonLv
地址:http://39.108.183.139:8080/articles/2024/12/17/1734418628179.html