Cassandra 데이터 복제 실패

ApigeeApigee Hybrid 문서입니다.
Apigee Edge 문서 보기

증상

멀티 리전 확장 중에 데이터를 복제할 때 CassandraDataReplication 상태에 오류 상태가 표시되고 데이터 복제가 실패할 수 있습니다.

오류 메시지

kubectl을 사용하여 재빌드 상태를 확인하는 경우:

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

하나 이상의 Cassandra Pod에 오류 상태와 재빌드가 실패했음을 나타내는 메시지가 표시됩니다. 예를 들면 다음과 같습니다.

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

가능한 원인

원인 설명 다음에 관한 문제 해결 안내
잘못된 소스 리전 Cassandra 데이터 복제 YAML 파일 내의 source.region에 잘못된 값이 지정되었습니다. Apigee 하이브리드
네트워크 연결 문제 여러 데이터 센터에 있는 Cassandra Pod 사이에 네트워크 연결 문제가 있을 수 있습니다. Apigee 하이브리드

일반적인 진단 단계

  1. 데이터 복제 상태를 가져옵니다.
    kubectl -n apigee get apigeeds \
    -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
  2. 오류 메시지에 지정된 메시지와 유사한 오류가 표시되면 이 문제가 발생했음을 나타냅니다.

원인: 잘못된 소스 리전

데이터 복제 YAML 파일에서 실제 소스 datacenter와 다른 소스 리전(datacenter)을 지정하면 데이터 복제가 실패합니다. 진단의 단계를 수행하여 이 시나리오를 분석하고 해결의 단계를 수행하여 수정합니다.

진단

  1. 소스 리전의 모든 Cassandra Pod를 나열합니다.
    kubectl -n apigee get pods -l app=apigee-cassandra
    
  2. 1단계에서 반환된 Cassandra Pod 중 하나에서 실제 datacenter 값을 가져옵니다.
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  3. 멀티 리전 배포에서 만든 Cassandra 데이터 복제 커스텀 리소스(YAML) 파일에서 source.region에 사용된 값을 가져옵니다. 멀티 리전 배포 문서에 있는 예시 파일 이름을 사용하는 경우 파일 이름은 datareplication.yaml이어야 합니다.
    cat datareplication.yaml
    

    결과 예:

    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. nodetool status 출력 결과를 확인하고 datacenter 값이 source.region 값과 일치하는지 확인합니다.

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

    결과 예:

    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. datareplication.yaml 파일의 source.region(us-west1)은 nodetool 상태 출력의 실제 datacenter 값(dc-1)과 일치하지 않습니다. 해결의 단계를 따라 구성을 수정합니다.

해결 방법

데이터 복제를 수정하려면 데이터 복제 작업을 삭제하고 올바른 datacenter 이름으로 만들어야 합니다. 다음 단계를 수행합니다.

  1. 현재 데이터 복제 프로세스를 삭제합니다. 멀티 리전 배포 문서에 있는 예시 파일 이름을 사용할 경우 파일 이름은 datareplication.yaml이어야 합니다.
    kubectl delete -f datareplication.yaml
    
  2. YAML 파일의 리전 이름을 올바른 datacenter 값으로 업데이트합니다(예: 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. 업데이트된 데이터 복제를 적용합니다.
    kubectl apply -f datareplication.yaml
    
  4. 다음 명령어를 사용하여 재빌드 상태를 확인하고 이전에 보고된 오류 상태가 더 이상 표시되지 않는지 확인합니다.
      kubectl -n apigee get apigeeds \
      -o jsonpath="{.items[].status.cassandraDataReplication}{'\n'}"
    
  5. 문제가 계속되면 원인: 네트워크 연결 문제를 참조하세요.

원인: 네트워크 연결 문제

데이터 복제 오류는 Cassandra 노드 간 연결 문제로 인해 발생한 것일 수도 있습니다.

진단

이 시나리오를 분석하려면 다음 단계를 수행하세요.

  1. 모든 Cassandra Pod를 나열합니다.
    # list cassandra pods
    kubectl -n=apigee get pods -l app=apigee-cassandra
  2. 다음 curl 명령어를 실행하고 포트 7001을 사용하여 첫 번째 데이터 센터(dc-1)에 있는 첫 번째 Cassandra Pod에서 두 번째 데이터 센터(dc-2)에 있는 첫 번째 Cassandra Pod에 telnet으로 연결합니다.
    kubectl -n apigee exec -it apigee-cassandra-default-0 bash -- curl -v telnet://DC_2_APIGEE_CASSANDRA_DEFAULT_0_POD_IP:7001
  3. telnet이 성공하면 다음과 비슷한 출력이 표시됩니다.
    * 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. 그렇지 않으면 다음과 비슷한 오류가 표시됩니다.
    * 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

    한 데이터 센터에 있는 Cassandra Pod에서 다른 데이터 센터에 있는 Cassandra Pod로의 연결 오류가 발생하면 방화벽 제한이 있거나 다른 종류의 네트워크 연결 오류가 있는 것입니다.

해결 방법

  1. 이 Apigee 하이브리드 배포가 GKE에 있는 경우 VPC 방화벽 규칙 개요를 참조하여 한 데이터 센터에서 다른 데이터 센터로의 트래픽을 차단하도록 방화벽 규칙이 설정되었는지 확인하고 네트워크 연결 문제를 분석합니다.
  2. 이 Apigee 하이브리드 배포가 GKE-On-Prem에 있는 경우 관련 네트워킹팀과 협력하여 네트워크 연결 문제를 분석합니다.

문제가 계속되면 진단 정보를 수집해야 함으로 이동합니다.

진단 정보 수집 필요

위 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 후 Google Cloud Customer Care에 문의하세요.

  1. Google Cloud 프로젝트 ID
  2. Apigee 하이브리드 조직
  3. 민감한 정보를 마스킹하는 소스 및 새 리전의 overrides.yaml 파일
  4. CassandraDataReplication YAML 파일입니다.
  5. Cassandra nodetool status 출력:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password status
    
  6. Cassandra nodetool describecluster 출력:
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- \
    nodetool -u JMX_user -pw JMX_password describecluster