보조 리전에서 시작되지 않는 Cassandra 포드

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

증상

Cassandra 포드가 멀티 리전 Apigee Hybrid 설정의 리전 중 하나에서 시작할 때 오류가 발생합니다. overrides.yaml 파일을 적용하면 Cassandra 포드가 성공적으로 시작되지 않습니다.

오류 메시지

  1. Cassandra 포드 로그에서 다음과 같은 오류 메시지가 표시됩니다.
    Exception (java.lang.RuntimeException) encountered during startup:
    A node with address 10.52.18.40 already exists, cancelling join.
    use cassandra.replace_addrees if you want to replace this node.
  2. Cassandra 포드 상태에서 다음 경고가 표시될 수 있습니다.

가능한 원인

이 문제는 일반적으로 다음과 같은 경우에 발생합니다.

  1. Apigee 런타임 클러스터가 리전 중 하나에서 삭제됩니다.
  2. Apigee 런타임 클러스터를 다시 설치하려고 시도하면 GKE 및 GKE On-Prem의 멀티 리전 배포에 설명된 대로 overrides.yaml 파일에서 Cassandra의 시드 호스트 구성이 있는 리전에 생성됩니다.
  3. Apigee 런타임 클러스터를 삭제해도 Cassandra 클러스터의 참조는 삭제되지 않습니다. 따라서 삭제된 클러스터의 Cassandra 포드에 대한 비활성 참조는 보존됩니다. 이러한 이유로 보조 리전에 Apigee 런타임 클러스터를 다시 설치하려고 하면 Cassandra 포드에 특정 IP 주소가 이미 있다는 메시지가 표시됩니다. IP 주소가 이전에 사용된 것과 동일한 서브넷에서 할당될 수 있기 때문입니다.
원인 설명
Cassandra 클러스터에서 삭제된 보조 리전 포드에 대한 비활성 참조 보조 리전에서 Apigee 런타임 클러스터를 삭제해도 보조 리전의 Cassandra 포드 IP 주소에 대한 참조는 삭제되지 않습니다.

원인: Cassandra 클러스터에서 삭제된 보조 리전 포드에 대한 비활성 참조

진단

  1. Cassandra 포드 로그 A node with address 10.52.18.40 already exists의 오류 메시지는 IP 주소 10.52.18.40이 있는 보조 리전 Cassandra 포드 중 하나에 비활성 참조가 있음을 나타냅니다. 기본 리전에서 nodetool status 명령어를 실행하여 이를 검증합니다.

    샘플 출력:

    위의 예시는 보조 리전의 Cassandra 포드와 연결된 IP 주소 10.52.18.40이 여전히 출력에 나열되어 있음을 보여줍니다.

  2. 출력에 보조 리전의 Cassandra 포드에 대한 비활성 참조가 포함된 경우 보조 리전이 삭제되었지만 보조 리전에 있는 Cassandra 포드의 IP 주소는 삭제되지 않았음을 나타냅니다.

해결 방법

삭제된 클러스터의 Cassandra 포드의 비활성 참조를 삭제하려면 다음 단계를 수행합니다.

  1. 클라이언트 컨테이너 만들기의 단계에 따라 컨테이너에 로그인하고 Cassandra 명령줄 인터페이스에 연결합니다.
  2. 컨테이너에 로그인하고 Cassandra cqlsh 인터페이스에 연결한 후 다음 SQL 쿼리를 실행하여 현재 keyspace 정의를 나열합니다.
    select * from system_schema.keyspaces;

    현재 키스페이스를 보여주는 샘플 출력:

    다음 출력에서 Primary-DC1은 기본 리전을 나타내고 Secondary-DC2는 보조 리전을 나타냅니다.

    bash-4.4# cqlsh 10.50.112.194 -u admin_user -p ADMIN.PASSWORD --ssl
    Connected to apigeecluster at 10.50.112.194:9042.
    [cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
    Use HELP for help.
    
    admin_user@cqlsh> Select * from system_schema.keyspaces;
    
    keyspace_name                        | durable_writes | replication
    -------------------------------------+----------------+--------------------------------------------------------------------------------------------------
    system_auth                          |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    kvm_tsg1_apigee_hybrid_prod_hybrid   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    kms_tsg1_apigee_hybrid_prod_hybrid   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    system_schema                        |           True |                                           {'class': 'org.apache.cassandra.locator.LocalStrategy'}
    system_distributed                   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    system                               |           True |                                           {'class': 'org.apache.cassandra.locator.LocalStrategy'}
    perses                               |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    cache_tsg1_apigee_hybrid_prod_hybrid |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    rtc_tsg1_apigee_hybrid_prod_hybrid   |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    quota_tsg1_apigee_hybrid_prod_hybrid |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    system_traces                        |           True | {'Primary-DC1': '3', 'Secondary-DC2': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'}
    (11 rows)

    보시다시피 keyspaces은 Apigee 런타임 클러스터가 보조 리전에서 삭제되었더라도 Primary-DC1Secondary-DC2를 모두 참조합니다.

    Secondary-DC2에 대한 비활성 참조는 각 keyspace 정의에서 삭제해야 합니다.

  3. keyspace 정의에서 비활성 참조를 삭제하기 전에 다음 명령어를 사용하여 Secondary-DC2에서 ASM(Istio) 및 cert-manager를 제외한 전체 Apigee 하이브리드 설치를 삭제하세요. 자세한 내용은 하이브리드 런타임 제거를 참조하세요.
    apigeectl delete -f YOUR_OVERRIDES_FILE.yaml --all
  4. keyspace 정의를 변경하여 각 keyspaces에서 Secondary-DC2에 대한 비활성 참조를 삭제합니다.
    ALTER KEYSPACE system_auth WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE kvm_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE kms_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE system_distributed WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE perses WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE cache_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE rtc_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE quota_tsg1_apigee_hybrid_prod_hybrid WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
    ALTER KEYSPACE system_traces WITH replication = {'Primary-DC1': '3', 'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy'};
  5. 다음 명령어를 실행하여 Secondary-DC2 리전에 대한 비활성 참조가 모든 keyspaces에서 삭제되었는지 확인합니다.
    select * from system_schema.keyspaces;
  6. Primary-DC1의 Cassandra 포드에 로그인하고 모든 Secondary-DC2 Cassandra 포드의 UUID에 대한 참조를 삭제합니다. UUID는 앞의 진단에 설명된 대로 nodetool status 명령어에서 가져올 수 있습니다.
    kubectl exec -it -n apigee apigee-cassandra-default-0 -- bash
    nodetool -u admin_user -pw ADMIN.PASSWORD removenode UUID_OF_CASSANDRA_POD_IN_SECONDARY_DC2
  7. nodetool status 명령어를 다시 실행하여 Secondary-DC2의 Cassandra 포드가 없는지 확인합니다.
  8. GKE 및 GKE On-Prem의 멀티 리전 배포의 단계에 따라 보조 리전(Secondary-DC2)에 Apigee 런타임 클러스터를 설치합니다.

진단 정보 수집 필요

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

  1. Google Cloud 프로젝트 ID
  2. Apigee Hybrid 조직의 이름
  3. 민감한 정보를 마스킹하는 기본 및 보조 리전의 overrides.yaml 파일
  4. 기본 및 보조 리전의 모든 네임스페이스의 Kubernetes 포드 상태:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
  5. 기본 및 보조 리전 모두에서의 Kubernetes cluster-info 덤프:
    # generate kubernetes cluster-info dump
    kubectl cluster-info dump -A --output-directory=/tmp/kubectl-cluster-info-dump
    
    # zip kubernetes cluster-info dump
    zip -r kubectl-cluster-info-dump`date +%Y.%m.%d_%H.%M.%S`.zip /tmp/kubectl-cluster-info-dump/*
  6. 기본 리전의 아래 nodetool 명령어 출력
    export u=`kubectl -n apigee get secrets apigee-datastore-default-creds -o jsonpath='{.data.jmx\.user}' | base64 -d`
    export pw=`kubectl -n apigee get secrets apigee-datastore-default-creds -o jsonpath='{.data.jmx\.password}' | base64 -d`
    
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw info 2>&1 | tee /tmp/k_nodetool_info_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw describecluster 2>&1 | tee /tmp/k_nodetool_describecluster_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw failuredetector 2>&1 | tee /tmp/k_nodetool_failuredetector_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw status 2>&1 | tee /tmp/k_nodetool_status_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw gossipinfo 2>&1 | tee /tmp/k_nodetool_gossipinfo_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw netstats 2>&1 | tee /tmp/k_nodetool_netstats_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw proxyhistograms 2>&1 | tee /tmp/k_nodetool_proxyhistograms_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw tpstats 2>&1 | tee /tmp/k_nodetool_tpstats_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw gcstats 2>&1 | tee /tmp/k_nodetool_gcstats_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw version 2>&1 | tee /tmp/k_nodetool_version_$(date +%Y.%m.%d_%H.%M.%S).txt
    kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u $u -pw $pw ring 2>&1 | tee /tmp/k_nodetool_ring_$(date +%Y.%m.%d_%H.%M.%S).txt
          

참조