Прошерстим понятия кластера, ноды(узла), шарда, реплики.
Нода (узел) - физический/виртуальный сервер, с установленным Clickhouse-server. Тут сразу можно сделать пометку, что нода - реальный "вычислительный ресурс", а вот шард и реплика - это логические роли.
Сначала напомним себе, зачем вообще нужны шардирование и репликация. Шардирование нужно для горизонтального масштабирования (разделяем данные с одного узла на несколько). Репликация нужна для повышения отказоустойчивости (дублируем данные одного узла, чтобы в случае проблем с одним узлом, остался доступ к другому).
Важно упомянуть про "правильный ключ шардирования" - такой, чтобы не возникло перекоса данных и не появился "горячий шард" - узел в распределенной системе, который испытывает непропорционально высокую нагрузку по сравнению с другими узлами (в таком случае нарушается сама идея шардирования).
Таким образом, в основном, все строится так - допустим, изначально один шард занимает одну ноду (ноде назначается логическая роль "шард" для хранения части распределенных данных). Второй/третий и т.д. шарды занимают другие отдельные узлы. У каждого шарда может быть несколько реплик. Допустим, у нас 2 шарда с 2 репликами. Тогда нам понадобится 4 ноды для этой системы: первая реплика первого шарда и вторая реплика первого шарда. Это два узла. И еще два узла - это первая реплика второго шарда и вторая реплика второго шарда. Для наглядности под постом две картинки.
Кластер - это логическое объединение нод в одну систему. Это не физический объект, а описание топологии в конфигурации ClickHouse. Кластером может быть даже одна нода, если так выстроена архитектура и у нас нет нескольких шардов, нет реплик. Но чаще, это все же похоже на тот случай, который мы рассмотрели чуть выше:
Кластер
├── Шард 1
│ ├── Реплика 1
│ └── Реплика 2
└── Шард 2
├── Реплика 1
└── Реплика 2
______________________________________________________________________________
Момент про реплики: меня такая схемка когда-то давно запутала и я думала, что при наличии репликации для шардов, шард 1 является как бы "оригиналом" и для него есть 2 реплики. Но на самом деле, как только появляется понятие репликации, наши узлы именуются, как "первая реплика шарда n" и "вторая реплика шарда n". Есть две реплики шарда на двух узлах и все, отдельно "оригинала" шарда нет, мы называем два узла - двумя репликами. Закреплю - как только появляется репликация, узлы описываются именно как реплики конкретного шарда (первая, вторая и т.д.).
Второй момент, который дошел на практике: реплика ≠ полная копия ноды. Чтобы реплицировать данные, нужно использовать специальные реплицированные таблицы с движками группы Replicated. Для управления этими процессами есть ZooKeeper. О нем как-нибудь в другой раз. В чем суть - обычная табличка MergeTree не окажется магическим образом на второй реплике. Эх.
И последнее - в ClickHouse реализована гомогенная архитектура - все узлы кластера являются равноправными, отсутствует чёткое разделение на ведущие и ведомые ноды.