Falha na replicação de dados do Cassandra

Está a ver a documentação do Apigee e do Apigee Hybrid.
Veja a documentação do Apigee Edge.

Sintoma

Quando replicar dados durante uma expansão multirregional, o estado CassandraDataReplication pode apresentar um estado de erro e a replicação de dados pode falhar.

Mensagem de erro

Quando usa kubectl para ver o estado da reconstrução:

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

Vê que um ou mais pods do Cassandra mostram um estado de erro e uma mensagem a indicar que a reconstrução falhou. Por exemplo:

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

Causas possíveis

Causa Descrição Instruções de resolução de problemas aplicáveis a
Região de origem incorreta Foi especificado um valor incorreto para o elemento source.region no ficheiro YAML de replicação de dados do Cassandra. Apigee Hybrid
Problemas de conetividade de rede Pode haver problemas de conetividade de rede entre os pods do Cassandra em diferentes centros de dados. Apigee Hybrid

Passos de diagnóstico comuns

  1. Obtenha o estado da replicação de dados:
    kubectl -n apigee get apigeeds \
    -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
  2. Se vir um erro com uma mensagem semelhante à especificada em Mensagem de erro, significa que está a observar este problema.

Causa: região de origem incorreta

Se especificar uma região de origem (datacenter) no ficheiro YAML de replicação de dados que seja diferente da origem real datacenter, a replicação de dados falha. Execute os passos em Diagnóstico para analisar este cenário e execute os passos em Resolução para o corrigir.

Diagnóstico

  1. Liste todos os pods do Cassandra na região de origem:
    kubectl -n apigee get pods -l app=apigee-cassandra
    
  2. Obtenha o valor datacenter real de qualquer um dos pods do Cassandra devolvidos no passo 1:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  3. Obtenha o valor usado para source.region no ficheiro de recursos personalizados (YAML) de replicação de dados do Cassandra que criou em Implementação em várias regiões. Se estiver a usar o nome de ficheiro de exemplo encontrado na documentação de implementação em várias regiões, o ficheiro deve ter o nome datareplication.yaml.
    cat datareplication.yaml
    

    Exemplos de resultados:

    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. Verifique o resultado da saída nodetool status e confirme se o valor datacenter corresponde ou não ao valor source.region:

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

    Exemplos de resultados:

    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. Tenha em atenção que o valor source.region (us-west1) do ficheiro datareplication.yaml não corresponde ao valor datacenter real (dc-1) da saída do estado nodetool. Siga os passos na secção Resolução para corrigir a configuração.

Resolução

Para corrigir a replicação de dados, tem de eliminar a tarefa de replicação de dados e criá-la com o nome datacenter correto. Siga estes passos:

  1. Elimine o processo de replicação de dados atual. Se usar o nome de ficheiro de exemplo encontrado na documentação de Implementação em várias regiões, o ficheiro deve ter o nome datareplication.yaml.
    kubectl delete -f datareplication.yaml
    
  2. Atualize o nome da região no ficheiro YAML para o valor datacenter correto, por exemplo: 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. Aplique a replicação de dados atualizada:
    kubectl apply -f datareplication.yaml
    
  4. Verifique o estado de reconstrução através do seguinte comando e confirme que já não vê o estado de erro comunicado anteriormente:
      kubectl -n apigee get apigeeds \
      -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
    
  5. Se o problema persistir, avance para a secção Causa: problemas de conetividade de rede.

Causa: problemas de conetividade de rede

O erro de replicação de dados também pode ser o resultado de problemas de conetividade entre os nós do Cassandra.

Diagnóstico

Siga estes passos para analisar este cenário:

  1. Apresente todos os pods do Cassandra:
    # list cassandra pods
    kubectl -n=apigee get pods -l app=apigee-cassandra
  2. Execute os seguintes comandos para usar o Telnet no primeiro pod do Cassandra no segundo centro de dados (dc-2) a partir do primeiro pod do Cassandra no primeiro centro de dados (dc-1) através da porta 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. Se o telnet for bem-sucedido, é apresentado um resultado semelhante ao seguinte:
    * 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. Caso contrário, é apresentado um erro semelhante ao seguinte:
    * 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

    A falha de conetividade do pod do Cassandra num centro de dados para o pod do Cassandra noutro centro de dados indica que tem de haver uma restrição de firewall ou algum tipo de problema de conetividade de rede.

Resolução

  1. Se esta implementação híbrida do Apigee estiver no GKE, verifique se existem regras de firewall definidas que bloqueiam o tráfego de um centro de dados para outro e analise o problema de conectividade de rede consultando a vista geral das regras de firewall da VPC.
  2. Se esta implementação híbrida do Apigee estiver no GKE-on-prem, trabalhe com a equipa de rede relevante e analise o problema de conetividade de rede.

Se o problema persistir, aceda a Informações de diagnóstico necessárias.

Tem de recolher informações de diagnóstico

Se o problema persistir mesmo depois de seguir as instruções acima, reúna as seguintes informações de diagnóstico e, em seguida, contacte o apoio ao cliente da Google Cloud:

  1. O ID do projeto do Google Cloud.
  2. A organização do Apigee Hybrid.
  3. Os ficheiros overrides.yaml de ambas as regiões de origem e novas, ocultando todas as informações confidenciais.
  4. O CassandraDataReplication ficheiro YAML.
  5. Saída do Cassandra nodetool status:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  6. Saída do Cassandra nodetool describecluster:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password describecluster