Os pods do Cassandra não são iniciados na região secundária

Está a ver a documentação do Apigee e do Apigee Hybrid.
Ver documentação do Apigee Edge.

Sintoma

Os pods do Cassandra não são iniciados numa das regiões numa configuração híbrida do Apigee de várias regiões. Quando aplica o ficheiro overrides.yaml, os pods do Cassandra não são iniciados com êxito.

Mensagens de erro

  1. Vai observar a seguinte mensagem de erro nos registos do pod do Cassandra:
    Exception (java.lang.RuntimeException) encountered during startup:
    A node with address 10.52.18.40 already exists, cancelling join.
    use cassandra.replace_addrees if you want to replace this node.
  2. Pode observar o seguinte aviso no estado do pod do Cassandra:

Causas possíveis

Normalmente, este problema é observado no seguinte cenário:

  1. O cluster de tempo de execução do Apigee é eliminado numa das regiões.
  2. É feita uma tentativa de reinstalar o cluster de tempo de execução do Apigee na região com a configuração do anfitrião de semente do Cassandra no ficheiro overrides.yaml, conforme descrito na implementação em várias regiões no GKE e no GKE on-prem.
  3. A eliminação do cluster de tempo de execução do Apigee não remove as referências no cluster do Cassandra. Assim, as referências desatualizadas dos pods do Cassandra no cluster eliminado são mantidas. Por este motivo, quando tenta reinstalar o cluster de tempo de execução do Apigee na região secundária, os pods do Cassandra queixam-se de que determinados endereços IP já existem. Isto deve-se ao facto de os endereços IP poderem ser atribuídos a partir da mesma sub-rede que foi usada anteriormente.
Causa Descrição
Referências desatualizadas a pods de regiões secundárias eliminadas no cluster do Cassandra A eliminação do cluster de tempo de execução do Apigee na região secundária não remove as referências aos endereços IP dos pods do Cassandra na região secundária.

Causa: referências desatualizadas a pods de regiões secundárias eliminados no cluster do Cassandra

Diagnóstico

  1. A mensagem de erro nos registos do pod do Cassandra A node with address 10.52.18.40 already exists indica que existe uma referência desatualizada a um dos pods do Cassandra da região secundária com o endereço IP 10.52.18.40. Valide esta ação executando o comando nodetool status na região principal.

    Exemplo de saída:

    O exemplo acima mostra que o endereço IP 10.52.18.40 associado aos pods do Cassandra da região secundária ainda está listado na saída.

  2. Se o resultado contiver referências desatualizadas a pods do Cassandra na região secundária, significa que a região secundária foi eliminada, mas os endereços IP dos pods do Cassandra na região secundária não foram removidos.

Resolução

Siga os passos seguintes para remover as referências desatualizadas dos pods do Cassandra do cluster eliminado:

  1. Inicie sessão no contentor e ligue-se à interface de linha de comandos do Cassandra seguindo os passos em Crie o contentor de cliente.
  2. Depois de iniciar sessão no contentor e estabelecer ligação à interface do Cassandra cqlsh, execute a seguinte consulta SQL para listar as definições de keyspace atuais:
    select * from system_schema.keyspaces;

    Exemplo de saída que mostra os espaços de chaves atuais:

    Na saída seguinte, Primary-DC1 refere-se à região principal e Secondary-DC2 refere-se à região secundária.

    bash-4.4# cqlsh 10.50.112.194 -u admin_user -p ADMIN.PASSWORD --ssl
    Connected to apigeecluster at 10.50.112.194:9042.
    [cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
    Use HELP for help.
    
    admin_user@cqlsh> Select * from system_schema.keyspaces;
    
    keyspace_name                        | durable_writes | replication
    -------------------------------------+----------------+--------------------------------------------------------------------------------------------------
    system_auth                          |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    kvm_tsg1_apigee_hybrid_prod_hybrid   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    kms_tsg1_apigee_hybrid_prod_hybrid   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    system_schema                        |           True |                                           {'class': 'org.apache.cassandra.locator.LocalStrategy'}
    system_distributed                   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    system                               |           True |                                           {'class': 'org.apache.cassandra.locator.LocalStrategy'}
    perses                               |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    cache_tsg1_apigee_hybrid_prod_hybrid |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    rtc_tsg1_apigee_hybrid_prod_hybrid   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    quota_tsg1_apigee_hybrid_prod_hybrid |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    system_traces                        |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    (11 rows)

    Como pode ver, os keyspaces referem-se a Primary-DC1 e Secondary-DC2, apesar de o cluster de tempo de execução do Apigee ter sido eliminado na região secundária.

    As referências desatualizadas a Secondary-DC2 têm de ser eliminadas de cada uma das definições de keyspace.

  3. Antes de eliminar as referências desatualizadas nas definições de keyspace, use o seguinte comando para eliminar toda a instalação do Apigee hybrid, exceto o ASM (Istio) e cert-manager, do Secondary-DC2. Para mais informações, consulte o artigo Desinstale o tempo de execução híbrido.
    helm uninstall -n APIGEE_NAMESPACE ENV_GROUP_RELEASE_NAME ENV_RELEASE_NAME $ORG_NAME ingress-manager telemetry redis datastore

    Além disso, desinstale a app apigee-operator:

    helm uninstall -n APIGEE_NAMESPACE operator
  4. Remova as referências desatualizadas a Secondary-DC2 de cada um dos keyspaces alterando a definição de keyspace.
    ALTER KEYSPACE system_auth WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE kvm_ORG_NAME_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE kms_ORG_NAME_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE system_distributed WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE perses WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE cache_ORG_NAME_apigee_hybrid_ENV_NAME_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE rtc_ORG_NAME_apigee_hybrid_ENV_NAME_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE quota_ORG_NAME_apigee_hybrid_ENV_NAME_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE system_traces WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
  5. Verifique se as referências desatualizadas à região Secondary-DC2 foram removidas de todos os keyspaces executando o seguinte comando:
    select * from system_schema.keyspaces;
  6. Inicie sessão num pod do Cassandra de Primary-DC1 e remova as referências aos UUIDs de todos os pods do Cassandra de Secondary-DC2. Pode obter os UUIDs a partir do comando nodetool status, conforme descrito anteriormente na secção Diagnóstico.
    kubectl exec -it -n apigee apigee-cassandra-default-0 -- bash
    nodetool -u admin_user -pw ADMIN.PASSWORD removenode UUID_OF_CASSANDRA_POD_IN_SECONDARY_DC2
    
  7. Verifique se não existem pods do Cassandra de Secondary-DC2 executando novamente o comando nodetool status.
  8. Instale o cluster de tempo de execução do Apigee na região secundária (Secondary-DC2) seguindo os passos em Implementação em várias regiões no GKE e GKE On-Prem.

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 da Google Cloud:

  1. O ID do projeto do Google Cloud
  2. O nome da organização do Apigee Hybrid
  3. Os ficheiros overrides.yaml das regiões principal e secundária, ocultando todas as informações confidenciais
  4. Estado do pod do Kubernetes em todos os espaços de nomes das regiões principal e secundária:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
    
  5. Um despejo cluster-info do Kubernetes das regiões principal e secundária:
    # generate kubernetes cluster-info dump
    kubectl cluster-info dump -A --output-directory=/tmp/kubectl-cluster-info-dump
    
    # zip kubernetes cluster-info dump
    zip -r kubectl-cluster-info-dump`date +%Y.%m.%d_%H.%M.%S`.zip /tmp/kubectl-cluster-info-dump/*
    
  6. A saída dos comandos nodetool abaixo da região principal.
    export u=`kubectl -n apigee get secrets apigee-datastore-default-creds -o jsonpath='{.data.jmx\.user}' | base64 -d`
    export pw=`kubectl -n apigee get secrets apigee-datastore-default-creds -o jsonpath='{.data.jmx\.password}' | base64 -d`
    
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw info 2>&1 | tee /tmp/k_nodetool_info_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw describecluster 2>&1 | tee /tmp/k_nodetool_describecluster_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw failuredetector 2>&1 | tee /tmp/k_nodetool_failuredetector_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw status 2>&1 | tee /tmp/k_nodetool_status_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw gossipinfo 2>&1 | tee /tmp/k_nodetool_gossipinfo_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw netstats 2>&1 | tee /tmp/k_nodetool_netstats_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw proxyhistograms 2>&1 | tee /tmp/k_nodetool_proxyhistograms_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw tpstats 2>&1 | tee /tmp/k_nodetool_tpstats_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw gcstats 2>&1 | tee /tmp/k_nodetool_gcstats_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw version 2>&1 | tee /tmp/k_nodetool_version_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw ring 2>&1 | tee /tmp/k_nodetool_ring_$(date +%Y.%m.%d_%H.%M.%S).txt
          

Referências