【发布时间】: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 中)
【问题讨论】:
标签: cluster-computing synchronous clickhouse alter-table