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.
Um
ClickHouseCluster sempre precisa de um Keeper, referenciado pelo campo obrigatório spec.keeperClusterRef — o operador coordena o cluster por meio dele, independentemente do tamanho. Para executar mais de uma réplica por shard, os dados também precisam estar em tabelas ReplicatedMergeTree, já que é a replicação que permite que uma segunda réplica atenda as mesmas linhas.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:
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.
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
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.
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
Uma operação de escala é concluída quando
ClusterSizeAligned informa UpToDate, SchemaInSync informa ReplicasInSync e Ready informa AllShardsReady.
Escalonamento do Keeper
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.
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:
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.