Я прочитал это в документации 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;
Вопросы:
I Я использую значение по умолчанию internal_replication
в распределенной таблице, что неверно. Означает ли это, что распределенная таблица записывает все данные в все реплики? Итак, если я установлю для internal_replication
значение true, тогда каждый экземпляр ReplicatedReplacingMergeTree будет иметь только свою долю всей таблицы, а не всего набора данных, что оптимизирует хранение данных? Если это так, репликация тоже будет скомпрометирована - как вы можете определить определенное количество реплик?
Я использую идентификатор объекта в качестве дистрибутива ha sh. Я прочитал в FAQ по ClickHouse Kafka Engine от Altinity, вопрос «В. Как я могу использовать таблицу движка Kafka в кластере?», Следующий:
Другая возможность - передать sh данные из таблицы движка Kafka в распределенную таблицу. Однако это требует более тщательной настройки. В частности, распределенная таблица должна иметь некоторый ключ сегментирования (а не случайный ha sh). Это необходимо для правильной работы дедупликации ReplicatedMergeTree. Распределенные таблицы будут повторять попытки вставки одного и того же блока, и ClickHouse может их вывести.
Однако я использую здесь полуслучайный ha sh (это идентификатор объекта, идея поскольку разные копии одного и того же экземпляра объекта - pageview в данном примере - сгруппированы вместе). В чем проблема? Почему не рекомендуется?