avatar
дата инженеретта
@data_engineerette
11.08.2025 10:25
Разбираемся в движках клика

Этот день настал, и я наконец-то поняла, что происходит с разными движками в кх

Возьмем такую конфигурацию кластера: 2 шарда по 2 реплики. И для примера 3 движка: MergeTree, ReplicatedMergeTree, Distributed

Подключаемся к 1му хосту, создаем 6 таблиц на кластере. Чтобы результаты не мешали друг другу, под Distributed создаем отдельные свежие чистые таблички:

1) MergeTree
ENGINE MergeTree()


2) ReplicatedMergeTree
ENGINE ReplicatedMergeTree()


3) Distributed поверх MergeTree
ENGINE = Distributed(local_cluster, default, mt_table, rand())


4) Distributed поверх ReplicatedMergeTree
ENGINE = Distributed(local_cluster, default, rmt_table, rand())


Каждая таблица теперь существует на каждом хосте, потому что мы создали на всем кластере. Инсертим 10к строк данных и сравним

Что получается?

MergeTree
Данные хранятся только на том хосте, на котором мы заинсертили. На остальных 0

ReplicatedMergeTree
Данные хранятся на всех репликах одного шарда. На остальных шардах 0

Distributed
Данные вообще не хранит, они лежат в исходной таблице. В каком-то смысле это как view

Если в основе MergeTree - то данные будут на одной из реплик в шарде. В нашем случае это replica1 для shard1 и replica2 для shard2
Когда мы делаем count(), рандомно выбирается одна реплика из каждого шарда. Т.е. на нашем кластере возможны 4 комбинации:

1 + 3 = 5030 + 0 = 5030
1 + 4 = 5030 + 4970 = 10000
2 + 3 = 0 + 0 = 0
2 + 4 = 0 + 4970 = 4970


Это значит, что при каждом новом запросе, например, для хоста 3 мы можем получить либо 5030 строк, либо 0

Если в основе ReplicatedMergeTree - то между репликами будет одинаковое количество строк, но между шардами разное. А при запросе к distributed всегда будет участвовать одинаковое количество строк

emojiПоэтому если нужно получать консистентные данные, обеспечивать отказоустойчивость - используем Distributed на базе ReplicatedMergeTree и селектим из Distributed
11
🔥 5
🤔 4
6 60 2.3K

Обсуждение 6

Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.

Обсудить в Telegram