Os ambientes do Kubernetes permitem escalonar os recursos do banco de dados de forma dinâmica à medida que as demandas da carga de trabalho mudam. Use estes procedimentos de escalonamento se você implantou o Spanner Omni usando o gráfico do Helm.
Antes de começar
Antes de escalonar sua implantação do Kubernetes, faça o seguinte:
Faça o download e instale a CLI do Spanner Omni.
Instale o Helm e crie uma configuração de gráfico do Helm.
Como prática recomendada, sugerimos fazer o escalonamento vertical 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 do servidor 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 pod usando um único comandohelm upgrade. 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 Helm, por exemplo,oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: a versão do gráfico Helm, por exemplo,1.0.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 à sua 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 Helm. É possível escalonar todas as zonas de maneira uniforme ou 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 Helm. Por exemplo,oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: a versão do gráfico Helm. Por exemplo,1.0.0.REPLICAS: o número de réplicas de servidor por zona, por exemplo,15.NAMESPACE: o namespace do Kubernetes. Por exemplo,spanner-ns.
Ajustar uma zona específica
Se a implantação inicial tiver configurado contagens de servidores diferentes para zonas individuais, você poderá 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 entraram na implantação, consulte a CLI do Spanner Omni para listar os servidores de implantação ou acesse o 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
A redução de servidores exige etapas adicionais porque o sistema precisa realocar com segurança as partições de dados dos servidores desativados. Como os StatefulSets do Kubernetes removem pods do índice mais alto para o mais baixo, primeiro você precisa segmentar 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. Depois da exclusão, o servidor passa para um estado não íntegro no sistema e é removido do caminho de serviço ativo.
Reduza o escalonamento da 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 o pod
1, 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 reivindicaçõ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 PVCs ao reduzir um StatefulSet. Exclua manualmente os 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
Adicionar uma nova zona à implantação aumenta a disponibilidade e protege o banco de dados contra falhas 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 inclui a nova zona de localidade: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 de 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 externa. 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 de zona listando as zonas de implantação:
spanner deployment zones list --deployment-endpoint=ENDPOINT
Remover uma zona
É possível desativar uma zona ativa da sua implantação multizona para reduzir 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 desativação dela 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 "helm upgrade" e transmitindo um bloco JSON de locais atualizado que exclui 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 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, faça uma expansão manual do volume. Para mais informações, consulte o
guia de expansão de volume do StatefulSet do GKE.
Para aumentar o armazenamento em disco, siga estas etapas:
Defina os parâmetros para a expansão de 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 sua implantação, geralmente correspondendo aos nomes abreviados das suas zonas (por exemplo,spanner-east-b spanner-east-c).HELM_CHART_PATH: o caminho para seu gráfico Helm, por exemplo,oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.VERSION: a versão do gráfico Helm. Por exemplo,1.0.0.
Execute os comandos para corrigir os 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.