Error de replicación de datos de Cassandra

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

Síntoma

Al replicar datos durante una expansión multirregional, el estado CassandraDataReplication puede mostrar un error y la replicación de datos puede fallar.

Mensaje de error

Cuando usas kubectl para ver el estado de la recompilación:

  kubectl -n apigee get apigeeds \
  -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"

Ves que uno o varios pods de Cassandra muestran un estado de error y un mensaje que indica que la recompilación ha fallado. Por ejemplo:

{
  "rebuildDetails": {
    "apigee-cassandra-default-0": {
      "message": "failed to rebuild from us-west1: java.lang.IllegalStateException : Unable to find sufficient sources for streaming range (-8567285182390470134,-8567154549835592965] in keyspace system_distributed",
      "state": "error",
      "updated": 1641581899
    },
    …
  }
}

Posibles motivos

Causa Descripción Instrucciones de solución de problemas aplicables a
Región de origen incorrecta Se ha especificado un valor incorrecto para source.region en el archivo YAML de replicación de datos de Cassandra. Apigee Hybrid
Problemas de conectividad de red Puede que haya problemas de conectividad de red entre los pods de Cassandra de diferentes centros de datos. Apigee Hybrid

Pasos de diagnóstico habituales

  1. Obtén el estado de la réplica de datos:
    kubectl -n apigee get apigeeds \
    -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
  2. Si ves un error con un mensaje similar al especificado en Mensaje de error, significa que estás experimentando este problema.

Causa: región de origen incorrecta

Si especifica una región de origen (datacenter) en su archivo YAML de replicación de datos que sea diferente del origen real datacenter, la replicación de datos fallará. Sigue los pasos que se indican en Diagnóstico para analizar esta situación y los que se indican en Resolución para corregirla.

Diagnóstico

  1. Lista todos los pods de Cassandra de la región de origen:
    kubectl -n apigee get pods -l app=apigee-cassandra
    
  2. Obtenga el valor datacenter real de cualquiera de los pods de Cassandra devueltos en el paso 1:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  3. Obtén el valor usado para source.region en el archivo de recursos personalizados (YAML) de replicación de datos de Cassandra que creaste en Despliegue multirregión. Si usas el nombre de archivo de ejemplo que se indica en la documentación sobre la implementación multirregión, el archivo debe llamarse datareplication.yaml.
    cat datareplication.yaml
    

    Resultados de ejemplo:

    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: CassandraDataReplication
    metadata:
      name: region-expansion
      namespace: apigee
    spec:
      organizationRef: apigee-hybrid-example-org
      force: false
      source:
        region: "us-west1"
  4. Comprueba el resultado de la salida nodetool status y verifica si el valor datacenter coincide con el valor source.region:

    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u jmxuser -pw iloveapis123 status
    

    Resultados de ejemplo:

    Datacenter: dc-1
    ================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address      Load       Tokens       Owns (effective)  Host ID                               Rack
    UN  10.104.13.2  491.84 KiB  256          100.0%            7254711c-fe0a-4b34-b50f-861109f97936  ra-1
    UN  10.104.11.3  527.36 KiB  256          100.0%            5ec389f0-fd67-4de6-9f21-172d5899ff78  ra-1
    UN  10.104.12.7  838.46 KiB  256          100.0%            7a88be82-1f81-4117-86e3-2cda434c0878  ra-1
  5. Tenga en cuenta que el valor source.region (us-west1) del archivo datareplication.yaml no coincide con el valor datacenter real (dc-1) de la salida de estado nodetool. Sigue los pasos que se indican en la sección Resolución para corregir la configuración.

Resolución

Para corregir la replicación de datos, debe eliminar la tarea de replicación de datos y crearla con el nombre datacenter correcto. Sigue estos pasos:

  1. Elimina el proceso de replicación de datos actual. Si usas el nombre de archivo de ejemplo que se encuentra en la documentación de Implementación multirregión, el archivo debe llamarse datareplication.yaml.
    kubectl delete -f datareplication.yaml
    
  2. Actualiza el nombre de la región en el archivo YAML con el valor datacenter correcto. Por ejemplo: dc-1:
    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: CassandraDataReplication
    metadata:
      name: region-expansion
      namespace: apigee
    spec:
      organizationRef: apigee-hybrid-example-org
      force: false
      source:
        region: "dc-1"
  3. Aplica la replicación de datos actualizada:
    kubectl apply -f datareplication.yaml
    
  4. Comprueba el estado de la recompilación con el siguiente comando y verifica que ya no se muestra el estado de error que se había notificado anteriormente:
      kubectl -n apigee get apigeeds \
      -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
    
  5. Si el problema persiste, ve a la sección Causa: problemas de conectividad de red.

Causa: problemas de conectividad de red

El error de replicación de datos también puede deberse a problemas de conectividad entre los nodos de Cassandra.

Diagnóstico

Sigue estos pasos para analizar esta situación:

  1. Lista todos los pods de Cassandra:
    # list cassandra pods
    kubectl -n=apigee get pods -l app=apigee-cassandra
  2. Ejecuta los siguientes comandos para conectarte por telnet al primer pod de Cassandra del segundo centro de datos (dc-2) desde el primer pod de Cassandra del primer centro de datos (dc-1) mediante el puerto 7001:
    k debug -it apigee-cassandra-default-0 -n apigee --image=nginx -- sh curl -v telnet://DC_2_APIGEE_CASSANDRA_DEFAULT_0_POD_IP:7001
  3. Si la conexión Telnet se ha realizado correctamente, se mostrará un resultado similar al siguiente:
    * Rebuilt URL to: telnet://10.0.4.10:7001/
    *   Trying 10.0.4.10...
    * TCP_NODELAY set
    * Connected to 10.0.4.10 (10.0.4.10) port 7001 (#0)
  4. De lo contrario, se mostrará un error similar al siguiente:
    * Rebuilt URL to: telnet://10.0.4.10:7001/
    *   Trying 10.0.4.10...
    * TCP_NODELAY set
    * connect to 10.0.4.10 port 7001 failed: Connection refused
    * Failed to connect to 10.0.4.10 port 7001: Connection refused
    * Closing connection 0
    curl: (7) Failed to connect to 10.0.4.10 port 7001: Connection refused

    Si se produce un fallo de conectividad desde el pod de Cassandra de un centro de datos al pod de Cassandra de otro centro de datos, significa que debe haber una restricción de firewall o algún tipo de problema de conectividad de red.

Resolución

  1. Si esta implementación híbrida de Apigee está en GKE, comprueba si hay reglas de cortafuegos definidas que bloqueen el tráfico de un centro de datos a otro y analiza el problema de conectividad de red consultando la descripción general de las reglas de cortafuegos de VPC.
  2. Si esta implementación híbrida de Apigee se encuentra en GKE On-Prem, colabora con el equipo de redes correspondiente y analiza el problema de conectividad de red.

Si el problema persiste, ve a Información de diagnóstico que debes recoger.

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. La organización de Apigee Hybrid.
  3. Los archivos overrides.yaml de las regiones de origen y de destino, ocultando la información sensible.
  4. El archivo YAML CassandraDataReplication.
  5. Salida de Cassandra nodetool status:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  6. Salida de Cassandra nodetool describecluster:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password describecluster