Está a ver a documentação do Apigee e do Apigee Hybrid.
Não existe um equivalente
na documentação do Apigee Edge para este tópico.
Sintoma
Durante o restauro do Cassandra no Apigee hybrid, pode encontrar erros nos registos de restauro.
Mensagem de erro
Vê uma das seguintes opções nos registos:
java.net.ConnectException: Connection timed out (Connection timed out)
/tmp/tmp/schema.cql:662:OperationTimedOut: errors={'10.0.0.1': 'Client request timeout. See Session.execute[_async](timeout)'}, last_host=10.0.0.1
/tmp/tmp/schema.cql:6409:AlreadyExists: Table 'kvm_myorg.kvm_map_keys_descriptor' already exists
Causas possíveis
Causa | Descrição | Instruções de resolução de problemas aplicáveis a |
---|---|---|
A ligação excedeu o tempo limite |
Este erro é um erro de conetividade entre os auriculares
apigee-cassandra-restore e os auriculares
apigee-cassandra-default-* .
|
Apigee Hybrid |
A operação excedeu o tempo limite | Este erro ocorre se o tempo limite da restauração for excedido após mais de 15 minutos. | Apigee Hybrid |
Já existe | Esta mensagem de erro não está relacionada com a causa do problema e é o resultado de uma operação de repetição de uma tarefa de restauro. | Apigee Hybrid |
Causa: o tempo limite da ligação foi excedido
O erro seguinte é um erro de conetividade entre os pods apigee-cassandra-restore
e os pods apigee-cassandra-default-*
:
java.net.ConnectException: Connection timed out (Connection timed out)
Diagnóstico
-
Se a sua rede anfitriã não for acessível a partir da rede do pod, certifique-se de que
hostNetwork
está definido comofalse
emcassandra
emoverrides.yaml
, conforme mostrado em Restaurar uma região a partir de uma cópia de segurança. -
Para testar a conetividade, inicie sessão no pod
apigee-mart
ou no podapigee-runtime
, que está na mesma rede que a tarefaapigee-cassandra-restore
. Também pode usar qualquer outro pod na rede de pods.-
Obtenha o nome do agrupamento de anúncios:
apigee-mart
kubectl -n apigee get po --selector=app=apigee-mart --no-headers -o custom-columns=":metadata.name"
-
Execute uma sessão bash no pod mart:
kubectl exec -it MART_POD_NAME -n apigee -- bash
Substitua MART_POD_NAME pelo nome do pod MART. Por exemplo,
apigee-mart-myorg--9a8228a-191-t0xh1-qz5fl
. -
Execute testes de conetividade em relação às
portas do Cassandra:
curl -v -m 5 telnet://apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local:9042
curl -v -m 5 telnet://apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local:7001
Se receber um erro
Connection timed out
na saída, significa que tem problemas de conetividade. No entanto, se vir uma mensagemConnected to
, significa que a ligação foi estabelecida com êxito e tem de premir Ctrl + C para fechar a ligação e continuar. -
Obtenha o nome do agrupamento de anúncios:
Resolução
Certifique-se de que a definição HostNetwork
está definida como
false
no ficheiro overrides.yaml
usado para o restauro,
e
repita o processo de restauro. Se a definição já estiver definida como
false
, mas vir erros de conetividade, certifique-se de que os pods do Cassandra
estão em funcionamento com o seguinte comando:
kubectl get pods -n apigee -l app=apigee-cassandra
O resultado deve ter um aspeto semelhante ao seguinte exemplo:
NAME READY STATUS RESTARTS AGE apigee-cassandra-default-0 1/1 Running 0 14m apigee-cassandra-default-1 1/1 Running 0 13m apigee-cassandra-default-2 1/1 Running 0 11m exampleuser@example hybrid-files %
Causa: a operação excedeu o tempo limite
O seguinte erro ocorre se o restauro exceder o limite de tempo após mais de 15 minutos. O erro indica problemas de E/S, como o armazenamento e a rede, que não conseguem transmitir o conteúdo não comprimido da cópia de segurança a tempo.
/tmp/tmp/schema.cql:662:OperationTimedOut: errors={'10.0.0.1': 'Client request timeout. See Session.execute[_async](timeout)'}, last_host=10.0.0.1
Diagnóstico
-
Verifique os registos
apigee-cassandra-default-0
para anotar a data/hora do início da restauração:kubectl logs apigee-cassandra-default-0 -n apigee | grep 'MigrationManager.java' | head -n 1
-
Compare a data/hora com o registo mais recente da criação da tabela:
kubectl logs apigee-cassandra-default-0 -n apigee | grep 'Create new table' | tail -n 1
Os resultados desta comparação devem mostrar que o pod do Cassandra ainda estava a criar tabelas depois de o limite de tempo ter sido excedido.
-
Teste a largura de banda de armazenamento com os seguintes comandos:
kubectl -n apigee exec -it apigee-cassandra-default-0 -- bash -c 'dd if=/dev/zero of=/opt/apigee/data/test.img bs=200M count=1 ; rm /opt/apigee/data/test.img'
kubectl -n apigee exec -it apigee-cassandra-default-1 -- bash -c 'dd if=/dev/zero of=/opt/apigee/data/test.img bs=200M count=1 ; rm /opt/apigee/data/test.img'
kubectl -n apigee exec -it apigee-cassandra-default-2 -- bash -c 'dd if=/dev/zero of=/opt/apigee/data/test.img bs=200M count=1 ; rm /opt/apigee/data/test.img'
Se a velocidade de gravação for inferior a 100 MB/s, isto pode indicar a falta de uma StorageClass adequada (SSD) usada.
-
Teste a largura de banda da rede:
-
Execute
netcat
no pod do Cassandra para ouvir na porta:kubectl -n apigee exec -it apigee-cassandra-default-0 -- bash -c 'nc -l -p 3456 > /dev/null'
-
Numa sessão de shell separada, obtenha o nome do pod
apigee-mart
:kubectl -n apigee get po --selector=app=apigee-mart --no-headers -o custom-columns=":metadata.name"
-
Execute uma sessão bash no agrupamento
apigee-mart
. Também pode usar qualquer outro pod na rede de pods:kubectl exec -it MART_POD_NAME -n apigee -- bash
Substitua MART_POD_NAME pelo nome do pod MART. Por exemplo,
apigee-mart-myorg--9a8228a-191-t0xh1-qz5fl
. -
Execute um teste de largura de banda da rede no pod do Cassandra que ainda está a executar o comando
netcat
:dd if=/dev/zero bs=50M count=1 | nc apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local 3456
Pode repetir o processo para outros pods do Cassandra. Se a velocidade resultante for inferior a 10 MB/s, é muito provável que a largura de banda da rede seja a causa do problema.
-
Resolução
Depois de confirmar a velocidade de E/S lenta com os passos acima, certifique-se de que o cluster cumpre os requisitos mínimos de rede e armazenamento. Teste novamente a largura de banda.
Causa: já existe
Diagnóstico
For apresentado um erro semelhante ao seguinte:
/tmp/tmp/schema.cql:6409:AlreadyExists: Table 'kvm_myorg.kvm_map_keys_descriptor' already exists
Resolução
Esta mensagem de erro não está relacionada com a causa do problema e é o resultado de uma operação de repetição de uma tarefa de restauro. A mensagem de erro real deve ser apresentada nos registos do primeiro pod com falha.
Obtenha os registos da falha inicial para diagnosticar o problema.
Se o problema persistir, aceda a Informações de diagnóstico necessárias.
Solução alternativa para o problema conhecido 391861216
Diagnóstico
O pod do Cassandra com o número mais elevado está no estado CrashLoopBackoff
após o restauro.
Isto pode ocorrer devido ao problema conhecido 391861216.
É apresentado um erro no registo do pod do Cassandra semelhante ao seguinte:
Cannot change the number of tokens from 512 to 256
Resolução
Siga os passos abaixo para resolver o problema subjacente. Isto permite que o Cassandra seja iniciado normalmente, preservando os dados.
-
Inicie a eliminação do PVC para o pod do Cassandra bloqueado no estado
CrashLoopBackoff
. Defina POD_NAME para o nome do pod no estadoCrashLoopBackoff
. Defina APIGEE_NAMESPACE para o espaço de nomes do cluster no qual o Apigee está instalado.kubectl delete pvc cassandra-data-POD_NAME -n APIGEE_NAMESPACE --wait=false
-
Elimine o pod no estado
CrashLoopBackoff
.kubectl delete pod POD_NAME -n APIGEE_NAMESPACE
-
Altere manualmente o anfitrião inicial do Cassandra para o pod com o número mais elevado. Por exemplo, se tiver 3 réplicas, SEED_POD_NAME deve ser
apigee-cassandra-default-2
. Só precisa de fazer isto uma vez e pode ignorar este passo para agrupamentos subsequentes.kubectl patch apigeeds/default -n APIGEE_NAMESPACE --type='merge' -p '{"spec": {"components": {"cassandra": {"properties": {"externalSeedHost":"SEED_POD_NAME.apigee-cassandra-default.APIGEE_NAMESPACE.svc.cluster.local"}}}}}'
-
Remova o nó com 512 tokens do anel do Cassandra.
kubectl exec -n APIGEE_NAMESPACE -t sts/apigee-cassandra-default -c apigee-cassandra -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD status' | awk '/^DN .*\?.* 512 / {print $6; exit}; /^DN .* [KMG]iB.* 512 / {print $7; exit}' | xargs -I {} kubectl exec -n APIGEE_NAMESPACE -t sts/apigee-cassandra-default -c apigee-cassandra -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD removenode {}'
-
Aguarde que o pod do Cassandra seja recuperado, reinicie-o possivelmente mais do que uma vez e atinja um estado de
Ready
2/2
. O pod seguinte mais elevado passa para o estadoCrashLoopBackoff
.kubectl get pods -n APIGEE_NAMESPACE -l app=apigee-cassandra -w
-
Atualize POD_NAME e repita os passos anteriores para os restantes pods, um de cada vez, à medida que entram no estado
CrashLoopBackoff
até que todos os pods estejam num estadoReady
de2/2
e tenham um estadoRunning
. -
Verifique se todos os pods aderiram com êxito ao anel do Cassandra.
kubectl exec -n APIGEE_NAMESPACE -t sts/apigee-cassandra-default -c apigee-cassandra -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD status'
Todos os nós do Cassandra devem ter o estado
UN
e 256 tokens. -
Reverta a alteração ao anfitrião inicial do Cassandra.
kubectl patch apigeeds/default -n APIGEE_NAMESPACE --type='merge' -p '{"spec": {"components": {"cassandra": {"properties": {"externalSeedHost":""}}}}}'
O controlador do Apigee Datastore reinicia novamente os pods do Cassandra, uma vez que reverte a alteração do anfitrião inicial.
Tem de recolher informações de diagnóstico
Se o problema persistir mesmo depois de seguir as instruções acima, reúna as seguintes informações de diagnóstico e, em seguida, contacte o apoio ao cliente do Google Cloud:
-
Além dos dados habituais que lhe podem ser solicitados, recolha os dados de diagnóstico de todos os pods do Cassandra com o seguinte comando:
for p in $(kubectl -n apigee get pods -l app=apigee-cassandra --no-headers -o custom-columns=":metadata.name") ; do \ for com in info describecluster failuredetector version status ring info gossipinfo compactionstats tpstats netstats cfstats proxyhistograms gcstats ; do kubectl \ -n apigee exec ${p} -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD '"$com"' 2>&1 '\ | tee /tmp/k_cassandra_nodetool_${com}_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt | head -n 40 ; echo '...' ; done; done
-
Comprima-o e faculte-o no registo de apoio técnico:
tar -cvzf /tmp/cassandra_data_$(date +%Y.%m.%d_%H.%M.%S).tar.gz /tmp/k_cassandra_nodetool*
- Recolha e faculte registos do pod de restauro. Tenha em atenção que os registos têm uma duração curta, pelo que devem ser recolhidos imediatamente após a falha.
- Se seguiu os passos de diagnóstico acima, recolha todas as saídas da consola, copie-as para um ficheiro e anexe o ficheiro ao registo de apoio técnico.