Você escala um cluster editando as contagens de réplicas e shards no recurso personalizado. O operador reconcilia o cluster em execução com a nova topologia: cria ou remove os StatefulSets de cada réplica, mantém o esquema sincronizado e mostra o progresso por meio das condições de status.
Este guia explica como escalar réplicas e shards de ClickHouseCluster, como escalar com segurança o quórum de um KeeperCluster e quais condições observar enquanto uma operação de escalonamento está em andamento.
Escalonamento de réplicas
spec.replicas define o número de réplicas em cada shard. Cada réplica roda em seu próprio StatefulSet chamado <cluster>-clickhouse-<shard>-<replica>, portanto, um cluster com shards: 2 e replicas: 3 executa seis StatefulSets.
Aumente ou diminua a quantidade diretamente:
spec:
replicas: 3 # was 1
keeperClusterRef:
name: my-keeperAo aumentar a escala, o operador cria os novos StatefulSets por réplica, aguarda que cada pod do Kubernetes fique pronto e, em seguida, sincroniza o esquema com as novas réplicas (consulte Sincronização automática de esquema). Ao reduzir a escala, ele remove os StatefulSets excedentes e limpa os registros obsoletos de réplica do banco de dados replicado deixados pelas réplicas removidas.
Escalonamento de shards
spec.shards define o número de shards. Cada novo shard adiciona um conjunto completo de StatefulSets por réplica, e o operador cria um PodDisruptionBudget por shard para que uma interrupção em um shard não seja contabilizada em outro.
spec:
shards: 3 # was 1
replicas: 2Cada shard contém uma porção distinta dos dados, e o operador não copia nem move linhas entre shards. Uma tabela Distributed ou um esquema de roteamento explícito decide em qual shard uma linha ficará, de modo que adicionar um shard dá às novas escritas um lugar para serem direcionadas sem mexer nas linhas já armazenadas nos shards existentes.
Sincronização automática de esquema
Quando spec.settings.enableDatabaseSync é true (o padrão), o operador mantém o esquema alinhado conforme a topologia muda:
- Ao aumentar a escala — assim que pelo menos duas réplicas estiverem prontas, o operador replica as definições do banco de dados para as réplicas recém-criadas, para que uma nova réplica entre com os mesmos bancos de dados
Replicatede de integração que o restante do cluster. - Ao reduzir a escala — antes que uma réplica desapareça, o operador remove o registro da réplica de cada banco de dados
ReplicatedcomSYSTEM DROP DATABASE REPLICA, para que o cluster reduzido não fique aguardando uma réplica de banco de dadosReplicatedque não existe mais.
Isso cobre bancos de dados Replicated e motores de banco de dados de integração. Isso não move dados de tabela — os dados de linha ficam em tabelas ReplicatedMergeTree e são replicados por meio do Keeper, independentemente dessa sincronização de esquema. Com apenas uma réplica pronta, não há nada para replicar, então o operador pula esse passo e registra em log que não há destino.
Defina enableDatabaseSync: false para desativar esse comportamento, por exemplo, quando uma ferramenta externa é responsável pela propagação do esquema. O operador então informa o motivo SchemaSyncDisabled na condição SchemaInSync.
Condições para acompanhar
Acompanhe o progresso do recurso personalizado enquanto a operação de escalonamento estiver em execução:
kubectl get clickhousecluster sample -o yaml | sed -n '/conditions:/,/^[^ ]/p'| Condição | Motivo | Significado |
|---|---|---|
ClusterSizeAligned |
UpToDate |
O número de réplicas em execução corresponde à topologia solicitada |
ClusterSizeAligned |
ScalingUp |
O operador está adicionando réplicas |
ClusterSizeAligned |
ScalingDown |
O operador está removendo réplicas |
SchemaInSync |
ReplicasInSync |
Os bancos de dados existem em todas as réplicas e os metadados desatualizados foram removidos |
SchemaInSync |
DatabasesNotCreated |
O operador ainda não terminou de criar os bancos de dados nas novas réplicas |
SchemaInSync |
ReplicasNotCleanedUp |
Os metadados desatualizados das réplicas após uma redução de escala ainda não foram removidos |
SchemaInSync |
SchemaSyncDisabled |
enableDatabaseSync é false |
Ready |
AllShardsReady |
Todo shard tem uma réplica pronta |
Ready |
SomeShardsNotReady |
Pelo menos um shard não tem nenhuma réplica pronta |
Uma operação de escala é concluída quando ClusterSizeAligned informa UpToDate, SchemaInSync informa ReplicasInSync e Ready informa AllShardsReady.
Escalonamento do Keeper
Um KeeperCluster opera com um quórum RAFT, portanto o operador altera seus membros uma réplica por vez e apenas enquanto o cluster estiver em um estado estável. Isso protege o quórum: um cluster 2F+1 tolera F membros indisponíveis, então um cluster de 3 nós continua funcionando com um membro ausente, e um cluster de 5 nós, com dois.
spec:
replicas: 5 # was 3Ao aumentar a escala, o operador adiciona ao quórum o menor ID de réplica livre; ao reduzir a escala, remove o maior ID. Cada etapa espera o quórum se estabilizar antes de a próxima começar. O PodDisruptionBudget do Keeper usa por padrão maxUnavailable: replicas/2 para preservar o quórum durante interrupções voluntárias.
A condição ScaleAllowed informa se o quórum pode mudar sua composição neste momento:
| Reason | Meaning |
|---|---|
ReadyToScale |
O quórum está estável e o operador pode adicionar ou remover um membro |
ReplicaHasPendingChanges |
Uma réplica ainda tem uma alteração de configuração pendente |
ReplicaNotReady |
Uma réplica não está pronta, então as mudanças na composição aguardam |
NoQuorum |
O cluster não tem quórum e não pode mudar sua composição com segurança |
WaitingFollowers |
O operador está aguardando os seguidores se atualizarem |
Escale o Keeper um passo por vez e deixe ScaleAllowed voltar para ReadyToScale entre as mudanças. Pular vários membros de uma vez não contorna a reconciliação de um por vez — o operador ainda percorre o quórum com um membro por etapa.