データベース高可用性構成の VMware Cloud Director アプライアンス環境で、postgres ユーザーが SSH を介してピア データベース ノードに接続できません。

問題

データベース ノード間に SSH の問題がある場合は、VMware Cloud DirectorlocalClusterHealthSSH_PROBLEM として表示されます。この問題は重大であるため、可能なかぎり早く修正する必要があります。

localClusterHealth を表示するには、VMware Cloud Director アプライアンス管理ユーザー インターフェイスを使用するか、/nodes VMware Cloud Director アプライアンス API を実行します。VMware Cloud Director アプライアンス API のドキュメントを参照してください。

SSH 問題の発生したアプライアンス環境のピア ノードで /nodes API を実行すると、/nodes API は、localClusterHealthSSH_PROBLEMlocalClusterFailoverINDETERMINATE であるという情報を返します。/nodes API を実行しているノードから SSH 経由でピア ノードの 1 つに接続することができないため、フェイルオーバー モードは 不明 の状態です。SSH に問題のあるノードから送信されたレスポンス本文の "failover" 出力部分内の "details" に、「ssh failed.command: ssh unreachable_standby_host_IP /usr/bin/grep failover=manual /opt/vmware/vpostgres/10/etc/repmgr.conf」と表示されています。

たとえば、スタンバイ ノードに SSH 問題がある場合に、 GET https://primary_host_IP:5480/api/1.0.0/nodes を実行すると、 /nodes API は次の情報を返すことがあります。
{
    "localClusterFailover": "INDETERMINATE",
    "localClusterHealth": "SSH_PROBLEM",
    "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=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": "primary_host_name"
        },
        {
            "connectionString": "host=unreachable_standby_host_IP user=repmgr dbname=repmgr connect_timeout=2",
            "failover": {
                "details": "ssh failed. command: ssh unreachable_standby_host_IP /usr/bin/grep failover=manual /opt/vmware/vpostgres/10/etc/repmgr.conf",
                "mode": "UNKNOWN",
                "repmgrd": {
                    "details": "On node unreachable_standby_node_ID (unreachable_standby_host_name): repmgrd = not running",
                    "status": "NOT RUNNING"
                }
            },
            "id": unreachable_standby_node_ID,
            "location": "default",
            "name": "unreachable_standby_host_name",
            "nodeHealth": "HEALTHY",
            "nodeRole": "STANDBY",
            "role": "standby",
            "status": "running",
            "upstream": "primary_host_name"
        }
    ],
    "warnings": []
}

GET https://unreachable_standby_host_IP:5480/api/1.0.0/nodes を実行すると、ノードは信頼されていないため、localClusterFailover および localClusterState の情報が不正確になることがあります。/nodes API は、unreachable_standby_host_name がピア ノードに接続できないことを示す警告メッセージを返します。

たとえば、 /nodes API が次の情報を返すことがあります。
{
    "localClusterFailover": "MANUAL",
    "localClusterHealth": "SSH_PROBLEM",
    "localClusterState": [
        {
            "connectionString": "host=primary_host_IP user=repmgr dbname=repmgr connect_timeout=2",
            "failover": {
                "details": "ssh failed. command: ssh primary_host_IP /usr/bin/grep failover=manual /opt/vmware/vpostgres/10/etc/repmgr.conf",
                "mode": "UNKNOWN",
                "repmgrd": {
                    "details": "On node primary_node_ID (primary_host_name): repmgrd = n/a",
                    "status": "UNKNOWN"
                }
            },
            "id": primary_node_ID,
            "location": "default",
            "name": "primary_host_name",
            "nodeHealth": "UNHEALTHY",
            "nodeRole": "PRIMARY",
            "role": "primary",
            "status": "? running",
            "upstream": ""
        },
        {
            "connectionString": "host=running_standby_host_IP user=repmgr dbname=repmgr connect_timeout=2",
            "failover": {
                "details": "ssh failed. command: ssh running_standby_host_IP /usr/bin/grep failover=manual /opt/vmware/vpostgres/10/etc/repmgr.conf",
                "mode": "UNKNOWN",
                "repmgrd": {
                    "details": "On node running_standby_node_ID (running_standby_host_name): repmgrd = n/a",
                    "status": "UNKNOWN"
                }
            },
            "id": running_standby_node_ID,
            "location": "default",
            "name": "running_standby_host_name",
            "nodeHealth": "UNHEALTHY",
            "nodeRole": "STANDBY",
            "role": "standby",
            "status": "? running",
            "upstream": "primary_host_name"
        },
        {
            "connectionString": "host=unreachable_standby_host_IP user=repmgr dbname=repmgr connect_timeout=2",
            "failover": {
                "details": "failover = manual",
                "mode": "MANUAL",
                "repmgrd": {
                    "details": "On node unreachable_standby_node_ID (unreachable_standby_host_name): repmgrd = not applicable",
                    "status": "NOT APPLICABLE"
                }
            },
            "id": unreachable_standby_node_ID,
            "location": "default",
            "name": "unreachable_standby_host_name",
            "nodeHealth": "HEALTHY",
            "nodeRole": "STANDBY",
            "role": "standby",
            "status": "running",
            "upstream": "? primary_host_name"
        }
    ],
    "warnings": [
        "unable to connect to node \"primary_host_name\" (ID: primary_node_ID)",
        "unable to connect to node \"running_standby_host_name\" (ID: running_standby_node_ID)",
        "unable to connect to node \"unreachable_standby_host_name\" (ID: unreachable_standby_node_ID)'s upstream node \"primary_host_name\" (ID: primary_node_ID)",
        "unable to determine if node \"unreachable_standby_host_name\" (ID: unreachable_standby_node_ID) is attached to its upstream node \"primary_host_name\" (ID: primary_node_ID)"
    ]
}

原因

VMware Cloud Director は、postgres の SSH 証明書を NFS 共有転送サーバ ストレージに保存します。すべてのデータベース ノードが共有転送サーバ ストレージにアクセスできる必要があります。データベース ノードが信頼されない状態になった場合、つまり、postgres ユーザーの SSH 証明書が有効でなくなったか、アクセス不能になった場合、そのノードは SSH クライアントを使用してピア ノードからコマンドを実行できません。HA モードの場合、VMware Cloud Director アプライアンスはこの機能を使用して適切に動作する必要があります。

解決方法

  1. ノード間に接続の問題が発生しているかどうかを判断して、問題を修正します。データベース高可用性クラスタの接続ステータスの確認を参照してください。
  2. 次のコマンドを実行して、SSH 問題が発生したノードで appliance-sync.timer サービスが実行されていることを確認します。
    systemctl status appliance-sync.timer
    たとえば、コマンドによって以下が返される場合があります。
    * appliance-sync.timer - Periodic check and sync of needed files for Cloud Appliance functionality
       Loaded: loaded (/lib/systemd/system/appliance-sync.timer; enabled; vendor preset: enabled)
       Active: active (waiting) since Sat 2020-09-05 23:22:49 UTC; 1 months 9 days ago
     
    Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
  3. appliance-sync.timer サービスのステータスが アクティブ でない場合は、次のコマンドを実行してサービスを再起動します。
    systemctl start appliance-sync.timer
  4. 約 90 秒間待機してから、VMware Cloud Director 管理ユーザー インターフェイスを使用するか /nodes API を呼び出して、クラスタの健全性が 健全 であることを確認します。