Pods do Cassandra não iniciados na região secundária

Esta é a documentação da Apigee e da Apigee híbrida.
Confira a documentação da Apigee Edge.

Sintoma

Os pods do Cassandra não são iniciados em uma das regiões em uma configuração da Apigee híbrida multirregional. Ao aplicar o arquivo overrides.yaml, os pods do Cassandra não são iniciados.

Mensagens de erro

  1. Você observará a seguinte mensagem de erro nos registros 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. Observe o seguinte aviso no status do pod do Cassandra:

Causas possíveis

Esse problema geralmente é observado no seguinte cenário:

  1. O cluster de ambiente de execução da Apigee foi excluído em uma das regiões.
  2. Uma tentativa de reinstalar o cluster de ambiente de execução da Apigee é feita na região com a configuração de host de semente do Cassandra no arquivo overrides.yaml, conforme descrito em Implantação multirregional no GKE e no GKE no local.
  3. Excluir o cluster de ambiente de execução da Apigee não remove as referências no cluster do Cassandra. Assim, as referências desatualizadas dos pods do Cassandra no cluster excluído serão mantidas. Por isso, quando você tenta reinstalar o cluster de ambiente de execução da Apigee na região secundária, os pods do Cassandra reclamam que determinados endereços IP já existem. Isso ocorre porque os endereços IP podem ser atribuídos a partir da mesma sub-rede usada anteriormente.
Causa Descrição
Referências desatualizadas a pods de região secundária excluídos no cluster do Cassandra A exclusão do cluster do ambiente de execução da Apigee na região secundária não remove as referências dos endereços IP dos pods do Cassandra na região secundária.

Causa: referências desatualizadas a pods de região secundária excluídos no cluster do Cassandra

Diagnóstico

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

    Exemplo de resposta:

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

  2. Se a saída contiver as referências desatualizadas aos pods do Cassandra na região secundária, isso indicará que a região secundária foi excluída, mas os endereços IP dos pods do Cassandra na região secundária não serão removidos.

Resolução

Siga as etapas abaixo para remover as referências desatualizadas de pods do Cassandra do cluster excluído:

  1. Faça login no contêiner e conecte-se à interface de linha de comando do Cassandra seguindo as etapas em Criar o contêiner do cliente.
  2. Depois de fazer login no contêiner e se conectar à interface cqlsh do Cassandra, execute a seguinte consulta SQL para listar as definições atuais de keyspace:
    select * from system_schema.keyspaces;
    

    Exemplo de saída mostrando os keyspaces atuais:

    Na saída a seguir, 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 você pode ver, as keyspaces se referem a Primary-DC1 e Secondary-DC2, mesmo que o cluster do ambiente de execução da Apigee tenha sido excluído na região secundária.

    As referências desatualizadas a Secondary-DC2 precisam ser excluídas de cada uma das definições de keyspace.

  3. Antes de excluir as referências desatualizadas nas definições de keyspace, use o seguinte comando para excluir toda a instalação da Apigee híbrida, exceto ASM (Istio) e cert-manager do Secondary-DC2. Para mais informações, consulte Desinstalar o ambiente de execução híbrido.
    apigeectl delete -f YOUR_OVERRIDES_FILE.yaml --all
    
  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_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE kms_tsg1_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_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE rtc_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE quota_tsg1_apigee_hybrid_prod_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. Faça login em um pod do Cassandra de Primary-DC1 e remova as referências a UUIDs de todos os pods de Cassandra de Secondary-DC2. Os UUIDs podem ser obtidos do comando nodetool status, conforme descrito anteriormente em 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 nenhum pod do Cassandra de Secondary-DC2 está presente executando o comando nodetool status novamente.
  8. Instale o cluster de ambiente de execução da Apigee na região secundária (Secondary-DC2) seguindo as etapas em Implantação multirregional no GKE e no GKE On-Prem.

É necessário coletar 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 entre em contato com o Suporte do Google Cloud:

  1. O ID do projeto do Google Cloud
  2. O nome da organização da Apigee híbrida
  3. os arquivos overrides.yaml das regiões primária e secundária, mascarando qualquer informação confidencial
  4. Status do pod do Kubernetes em todos os namespaces das regiões primária 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 primária 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 com relação à região primária.
    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