Pods de Cassandra que no empiezan en la región secundaria

Estás consultando la documentación de Apigee y Apigee Hybrid.
Consulta la documentación de Apigee Edge.

Síntoma

Los pods de Cassandra no se inician en una de las regiones de una configuración híbrida de Apigee multirregión. Cuando se aplica el archivo overrides.yaml, los pods de Cassandra no se inician correctamente.

Mensajes de error

  1. Verás el siguiente mensaje de error en los registros del pod de 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. Puede que veas la siguiente advertencia en el estado del pod de Cassandra:

Posibles motivos

Este problema suele producirse en los siguientes casos:

  1. El clúster de tiempo de ejecución de Apigee se elimina en una de las regiones.
  2. Se intenta reinstalar el clúster de tiempo de ejecución de Apigee en la región con la configuración del host de semillas de Cassandra en el archivo overrides.yaml, tal como se describe en Despliegue multirregional en GKE y GKE On-Prem.
  3. Si eliminas el clúster de tiempo de ejecución de Apigee, no se eliminarán las referencias del clúster de Cassandra. Por lo tanto, se conservarán las referencias obsoletas de los pods de Cassandra del clúster eliminado. Por este motivo, cuando intentes reinstalar el clúster de tiempo de ejecución de Apigee en la región secundaria, los pods de Cassandra indicarán que ya existen determinadas direcciones IP. Esto se debe a que las direcciones IP se pueden asignar desde la misma subred que se usó anteriormente.
Causa Descripción
Referencias obsoletas a pods de la región secundaria eliminados en el clúster de Cassandra Si eliminas el clúster de tiempo de ejecución de Apigee en la región secundaria, no se eliminarán las referencias a las direcciones IP de los pods de Cassandra en la región secundaria.

Causa: referencias obsoletas a pods de la región secundaria eliminados en el clúster de Cassandra

Diagnóstico

  1. El mensaje de error de los registros del pod de Cassandra A node with address 10.52.18.40 already exists indica que hay una referencia obsoleta a uno de los pods de Cassandra de la región secundaria con la dirección IP 10.52.18.40. Para validar esto, ejecuta el comando nodetool status en la región principal.

    Salida de ejemplo:

    En el ejemplo anterior se muestra que la dirección IP 10.52.18.40 asociada a los pods de Cassandra de la región secundaria sigue apareciendo en el resultado.

  2. Si el resultado contiene las referencias obsoletas a los pods de Cassandra en la región secundaria, significa que la región secundaria se ha eliminado, pero las direcciones IP de los pods de Cassandra en la región secundaria no se han quitado.

Resolución

Sigue estos pasos para eliminar las referencias obsoletas de los pods de Cassandra del clúster eliminado:

  1. Inicia sesión en el contenedor y conéctate a la interfaz de línea de comandos de Cassandra siguiendo los pasos que se indican en Crear el contenedor de cliente.
  2. Después de iniciar sesión en el contenedor y conectarte a la interfaz de Cassandra cqlsh, ejecuta la siguiente consulta de SQL para mostrar las definiciones de keyspace actuales:
    select * from system_schema.keyspaces;

    Ejemplo de salida que muestra los espacios de claves actuales:

    En el siguiente resultado, Primary-DC1 hace referencia a la región principal y Secondary-DC2 a la secundaria.

    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 puede ver, los keyspaces hacen referencia tanto a Primary-DC1 como a Secondary-DC2, aunque el clúster de tiempo de ejecución de Apigee se haya eliminado en la región secundaria.

    Las referencias obsoletas a Secondary-DC2 se deben eliminar de cada una de las definiciones de keyspace.

  3. Antes de eliminar las referencias obsoletas en las definiciones de keyspace, usa el siguiente comando para eliminar toda la instalación de Apigee hybrid excepto ASM (Istio) y cert-manager de Secondary-DC2. Para obtener más información, consulta el artículo sobre cómo desinstalar el tiempo de ejecución híbrido.
    helm uninstall -n APIGEE_NAMESPACE ENV_GROUP_RELEASE_NAME ENV_RELEASE_NAME $ORG_NAME ingress-manager telemetry redis datastore

    Además, desinstala apigee-operator:

    helm uninstall -n APIGEE_NAMESPACE operator
  4. Elimina las referencias obsoletas a Secondary-DC2 de cada uno de los keyspaces modificando la definición 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. Comprueba que se han eliminado todas las referencias obsoletas a la región Secondary-DC2 de todos los keyspaces. Para ello, ejecuta el siguiente comando:
    select * from system_schema.keyspaces;
  6. Inicia sesión en un pod de Cassandra de Primary-DC1 y elimina las referencias a los UUIDs de todos los pods de Cassandra de Secondary-DC2. Los UUIDs se pueden obtener del comando nodetool status, tal como se ha descrito anteriormente en 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. Comprueba que no haya pods de Cassandra de Secondary-DC2 ejecutando el comando nodetool status de nuevo.
  8. Instala el clúster de tiempo de ejecución de Apigee en la región secundaria (Secondary-DC2) siguiendo los pasos que se indican en Despliegues multirregionales en GKE y GKE On-Prem.

Debe recoger información de diagnóstico

Si el problema persiste incluso después de seguir las instrucciones anteriores, reúne la siguiente información de diagnóstico y ponte en contacto con el equipo de Asistencia de Google Cloud:

  1. El ID del proyecto de Google Cloud
  2. Nombre de la organización de Apigee Hybrid
  3. Los archivos overrides.yaml de las regiones principal y secundaria, en los que se oculta la información sensible
  4. Estado de los pods de Kubernetes en todos los espacios de nombres de las regiones principal y secundaria:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
    
  5. Un volcado de cluster-info de Kubernetes de las regiones principal y secundaria:
    # 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. El resultado de los comandos nodetool que se indican a continuación de la región 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
          

Referencias