在 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 .. DELETEmutations_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 = 1SELECT 返回 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 = 0mutations_sync = 2SELECT 返回 0 行(即使将 foo 中生成的行数增加到 30kk)。我不理解这种行为,所以我无法回答我的第二个问题(在 TL;DR 中)

【问题讨论】:

【参考方案1】:
    不可能。 没有。

突变被实施为解决 GDPR 问题的 ADMIN 操作,但不是日常业务 (USER) 任务。 这就是突变不提供一致性/原子性的原因。 这就是为什么如果您尝试使用它们来解决业务逻辑任务(USER 任务),突变是非常不可靠的。

【讨论】:

以上是关于在 Clickhouse 集群的所有副本上同步 ALTER TABLE ... DELETE的主要内容,如果未能解决你的问题,请参考以下文章

在 Zookeeper 集群中重新添加丢失的 Clickhouse 副本

ClickHouse集群部署

clickhouseclickhouse 副本与分片 副本详解

Clickhouse 外部表本地表副本表和分布式表

Clickhouse 表是不是有最大推荐的副本数量?

clickhouse两分片两副本集群部署