Pod di Cassandra non avviati nell'area geografica secondaria

Stai visualizzando la documentazione di Apigee e Apigee hybrid.
Visualizza la documentazione di Apigee Edge.

Sintomo

I pod Cassandra non vengono avviati in una delle regioni in una configurazione ibrida Apigee multiregionale. Quando applichi il file overrides.yaml, i pod Cassandra non vengono avviati correttamente.

Messaggi di errore

  1. Nei log del pod Cassandra vedrai il seguente messaggio di errore:
    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. Potresti notare il seguente avviso nello stato del pod Cassandra:

Cause possibili

Questo problema si verifica in genere nel seguente scenario:

  1. Il cluster di runtime Apigee viene eliminato in una delle regioni.
  2. Viene effettuato un tentativo di reinstallazione del cluster runtime Apigee nella regione con la configurazione dell'host seed Cassandra nel file overrides.yaml, come descritto in Deployment multiregionale su GKE e GKE On-Prem.
  3. L'eliminazione del cluster di runtime Apigee non rimuove i riferimenti nel cluster Cassandra. Pertanto, i riferimenti obsoleti dei pod Cassandra nel cluster eliminato verranno conservati. Per questo motivo, quando provi a reinstallare il cluster runtime Apigee nella regione secondaria, i pod Cassandra segnalano che alcuni indirizzi IP esistono già. Questo perché gli indirizzi IP potrebbero essere assegnati dalla stessa subnet utilizzata in precedenza.
Causa Descrizione
Riferimenti obsoleti ai pod della regione secondaria eliminati nel cluster Cassandra L'eliminazione del cluster di runtime Apigee nella regione secondaria non rimuove i riferimenti agli indirizzi IP dei pod Cassandra nella regione secondaria.

Causa: riferimenti obsoleti ai pod della regione secondaria eliminati nel cluster Cassandra

Diagnosi

  1. Il messaggio di errore nei log del pod Cassandra A node with address 10.52.18.40 already exists indica che esiste un riferimento obsoleto a uno dei pod Cassandra della regione secondaria con l'indirizzo IP 10.52.18.40. Verifica questa operazione eseguendo il comando nodetool status nella regione principale.

    Esempio di output:

    L'esempio precedente mostra che l'indirizzo IP 10.52.18.40 associato ai pod Cassandra della regione secondaria è ancora elencato nell'output.

  2. Se l'output contiene riferimenti obsoleti ai pod Cassandra nella regione secondaria, significa che la regione secondaria è stata eliminata, ma gli indirizzi IP dei pod Cassandra nella regione secondaria non vengono rimossi.

Risoluzione

Per rimuovere i riferimenti obsoleti dei pod Cassandra del cluster eliminato, segui questi passaggi:

  1. Accedi al container e connettiti all'interfaccia a riga di comando di Cassandra seguendo i passaggi descritti in Creare il container client.
  2. Dopo aver eseguito l'accesso al container e la connessione all'interfaccia Cassandra cqlsh, esegui la seguente query SQL per elencare le definizioni keyspace correnti:
    select * from system_schema.keyspaces;

    Output di esempio che mostra gli spazi chiave attuali:

    Nell'output seguente, Primary-DC1 si riferisce alla regione principale e Secondary-DC2 si riferisce alla regione secondaria.

    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)

    Come puoi vedere, i keyspaces si riferiscono sia a Primary-DC1 che a Secondary-DC2, anche se il cluster di runtime Apigee è stato eliminato nella regione secondaria.

    I riferimenti obsoleti a Secondary-DC2 devono essere eliminati da ciascuna delle definizioni di keyspace.

  3. Prima di eliminare i riferimenti obsoleti nelle definizioni di keyspace, utilizza il seguente comando per eliminare l'intera installazione di Apigee Hybrid tranne ASM (Istio) e cert-manager da Secondary-DC2. Per ulteriori informazioni, consulta Disinstallare il runtime ibrido.
    helm uninstall -n APIGEE_NAMESPACE ENV_GROUP_RELEASE_NAME ENV_RELEASE_NAME $ORG_NAME ingress-manager telemetry redis datastore

    Inoltre, disinstalla apigee-operator:

    helm uninstall -n APIGEE_NAMESPACE operator
  4. Rimuovi i riferimenti obsoleti a Secondary-DC2 da ciascuno dei keyspaces modificando la definizione di 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. Verifica che i riferimenti obsoleti alla regione Secondary-DC2 siano stati rimossi da tutti i keyspaces eseguendo questo comando:
    select * from system_schema.keyspaces;
  6. Accedi a un pod Cassandra di Primary-DC1 e rimuovi i riferimenti agli UUID di tutti i pod Cassandra di Secondary-DC2. Gli UUID possono essere ottenuti dal comando nodetool status come descritto in precedenza nella sezione Diagnosi.
    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. Verifica che non siano presenti pod Cassandra di Secondary-DC2 eseguendo di nuovo il comando nodetool status.
  8. Installa il cluster di runtime Apigee nella regione secondaria (Secondary-DC2) seguendo i passaggi descritti in Deployment in più regioni su GKE e GKE On-Prem.

Deve raccogliere informazioni diagnostiche

Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli le seguenti informazioni diagnostiche e poi contatta l'assistenza clienti Google Cloud:

  1. L'ID progetto Google Cloud
  2. Il nome dell'organizzazione Apigee hybrid
  3. I file overrides.yaml delle regioni primaria e secondaria, mascherando le informazioni sensibili
  4. Stato del pod Kubernetes in tutti gli spazi dei nomi delle regioni primaria e secondaria:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
    
  5. Un dump di Kubernetes cluster-info dalle regioni principale e secondaria:
    # 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. L'output dei comandi nodetool riportati di seguito dalla regione primaria.
    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
          

Riferimenti