Les pods Cassandra ne démarrent pas dans la région secondaire

Vous consultez la documentation d'Apigee et d'Apigee hybrid.
Consultez la documentation d'Apigee Edge.

Symptôme

Les pods Cassandra ne démarrent pas dans l'une des régions d'une configuration Apigee hybrid multirégionale. Lors de l'application du fichier overrides.yaml, les pods Cassandra ne démarrent pas correctement.

Messages d'erreur

  1. Le message d'erreur suivant s'affiche dans les journaux du pod 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. L'avertissement suivant peut s'afficher dans l'état du pod Cassandra :

Causes possibles

Ce problème est généralement observé dans le scénario suivant :

  1. Le cluster d'exécution Apigee est supprimé dans l'une des régions.
  2. Une tentative de réinstallation du cluster d'exécution Apigee est effectuée dans la région avec la configuration de l'hôte source Cassandra dans le fichier overrides.yaml, comme décrit dans la section Déploiement multirégional sur GKE et GKE On-Prem
  3. La suppression du cluster d'exécution Apigee ne supprime pas les références dans le cluster Cassandra. Ainsi, les références obsolètes des pods Cassandra du cluster supprimé seront conservées. Par conséquent, lorsque vous essayez de réinstaller le cluster d'exécution Apigee dans la région secondaire, les pods Cassandra indiquent que certaines adresses IP existent déjà. En effet, les adresses IP peuvent être attribuées à partir du même sous-réseau que celui utilisé précédemment.
Cause Description
Références obsolètes aux pods de régions secondaires supprimés dans le cluster Cassandra La suppression du cluster d'exécution Apigee dans la région secondaire n'entraîne pas la suppression des références aux adresses IP des pods Cassandra dans la région secondaire.

Cause : références obsolètes aux pods de régions secondaires supprimés dans le cluster Cassandra

Diagnostic

  1. Le message d'erreur dans les journaux du pod Cassandra A node with address 10.52.18.40 already exists indique qu'il existe une référence obsolète à l'un des pods Cassandra des régions secondaires avec l'adresse IP 10.52.18.40. Pour le valider, exécutez la commande nodetool status dans la région principale.

    Exemple de résultat :

    L'exemple ci-dessus montre que l'adresse IP 10.52.18.40 associée aux pods Cassandra de la région secondaire est toujours répertoriée dans le résultat.

  2. Si le résultat contient des références obsolètes aux pods Cassandra dans la région secondaire, cela signifie que la région secondaire a été supprimée, mais que les adresses IP des pods Cassandra de la région secondaire ne sont pas supprimées.

Solution

Procédez comme suit pour supprimer les références obsolètes des pods Cassandra du cluster supprimé :

  1. Connectez-vous au conteneur et connectez-vous à l'interface de ligne de commande Cassandra en suivant les étapes décrites dans la section Créer le conteneur client.
  2. Une fois que vous êtes connecté au conteneur et connecté à l'interface Cassandra cqlsh, exécutez la requête SQL suivante pour répertorier les définitions keyspace actuelles :
    select * from system_schema.keyspaces;

    Exemple de résultat montrant les espaces de clés actuels :

    Dans le résultat suivant, Primary-DC1 fait référence à la région principale et Secondary-DC2 à la région secondaire.

    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)

    Comme vous pouvez le constater, keyspaces fait référence à la fois à Primary-DC1 et à Secondary-DC2, même si le cluster d'exécution Apigee a été supprimé dans la région secondaire.

    Les références obsolètes à Secondary-DC2 doivent être supprimées de chacune des définitions keyspace.

  3. Avant de supprimer les références obsolètes dans les définitions keyspace, utilisez la commande suivante pour supprimer l'intégralité de l'installation Apigee hybrid, à l'exception d'ASM (Istio) et de cert-manager à partir de Secondary-DC2. Pour en savoir plus, consultez la section Désinstaller l'environnement d'exécution hybride.
    apigeectl delete -f YOUR_OVERRIDES_FILE.yaml --all
  4. Supprimez les références obsolètes à Secondary-DC2 de chacun des keyspaces en modifiant la définition 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. Vérifiez que les références obsolètes à la région Secondary-DC2 ont été supprimées de tous les keyspaces en exécutant la commande suivante :
    select * from system_schema.keyspaces;
  6. Connectez-vous à un pod Cassandra de Primary-DC1 et supprimez les références aux UUID de tous les pods Cassandra Secondary-DC2. Les UUID peuvent être obtenus à partir de la commande nodetool status comme décrit précédemment dans la section Diagnostic.
    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. Vérifiez qu'aucun pod Cassandra de Secondary-DC2 n'est présent en exécutant à nouveau la commande nodetool status.
  8. Installez le cluster d'exécution Apigee dans la région secondaire (Secondary-DC2) en suivant la procédure décrite dans la section Déploiement multirégional sur GKE et GKE On-Prem.

Vous devez collecter des informations de diagnostic

Si le problème persiste, même après avoir suivi les instructions ci-dessus, rassemblez les informations de diagnostic suivantes, puis contactez Google Cloud Customer Care :

  1. L'ID de projet Google Cloud
  2. Nom de l'organisation Apigee Hybrid
  3. Fichiers overrides.yaml des régions principale et secondaire, masquant les informations sensibles
  4. État du pod Kubernetes dans tous les espaces de noms des régions principale et secondaire :
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
  5. Un vidage Kubernetes cluster-info provenant des régions principale et secondaire :
    # 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. Le résultat des commandes nodetool ci-dessous, provenant de la région principale.
    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
          

Références