VMware Cloud Director는 노드 간의 동기식 스트리밍 복제를 유지 관리합니다. 대기 노드가 연결되지 않은 상태가 되면 원인을 파악하고 문제를 해결해야 합니다.
문제
VMware Cloud Director 장치 관리 UI에 클러스터 상태가 DEGRADED으로 표시되고, 연결되지 않은 대기 노드 중 하나의 상태가 실행 중이며 대기 노드의 업스트림 노드 이름 앞에 느낌표(!)가 있습니다.
PostgreSQL 로그에는 기본 노드가 WAL 세그먼트를 삭제한 것으로 표시됩니다.
2020-10-08 04:10:50.064 UTC [13390] LOG: started streaming WAL from primary at 21/80000000 on timeline 17 2020-10-08 04:10:50.064 UTC [13390] FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000110000002100000080 has already been removed 2020-10-08 04:10:55.047 UTC [13432] LOG: started streaming WAL from primary at 21/80000000 on timeline 17 2020-10-08 04:10:55.047 UTC [13432] FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000110000002100000080 has already been removed
/nodes
API는 localClusterHealth
가 DEGRADED, 노드 status
가 실행 중, nodeHealth
가 HEALTHY이라는 정보를 반환합니다. 대기 노드의 업스트림 노드 이름 앞에 느낌표(!)가 있고 /nodes
API는 대기 노드가 업스트림 노드에 연결되지 않았다는 경고를 반환합니다.
예를 들어
/nodes
API가 노드에 대해 다음 정보를 반환할 수 있습니다.
{ "localClusterFailover": "MANUAL", "localClusterHealth": "DEGRADED", "localClusterState": [ { "connectionString": "host=primary_host_IP user=repmgr dbname=repmgr connect_timeout=2", "failover": { "details": "failover = manual", "mode": "MANUAL", "repmgrd": { "details": "On node primary_node_ID (primary_host_name): repmgrd = not applicable", "status": "NOT APPLICABLE" } }, "id": primary_node_ID, "location": "default", "name": "primary_host_name", "nodeHealth": "HEALTHY", "nodeRole": "PRIMARY", "role": "primary", "status": "* running", "upstream": "" }, { "connectionString": "host=unattached_standby_host_IP user=repmgr dbname=repmgr connect_timeout=2", "failover": { "details": "failover = manual", "mode": "MANUAL", "repmgrd": { "details": "On node unattached_standby_node_ID (unattached_standby_host_name): repmgrd = not applicable", "status": "NOT APPLICABLE" } }, "id": unattached_standby_node_ID, "location": "default", "name": "unattached_standby_host_name", "nodeHealth": "HEALTHY", "nodeRole": "STANDBY", "role": "standby", "status": "running", "upstream": "! upstream_host_name" }, { "connectionString": "host=running_standby_host_IP user=repmgr dbname=repmgr connect_timeout=2", "failover": { "details": "failover = manual", "mode": "MANUAL", "repmgrd": { "details": "On node running_standby_node_ID (running_standby_host_name): repmgrd = not applicable", "status": "NOT APPLICABLE" } }, "id": running_standby_node_ID, "location": "default", "name": "running_standby_host_name", "nodeHealth": "HEALTHY", "nodeRole": "STANDBY", "role": "standby", "status": "running", "upstream": "upstream_host_name" } ], "warnings": [ "node \"unattached_standby_host_name\" (ID: unattached_standby_node_ID) is not attached to its upstream node \"upstream_host_name\" (ID: upstream_node_id)" ] }
대기 노드가 연결되지 않은 상태가 되면 가능한 한 빨리 다시 연결해야 합니다. 노드가 너무 오랫동안 연결되지 않은 상태로 유지되면 기본 노드에서 복제를 재개하는 것이 불가능할 만큼 지속적으로 스트리밍되는 WAL 레코드를 처리하는 것이 뒤쳐질 수 있습니다.
원인
데이터 무결성을 보장하기 위해 PostgreSQL 데이터베이스는 WAL(Write-Ahead Logging)을 사용합니다. 기본 노드는 복제 및 복구 목적으로 WAL을 활성 대기 노드로 지속적으로 스트리밍합니다. 대기 노드는 WAL을 수신할 때 처리합니다. 대기 노드가 연결되지 않은 상태가 되면 WAL 수신을 중지하며, 새로운 기본 노드로 승격할 후보가 될 수 없습니다.
해결책
- 새로운 대기 노드를 배포합니다.
- 연결되지 않은 대기 노드를 등록 취소합니다.