在 Clickhouse 集群的所有副本上同步 ALTER TABLE ... DELETE
Posted
技术标签:
【中文标题】在 Clickhouse 集群的所有副本上同步 ALTER TABLE ... DELETE【英文标题】:Sync ALTER TABLE ... DELETE on all replicas of a Clickhouse cluster 【发布时间】:2021-12-26 11:21:00 【问题描述】:TL;DR
有2个问题:
-
如何在 Clickhouse 集群上正确执行同步
ALTER TABLE .. DELETE
。
在使用ALTER TABLE .. DELETE
和mutations_sync = 2
设置和不使用ON CLUSTER
时,是否会从所有副本中删除数据。或者如何验证这一点
长
有 2 个 CH 安装:单服务器 (H1) 和集群(3 个节点,H2)。我用引擎创建了一个表 foo:H1 - ReplacingMergeTree,H2 - ReplicatedReplacingMergeTree(使用ON CLUSTER bar
)。然后我提出要求:
对于每个请求,我生成了 1kk 行(大约获得了大约 200 MB)。
-
对 H1 的请求(单服务器)
clickhouse-client -h $H1 --queries-file=queries.sql
queries.sql:
ALTER TABLE foo DELETE WHERE 1 SETTINGS mutations_sync = 0;
SELECT * FROM foo LIMIT 1
SELECT
的结果显示了一些尚未删除的记录。有道理。
做同样的事情,但使用mutations_sync = 1
。 SELECT
返回 0 行。与mutations_sync = 2
相同。到目前为止,一切都如预期的那样。
对 H2(集群)的请求:
clickhouse-client -h $H2 --queries-file=queries.sql
queries.sql:
ALTER TABLE foo ON CLUSTER bar DELETE WHERE 1 SETTINGS mutations_sync = 2;
SELECT * FROM foo LIMIT 1
SELECT
返回一些记录,尽管它似乎不应该,因为mutations_sync = 2
意味着请求必须在所有副本上完成才能完成(或者我误解了什么?)
-
做同样的事情,但从
ALTER TABLE
中删除ON CLUSTER bar
。在这种情况下,SELECT
的结果是 0 行。
我假设情况 3 中出现这种行为的原因是由于使用 ON CLUSTER
选项时,请求转到 ZooKeeper,并立即完成,因为 ZK 只是收到将其发送到所有副本的请求,但不要不要等待它的完成。对吗?
我想检查是否在案例 4 中从所有副本中删除数据。我尝试发出如下请求:
#!/bin/bash
clickhouse-client -h $H2_REPLIC1 --query="ALTER TABLE topics ON CLUSTER dc2_test DELETE WHERE 1 SETTINGS mutations_sync = 0";
clickhouse-client -h $H2_REPLIC2 --query="SELECT * FROM topics LIMIT 1 FORMAT TabSeparated";
但同时使用mutations_sync = 0
和mutations_sync = 2
,SELECT
返回 0 行(即使将 foo 中生成的行数增加到 30kk)。我不理解这种行为,所以我无法回答我的第二个问题(在 TL;DR 中)
【问题讨论】:
【参考方案1】:-
不可能。
没有。
突变被实施为解决 GDPR 问题的 ADMIN 操作,但不是日常业务 (USER) 任务。 这就是突变不提供一致性/原子性的原因。 这就是为什么如果您尝试使用它们来解决业务逻辑任务(USER 任务),突变是非常不可靠的。
【讨论】:
以上是关于在 Clickhouse 集群的所有副本上同步 ALTER TABLE ... DELETE的主要内容,如果未能解决你的问题,请参考以下文章
在 Zookeeper 集群中重新添加丢失的 Clickhouse 副本