Échec de la réplication des données Cassandra

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

Symptôme

Lors de la réplication de données lors d'une extension multirégionale, l'état CassandraDataReplication peut afficher un état d'erreur et la réplication des données peut échouer.

Message d'erreur

Lorsque vous utilisez kubectl pour afficher l'état de la recompilation :

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

Vous constatez qu'un ou plusieurs pods Cassandra affichent un état d'erreur et un message indiquant que la recompilation a échoué. Exemple :

{
  "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
    },
    …
  }
}

Causes possibles

Cause Description Instructions de dépannage applicables
Région source incorrecte Une valeur incorrecte a été spécifiée pour source.region dans le fichier YAML de réplication de données Cassandra. Apigee hybrid
Problèmes de connectivité réseau Des problèmes de connectivité réseau peuvent se produire entre les pods Cassandra de différents centres de données. Apigee hybrid

Étapes de diagnostic courantes

  1. Récupérez l'état de la réplication des données :
    kubectl -n apigee get apigeeds \
    -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
  2. Si une erreur s'affiche avec un message semblable à celui spécifié dans Message d'erreur, cela signifie que vous observez ce problème.

Cause : région source incorrecte

Si vous spécifiez une région source (datacenter) dans votre fichier YAML de réplication des données qui est différente de la source réelle datacenter, la réplication de données échoue. Suivez les étapes décrites dans la section Diagnostic pour analyser ce scénario et celles décrites dans la section Résolution pour le corriger.

Diagnostic

  1. Répertoriez tous les pods Cassandra dans la région source :
    kubectl -n apigee get pods -l app=apigee-cassandra
    
  2. Récupérez la valeur datacenter réelle à partir de l'un des pods Cassandra renvoyés à l'étape 1 :
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  3. Récupérez la valeur utilisée pour source.region dans le fichier de ressource personnalisée pour la réplication de données Cassandra (YAML) que vous avez créé dans le déploiement multirégional. Si vous utilisez le nom de l'exemple de fichier trouvé dans la documentation de déploiement multirégional, le fichier doit être nommé datareplication.yaml.
    cat datareplication.yaml
    

    Exemple de résultats :

    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. Vérifiez le résultat de la sortie nodetool status et vérifiez si la valeur datacenter correspond ou non à la valeur source.region :

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

    Exemple de résultats :

    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. Notez que la valeur source.region (us-west1) du fichier datareplication.yaml ne correspond pas à la valeur réelle datacenter (dc-1) de la sortie d'état nodetool. Suivez les étapes décrites dans la section Résolution pour corriger la configuration.

Solution

Pour corriger la réplication de données, vous devez supprimer la tâche de réplication de données et la créer avec le nom datacenter approprié. Procédez comme suit :

  1. Supprimez le processus de réplication de données actuel. Si vous utilisez le nom de l'exemple de fichier trouvé dans la documentation Déploiement multirégional, le fichier doit être nommé datareplication.yaml.
    kubectl delete -f datareplication.yaml
    
  2. Mettez à jour le nom de la région dans le fichier YAML avec la valeur datacenter appropriée, par exemple 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. Appliquez la mise à jour de la réplication de données :
    kubectl apply -f datareplication.yaml
    
  4. Vérifiez l'état de la recompilation à l'aide de la commande suivante, et vérifiez que l'état d'erreur précédemment signalé n'apparaît plus :
      kubectl -n apigee get apigeeds \
      -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
    
  5. Si le problème persiste, passez à la section Cause : problèmes de connectivité réseau.

Cause : problèmes de connectivité réseau

L'erreur de réplication des données peut également résulter de problèmes de connectivité entre les nœuds Cassandra.

Diagnostic

Pour analyser ce scénario, procédez comme suit :

  1. Répertoriez tous les pods Cassandra :
    # list cassandra pods
    kubectl -n=apigee get pods -l app=apigee-cassandra
  2. Exécutez la commande curl et connectez-vous par telnet vers le premier pod Cassandra du deuxième centre de données (dc-2) depuis le premier pod Cassandra du premier centre de données (dc-1) à l'aide du port. 7001 :
    kubectl -n apigee exec -it apigee-cassandra-default-0 bash -- curl -v telnet://DC_2_APIGEE_CASSANDRA_DEFAULT_0_POD_IP:7001
  3. Si le protocole telnet a réussi, un résultat semblable au suivant s'affiche :
    * 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. Sinon, une erreur semblable à la suivante s'affiche :
    * 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

    L'échec de la connectivité du pod Cassandra d'un centre de données au pod Cassandra d'un autre centre de données indique qu'il existe une restriction de pare-feu ou un problème de connectivité réseau.

Solution

  1. Si ce déploiement Apigee hybrid est sur GKE, vérifiez si des règles de pare-feu sont définies pour bloquer le trafic d'un centre de données à un autre, et analysez le problème de connectivité réseau en vous reportant à Présentation des règles de pare-feu VPC
  2. Si ce déploiement Apigee hybrid est basé sur GKE On-Prem, collaborez avec l'équipe réseau appropriée et analysez le problème de connectivité réseau.

Si le problème persiste, consultez la page Vous devez collecter des informations de diagnostic.

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. ID de projet Google Cloud
  2. Organisation hybride Apigee
  3. Les fichiers overrides.yaml des régions sources et nouvelles, qui masquent les informations sensibles.
  4. Le fichier YAML CassandraDataReplication.
  5. Sortie de Cassandra nodetool status :
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  6. Sortie de Cassandra nodetool describecluster :
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password describecluster