Falha na replicação de dados do Cassandra

Esta é a documentação da Apigee e da Apigee híbrida.
Confira a documentação da Apigee Edge.

Sintoma

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

Mensagem de erro

Ao usar kubectl para visualizar o status da recriação:

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

Você verá que um ou mais pods do Cassandra mostram um estado de erro, e uma mensagem informando que a recriação falhou. 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 solução de problemas aplicáveis para
Região de origem incorreta Um valor incorreto foi especificado para source.region no arquivo YAML de replicação de dados do Cassandra. Apigee híbrido
Problemas de conectividade de rede Pode haver problemas de conectividade de rede entre os pods do Cassandra em diferentes data centers. Apigee híbrido

Etapas comuns do diagnóstico

  1. Busque o status da replicação de dados:
    kubectl -n apigee get apigeeds \
    -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
  2. Se for exibido um erro com uma mensagem semelhante à especificada em Mensagem de erro, isso indica que você está observando esse problema.

Causa: região de origem incorreta

Se você especificar uma região de origem (datacenter) no arquivo YAML de replicação de dados diferente da datacenter de origem real, a replicação de dados falhará. Siga as etapas em Diagnóstico para analisar esse cenário e realizar as etapas em Resolução para corrigi-lo.

Diagnóstico

  1. Liste todos os pods do Cassandra na região de origem:
    kubectl -n apigee get pods -l app=apigee-cassandra
    
  2. Encontre o valor datacenter real de qualquer um dos pods do Cassandra retornados na etapa 1:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  3. Receba o valor usado para source.region no arquivo de recursos personalizados (YAML) de replicação de dados do Cassandra criado em Implantação multirregional. Se você estiver usando o nome de arquivo de exemplo encontrado na documentação de implantação multirregional, o arquivo precisará ser nomeado como datareplication.yaml.
    cat datareplication.yaml
    

    Resultados de exemplo:

    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 confira se o valor de datacenter corresponde ou não ao valor source.region:

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

    Resultados de exemplo:

    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. O source.region (us-west1) do arquivo datareplication.yaml não corresponde ao valor real datacenter (dc-1) da saída de status nodetool. Siga as etapas em Resolução para corrigir a configuração.

Resolução

Para corrigir a replicação de dados, você precisará excluir o job de replicação e criá-lo com o nome datacenter correto. Siga as etapas abaixo:

  1. Exclua o processo de replicação de dados atual. Se você estiver usando o nome de arquivo de exemplo encontrado na documentação de implantação multirregional, o arquivo precisará ser nomeado como datareplication.yaml.
    kubectl delete -f datareplication.yaml
    
  2. Atualize o nome da região no arquivo 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 status da recriação usando o comando a seguir e confira se o estado de erro relatado anteriormente não aparece mais:
      kubectl -n apigee get apigeeds \
      -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
    
  5. Se o problema persistir, acesse Causa: problemas de conectividade de rede.

Causa: problemas de conectividade de rede

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

Diagnóstico

Execute as etapas a seguir para analisar esse cenário:

  1. Liste todos os pods do Cassandra:
    # list cassandra pods
    kubectl -n=apigee get pods -l app=apigee-cassandra
  2. Execute o comando curl a seguir e telnet para o primeiro pod do Cassandra no segundo data center (dc-2) do primeiro pod do Cassandra no primeiro data center (dc-1), usando a porta. 7001:
    kubectl -n apigee exec -it apigee-cassandra-default-0 bash -- curl -v telnet://DC_2_APIGEE_CASSANDRA_DEFAULT_0_POD_IP:7001
  3. Se o telnet tiver sido bem-sucedido, será exibido 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, será exibido 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 conectividade do pod do Cassandra em um data center para o pod do Cassandra em outro data center indica que deve haver uma restrição de firewall ou algum tipo de problema de conectividade de rede.

Resolução

  1. Se essa implantação da Apigee híbrida estiver no GKE, verifique se alguma regra de firewall está definida para bloquear o tráfego de um data center para outro e analise o problema de conectividade de rede consultando VPC Visão geral das regras de firewall.
  2. Se essa implantação da Apigee híbrida estiver no GKE On-Prem, trabalhe com a equipe de rede relevante e analise o problema de conectividade de rede.

Se o problema persistir, acesse Precisa de informações de diagnóstico.

É necessário coletar 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 entre em contato com o Google Cloud Costumer Care:

  1. O ID do projeto do Google Cloud.
  2. A organização da Apigee híbrida
  3. Os arquivos overrides.yaml da origem e das novas regiões, mascarando qualquer informação confidencial.
  4. O arquivo YAML CassandraDataReplication.
  5. Saída nodetool status do Cassandra:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  6. Saída nodetool describecluster do Cassandra:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password describecluster