【发布时间】:2020-09-13 09:50:53
【问题描述】:
我在Distributed Engine 文档中阅读了有关 internal_replication 设置的内容。
如果此参数设置为“true”,则写入操作会选择第一个健康的副本并向其写入数据。如果分布式表“查看”复制表,请使用此替代方法。换句话说,如果要写入数据的表要自己复制它们。
如果设置为“false”(默认值),则将数据写入所有副本。本质上,这意味着分布式表自己复制数据。这比使用复制表更糟糕,因为没有检查副本的一致性,并且随着时间的推移它们会包含稍微不同的数据。
我正在使用 典型 KafkaEngine 和 Materialized View(MV) 设置,以及使用 Distributed 表。
我有一组实例,其中有 ReplicatedReplacingMergeTree 和 Distributed 表,如下所示:
CREATE TABLE IF NOT EXISTS pageviews_kafka (
// .. fields
) ENGINE = Kafka
SETTINGS
kafka_broker_list = '%%BROKER_LIST%%',
kafka_topic_list = 'pageviews',
kafka_group_name = 'clickhouse-%%DATABASE%%-pageviews',
kafka_format = 'JSONEachRow',
kafka_row_delimiter = '\n';
CREATE TABLE IF NOT EXISTS pageviews (
// fields
) ENGINE ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/%%DATABASE%%/pageviews', '{replica}', processingTimestampNs)
PARTITION BY toYYYYMM(dateTime)
ORDER BY (clientId, toDate(dateTime), userId, pageviewId);
CREATE TABLE IF NOT EXISTS pageviews_d AS pageviews ENGINE = Distributed('my-cluster', %%DATABASE%%, pageviews, sipHash64(toString(pageviewId)));
CREATE MATERIALIZED VIEW IF NOT EXISTS pageviews_mv TO pageviews_d AS
SELECT
// fields
FROM pageviews_kafka;
问题:
-
我在分布式表中使用默认值
internal_replication,这是错误的。这是否意味着分布式表正在将 all 数据写入 all 副本?那么,如果我将internal_replication设置为 true,那么 ReplicatedReplacingMergeTree 的每个实例将只拥有整个表的份额,而不是整个数据集,从而优化数据存储?如果是这样,复制也会受到影响——如何定义一定数量的副本? -
我使用实体的 id 作为分布散列。我在 Altinity 的 ClickHouse Kafka Engine FAQ 中阅读了问题“Q. How can I use a Kafka engine table in a cluster?”,如下:
另一种可能性是将数据从 Kafka 引擎表刷新到分布式表中。但是,它需要更仔细的配置。特别是分布式表需要有一些分片键(不是随机散列)。这是为了使 ReplicatedMergeTree 的重复数据删除正常工作所必需的。分布式表将重试同一块的插入,并且可以通过 ClickHouse 进行重复数据删除。
但是,我在这里使用了半随机哈希(它是实体 ID,其想法是同一实体实例的不同副本 - 在本示例中为综合浏览量 - 被组合在一起)。它的实际问题是什么?为什么不鼓励?
【问题讨论】: