VMware Cloud Director は、ノード間でストリーミング レプリケーションの同期を維持します。スタンバイ ノードが接続解除された場合は、原因を特定して問題を解決する必要があります。
問題
VMware Cloud Director アプライアンス管理ユーザー インターフェイスにクラスタの健全性が DEGRADED と表示され、いずれかの接続解除されたスタンバイ ノードのステータスが running になり、感嘆符 (!) がスタンバイのアップストリーム ノードの名前の前に付いています。
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 が running に、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) を使用します。プライマリ ノードは、レプリケーションおよびリカバリを行うために、WAL をアクティブなスタンバイ ノードに継続的にストリーミングします。WAL を受信したスタンバイ ノードは、WAL を処理します。スタンバイ ノードが接続解除になると、スタンバイ ノードは WAL の受信を停止し、新しいプライマリになるプロモーションの候補から外れます。
解決方法
- 新しいスタンバイ ノードをデプロイします。
- 接続解除されたスタンバイ ノードを登録解除します。