Apigee 및 Apigee Hybrid 문서입니다.
Apigee Edge 문서 보기
증상
Cassandra 포드가 멀티 리전 Apigee Hybrid 설정의 리전 중 하나에서 시작할 때 오류가 발생합니다. overrides.yaml
파일을 적용하면 Cassandra 포드가 성공적으로 시작되지 않습니다.
오류 메시지
- 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.
Cassandra 포드 상태에서 다음 경고가 표시될 수 있습니다.
가능한 원인
이 문제는 일반적으로 다음과 같은 경우에 발생합니다.
- Apigee 런타임 클러스터가 리전 중 하나에서 삭제됩니다.
- Apigee 런타임 클러스터를 다시 설치하려고 시도하면 GKE 및 GKE On-Prem의 멀티 리전 배포에 설명된 대로
overrides.yaml
파일에서 Cassandra의 시드 호스트 구성이 있는 리전에 생성됩니다. - Apigee 런타임 클러스터를 삭제해도 Cassandra 클러스터의 참조는 삭제되지 않습니다. 따라서 삭제된 클러스터의 Cassandra 포드에 대한 비활성 참조는 보존됩니다. 이러한 이유로 보조 리전에 Apigee 런타임 클러스터를 다시 설치하려고 하면 Cassandra 포드에 특정 IP 주소가 이미 있다는 메시지가 표시됩니다. IP 주소가 이전에 사용된 것과 동일한 서브넷에서 할당될 수 있기 때문입니다.
원인 | 설명 |
---|---|
Cassandra 클러스터에서 삭제된 보조 리전 포드에 대한 비활성 참조 | 보조 리전에서 Apigee 런타임 클러스터를 삭제해도 보조 리전의 Cassandra 포드 IP 주소에 대한 참조는 삭제되지 않습니다. |
원인: Cassandra 클러스터에서 삭제된 보조 리전 포드에 대한 비활성 참조
진단
- 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
이 여전히 출력에 나열되어 있음을 보여줍니다. - 출력에 보조 리전의 Cassandra 포드에 대한 비활성 참조가 포함된 경우 보조 리전이 삭제되었지만 보조 리전에 있는 Cassandra 포드의 IP 주소는 삭제되지 않았음을 나타냅니다.
해결 방법
삭제된 클러스터의 Cassandra 포드의 비활성 참조를 삭제하려면 다음 단계를 수행합니다.
- 클라이언트 컨테이너 만들기의 단계에 따라 컨테이너에 로그인하고 Cassandra 명령줄 인터페이스에 연결합니다.
- 컨테이너에 로그인하고 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-DC1
및Secondary-DC2
를 모두 참조합니다.Secondary-DC2
에 대한 비활성 참조는 각keyspace
정의에서 삭제해야 합니다. keyspace
정의에서 비활성 참조를 삭제하기 전에 다음 명령어를 사용하여Secondary-DC2
에서 ASM(Istio) 및cert-manager
를 제외한 전체 Apigee 하이브리드 설치를 삭제하세요. 자세한 내용은 하이브리드 런타임 제거를 참조하세요.apigeectl delete -f YOUR_OVERRIDES_FILE.yaml --all
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'};
- 다음 명령어를 실행하여
Secondary-DC2
리전에 대한 비활성 참조가 모든keyspaces
에서 삭제되었는지 확인합니다.select * from system_schema.keyspaces;
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
nodetool status
명령어를 다시 실행하여Secondary-DC2
의 Cassandra 포드가 없는지 확인합니다.- GKE 및 GKE On-Prem의 멀티 리전 배포의 단계에 따라 보조 리전(
Secondary-DC2
)에 Apigee 런타임 클러스터를 설치합니다.
진단 정보 수집 필요
위 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 후 Google Cloud Customer Care에 문의하세요.
- Google Cloud 프로젝트 ID
- Apigee Hybrid 조직의 이름
- 민감한 정보를 마스킹하는 기본 및 보조 리전의
overrides.yaml
파일 - 기본 및 보조 리전의 모든 네임스페이스의 Kubernetes 포드 상태:
kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
- 기본 및 보조 리전 모두에서의 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/*
- 기본 리전의 아래
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