Os ambientes do Kubernetes permitem escalonar os recursos do banco de dados de forma dinâmica à medida que as demandas de carga de trabalho mudam. Use esses procedimentos de escalonamento se você implantou o Spanner Omni usando o gráfico do Helm.
Antes de começar
Antes de escalonar a implantação do Kubernetes, faça o seguinte:
Faça o download e instale a CLI do Spanner Omni.
Instale Helm e crie uma configuração de gráfico do Helm.
Como prática recomendada, escalone verticalmente até pelo menos 32 GB de memória por servidor antes de adicionar mais servidores para escalonar horizontalmente.
Limitações
O escalonamento no Kubernetes tem as seguintes limitações:
Somente servidores não raiz: o escalonamento horizontal é compatível com instâncias não raiz. O escalonamento de servidores raiz não é compatível.
Restrições de armazenamento do StatefulSet: como os
volumeClaimTemplatesdo Kubernetes são imutáveis, não é possível expandir os discos de pods usando um únicohelm upgradecomando. Em vez disso, o escalonamento do armazenamento exige etapas manuais de expansão de volume.
Escalonar verticalmente
Para ajustar os recursos de CPU ou memória dos servidores, atualize a configuração usando um upgrade do Helm:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set resources.cpu=CPU_CORES \
--set resources.memory=MEMORY_LIMIT \
-n NAMESPACE
Substitua:
HELM_CHART_PATH: o caminho para o gráfico do Helm, por exemplo,oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: a versão do gráfico do Helm, por exemplo,0.2.0.CPU_CORES: o número de núcleos de vCPU a serem atribuídos a cada pod de servidor, por exemplo,8.MEMORY_LIMIT: o limite de RAM para cada pod de servidor, por exemplo,32Gi.NAMESPACE: o namespace do Kubernetes da implantação, por exemplo,spanner-ns.
Escalonar horizontalmente
Para escalonar horizontalmente, adicione mais servidores à implantação. O escalonamento horizontal é compatível com servidores não raiz.
Adicionar servidores não raiz
Para adicionar servidores não raiz, aumente a contagem de réplicas na configuração do gráfico do Helm. É possível escalonar todas as zonas de maneira uniforme ou escalonar uma zona específica.
Escalonar de maneira uniforme
Para escalonar cada zona na implantação para 15 servidores, execute o seguinte comando:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set deployment.replicasPerZone=REPLICAS \
-n NAMESPACE
Substitua:
HELM_CHART_PATH: o caminho para o gráfico do Helm, por exemplo,oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: a versão do gráfico do Helm, por exemplo,0.2.0.REPLICAS: o número de réplicas de servidor por zona, por exemplo,15.NAMESPACE: o namespace do Kubernetes, por exemplo,spanner-ns.
Escalonar uma zona específica
Se a implantação inicial configurou contagens de servidores diferentes para zonas individuais, é possível segmentar uma única zona. Por exemplo, para aumentar as réplicas da primeira zona no primeiro local para 15, execute o seguinte comando:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set locations[0].zones[0].replicas=REPLICAS \
-n NAMESPACE
Substitua REPLICAS pela contagem de réplicas da zona de destino, por exemplo, 15.
Para verificar se os novos servidores foram adicionados à implantação, consulte a CLI do Spanner Omni para listar os servidores de implantação ou visualizar seu painel do Grafana.
spanner deployment servers list \
--zone=ZONE \
--deployment-endpoint=ENDPOINT
Substitua:
ZONE: a zona que você quer listar, por exemplo,us-central1-a.ENDPOINT: o endpoint externo da sua implantação, por exemplo,${ENDPOINT}:15000.
Remover servidores não raiz
O escalonamento de servidores exige etapas adicionais porque o sistema precisa realocar com segurança as partições de dados de servidores desativados. Como os StatefulSets do Kubernetes removem pods do índice mais alto para o mais baixo, é necessário segmentar primeiro os servidores não raiz de índice mais alto para remoção.
Para reduzir escala vertical o número de servidores, siga estas etapas:
Liste os servidores na sua zona para identificar candidatos à remoção:
spanner deployment servers list \ --zone=ZONE \ --deployment-endpoint=ENDPOINTExemplo de saída:
NAME HOST PORT_BASE ROOT STATE zones/us-central1-a/servers/spanner-a-0.pod.spanner-ns:15000 spanner-a-0.pod.spanner-ns 15000 true - zones/us-central1-a/servers/spanner-a-1.pod.spanner-ns:15000 spanner-a-1.pod.spanner-ns 15000 - -Exclua o servidor não raiz desativado com o índice mais alto (por exemplo,
spanner-a-1.pod.spanner-ns:15000):spanner deployment servers delete SERVER_NAME \ --zone=ZONE \ --deployment-endpoint=ENDPOINTSubstitua
SERVER_NAMEpelo identificador do servidor, por exemplo,spanner-a-1.pod.spanner-ns:15000.Verifique a lista de servidores até que o servidor de destino seja removido da listagem. Após a exclusão, o servidor faz a transição para um estado não íntegro no sistema e é removido do caminho de serviço ativo.
Reduza a implantação do Helm executando um comando de upgrade do Helm para corresponder à contagem de réplicas de destino. Por exemplo, para diminuir as réplicas por zona para
1pod, execute o seguinte comando:helm upgrade spanner-omni HELM_CHART_PATH \ --version VERSION \ --reuse-values \ --set deployment.replicasPerZone=REPLICAS \ -n NAMESPACESubstitua
REPLICASpela contagem de réplicas atualizada, por exemplo,1.Exclua as declarações de volume permanente (PVCs, na sigla em inglês) do Kubernetes associadas aos pods removidos. Para evitar a perda acidental de dados, o Helm e o Kubernetes não excluem automaticamente as PVCs ao reduzir um StatefulSet. Exclua manualmente as PVCs para recuperar completamente o armazenamento:
kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACEPor exemplo, para excluir os registros e volumes de dados de
spanner-a-1no namespacespanner-ns:kubectl delete pvc logs-volume-spanner-a-1 data-volume-spanner-a-1 -n spanner-ns
Adicionar uma zona
A adição de uma nova zona à implantação aumenta a disponibilidade e protege o banco de dados contra interrupções de zona única.
Por exemplo, o comando a seguir inicializa uma implantação em execução de zona única
no Google Kubernetes Engine (GKE) na zona us-east1-b da
região us:
helm upgrade --install spanner-omni HELM_CHART_PATH \
--version VERSION \
--set resources.cpu=2 \
--set resources.memory=8Gi \
--set global.platform=gke \
--set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
-n NAMESPACE
Adicione a zona us-east1-c a essa configuração seguindo estas etapas:
Inicie os pods na nova zona executando o comando
helm upgradee transmitindo um bloco JSON atualizado que inclua a nova zona de local:helm upgrade spanner-omni HELM_CHART_PATH \ --version VERSION \ --reuse-values \ --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"},{"name":"us-east1-c","shortName":"east-c"}]}]' \ -n NAMESPACEAdicione a nova zona usando a CLI do Spanner Omni. Aguarde até que os pods do servidor raiz na zona recém-criada entrem no estado
Runninge pronto. Em seguida, execute o comando de criação de zona:spanner deployment zones create NEW_ZONE \ --location=LOCATION \ --root-servers=ROOT_SERVERS_LIST \ --deployment-endpoint=ENDPOINTSubstitua:
NEW_ZONE: o identificador da zona a ser adicionada, por exemplo,us-east1-c.LOCATION: o local da implantação, por exemplo,us.ROOT_SERVERS_LIST: uma lista separada por vírgulas de endpoints de servidor raiz na nova zona, por exemplo,spanner-east-c-0.pod.spanner-ns:15000,spanner-east-c-1.pod.spanner-ns:15000,spanner-east-c-2.pod.spanner-ns:15000.ENDPOINT: o endpoint de implantação externo, por exemplo,${ENDPOINT}:15000.
Aguarde a conclusão da criação da zona. A replicação de esquemas e tabelas de banco de dados atuais para uma nova zona leva tempo. Monitore o progresso da sincronização da zona listando as zonas de implantação:
spanner deployment zones list --deployment-endpoint=ENDPOINT
Remover uma zona
É possível desativar uma zona ativa da implantação de várias zonas para reduzir os recursos ou se alinhar às mudanças de topologia.
Remova a zona us-east1-c criada na seção anterior seguindo estas etapas:
Exclua a zona e inicie a desmontagem da zona no Spanner Omni:
spanner deployment zones delete ZONE --deployment-endpoint=ENDPOINTSubstitua
ZONEpela zona a ser removida, por exemplo,us-east1-c.Verifique se a zona foi removida. Execute um comando de lista e aguarde até que a zona não apareça mais na saída:
spanner deployment zones list --deployment-endpoint=ENDPOINTRemova os servidores do cluster do Kubernetes executando um comando de upgrade do Helm e transmitindo um bloco JSON de locais atualizado que exclua a zona removida:
helm upgrade spanner-omni HELM_CHART_PATH \ --version VERSION \ --reuse-values \ --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \ -n NAMESPACE
Escalonar o armazenamento
Como os volumeClaimTemplates do Kubernetes são imutáveis, não é possível escalonar verticalmente as capacidades de armazenamento de pods usando o comando helm upgrade diretamente. Em vez disso, é necessário realizar uma expansão manual do volume. Para mais informações, consulte o
guia de expansão de volume do StatefulSet do GKE.
Para expandir o armazenamento em disco, siga estas etapas:
Defina os parâmetros para a expansão do volume como variáveis de ambiente no terminal:
NEW_SIZE="NEW_SIZE" NAMESPACE="NAMESPACE" RELEASE_NAME="spanner-omni" STATEFULSET_NAMES="STATEFULSET_NAME_1 STATEFULSET_NAME_2 STATEFULSET_NAME_3" HELM_CHART_PATH="HELM_CHART_PATH" VERSION="VERSION"Substitua:
NEW_SIZE: o tamanho da capacidade de armazenamento de destino, por exemplo,200Gi.NAMESPACE: o namespace do Kubernetes, por exemplo,spanner-ns.STATEFULSET_NAME_1,STATEFULSET_NAME_2, ...: os nomes dos StatefulSets na implantação, normalmente correspondentes aos nomes abreviados das zonas (por exemplo,spanner-east-b spanner-east-c).HELM_CHART_PATH: o caminho para o gráfico do Helm, por exemplo,oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: a versão do gráfico do Helm, por exemplo,0.2.0.
Execute os comandos para corrigir as PVCs, excluir os StatefulSets (deixando os pods de back-end intactos) e fazer upgrade da implantação do Helm:
# Patch all associated PVCs directly. for pvc in $(kubectl get pvc -n $NAMESPACE \ -l app.kubernetes.io/instance=$RELEASE_NAME \ -o name | grep "data-volume"); do kubectl patch $pvc -n $NAMESPACE -p "{\"spec\":{\"resources\":{\"requests\":{\"storage\":\"$NEW_SIZE\"}}}}" done # Delete the StatefulSet while leaving backend pods intact (orphan cascade). kubectl delete statefulset $STATEFULSET_NAMES -n $NAMESPACE --cascade=orphan # Run Helm upgrade to align the templates with the expanded size. helm upgrade $RELEASE_NAME $HELM_CHART_PATH \ --version $VERSION \ --reuse-values \ --set storage.data.size=$NEW_SIZE \ -n $NAMESPACE
Próximas etapas
- Saiba como manter uma implantação.