复制表的每次 INSERT 和 merge 都在 ZooKeeper 的 log/ 下用掉一个 int32 序号。lab 上把计数器推到上限之后,INSERT 全报 Node exists,merge 失败,读照常;照原表建新表、把分区挂过去就能恢复写入。
Posts for: #ReplicatedMergeTree
ClickHouse 的写入路径
一批交易明细 INSERT 进复制表之后,服务端按分区切块、排序压缩成新的 part,后台 merge 把小 part 合大,另外两个副本照着 Keeper 里的复制日志去拉。part 写完不再改,去重、改数据和修数据的做法都从这一点来。
ClickHouse 的块级去重窗口
ReplicatedMergeTree 默认记住最近 1000 个插入块,重投的那批内容和 token 都没变,本该被认出来。这张表三个副本每秒建 124 个块,1000 个块折合 8 秒,而重投的间隔是 32 到 124 秒。