ClickHouseCluster, как безопасно масштабировать кворум KeeperCluster и за какими состояниями нужно следить во время операции масштабирования.
Для
ClickHouseCluster всегда требуется Keeper, на который ссылается обязательное поле spec.keeperClusterRef — оператор координирует кластер через него независимо от размера. Чтобы запускать более одной реплики на сегмент, данные также должны храниться в таблицах ReplicatedMergeTree, поскольку именно репликация позволяет второй реплике обслуживать те же строки.Масштабирование реплик
spec.replicas задаёт количество реплик в каждом сегменте. Каждая реплика запускается в собственном StatefulSet с именем <cluster>-clickhouse-<shard>-<replica>, поэтому в кластере с shards: 2 и replicas: 3 будет запущено шесть StatefulSets.
Увеличьте или уменьшите это количество прямо в существующей конфигурации:
Масштабирование сегментов
spec.shards задаёт количество сегментов. Каждый новый сегмент добавляет полный набор StatefulSet для каждой реплики, а оператор создаёт один PodDisruptionBudget на сегмент, чтобы сбой в одном сегменте не учитывался при расчёте для другого.
Distributed или явная схема маршрутизации определяет, в какой сегмент попадёт строка, поэтому добавление сегмента просто даёт новым записям новое место для записи, не затрагивая строки, уже хранящиеся в существующих сегментах.
Автоматическая синхронизация схемы
spec.settings.enableDatabaseSync имеет значение true (по умолчанию), оператор поддерживает согласованность схемы при изменении топологии:
- При масштабировании вверх — как только готовы как минимум две реплики, оператор реплицирует определения баз данных на вновь созданные реплики, чтобы новая реплика присоединилась с теми же базами данных
Replicatedи базами данных интеграций, что и остальные узлы кластера. - При масштабировании вниз — прежде чем реплика исчезнет, оператор удаляет регистрацию этой реплики из каждой базы данных
Replicatedс помощьюSYSTEM DROP DATABASE REPLICA, чтобы уменьшенный кластер не ожидал реплику базы данныхReplicated, которой больше не существует.
Replicated и движкам баз данных интеграций. Табличные данные при этом не перемещаются — данные строк хранятся в таблицах ReplicatedMergeTree и реплицируются через Keeper независимо от этой синхронизации схемы. Если готова только одна реплика, реплицировать некуда, поэтому оператор пропускает этот шаг и записывает в журнал, что целевой реплики нет.
Установите enableDatabaseSync: false, чтобы отключить это поведение, например если за распространение схемы отвечает внешний инструмент. В этом случае оператор указывает причину SchemaSyncDisabled в условии SchemaInSync.
Состояния, за которыми стоит следить
Операция масштабирования считается завершенной, когда
ClusterSizeAligned имеет значение UpToDate, SchemaInSync — ReplicasInSync, а Ready — AllShardsReady.
Масштабирование Keeper
KeeperCluster работает с RAFT-кворумом, поэтому оператор изменяет его состав по одной реплике за раз и только когда кластер находится в стабильном состоянии. Это защищает кворум: кластер 2F+1 допускает отказ F участников, поэтому кластер из 3 узлов продолжает работать при отсутствии одного участника, а кластер из 5 узлов — двух.
maxUnavailable: replicas/2, чтобы сохранять кворум во время плановых прерываний.
Условие ScaleAllowed показывает, может ли кворум изменить состав прямо сейчас:
Масштабируйте Keeper по одному шагу и давайте
ScaleAllowed вернуться к ReadyToScale между изменениями. Переход сразу на несколько участников не отменяет пошаговое согласование — оператор всё равно изменяет кворум по одному участнику за шаг.