In einer Bereitstellung der VMware Cloud Director-Appliance mit Datenbank-HA-Konfiguration kann der postgres-Benutzer keine Verbindung zu seinen gleichrangigen Datenbankknoten über SSH herstellen.

Problem

Wenn zwischen den Datenbankknoten ein SSH-Problem besteht, zeigt VMware Cloud Director die localClusterHealth als SSH_PROBLEM an. Sie müssen dieses kritische Problem schnellstmöglich beheben.

Sie können die localClusterHealth mithilfe der Verwaltungsbenutzeroberfläche der VMware Cloud Director-Appliance anzeigen oder die /nodes-API der VMware Cloud Director-Appliance ausführen. Weitere Informationen finden Sie in der VMware Cloud Director-Appliance-API-Dokumentation.

Wenn Sie die /nodes-API auf einem Peer-Knoten des Knotens mit dem SSH-Problem ausführen, gibt die /nodes-API Informationen mit dem Hinweis zurück, dass die localClusterHealth auf SSH_PROBLEM und das localClusterFailover auf UNBESTIMMT lautet. Der Failover-Modus lautet UNBESTIMMT, da der Knoten, auf dem Sie die /nodes-API ausführen, keine Verbindung zu einem der zugehörigen Peer-Knoten über SSH herstellen kann. In den "details" im "failover"-Ausgabeteil des Antworttexts für den Knoten mit dem SSH-Problem wird Folgendes angezeigt: ssh fehlgeschlagen. Befehl: ssh unreachable_standby_host_IP /usr/bin/grep failover=manual /opt/vmware/vpostgres/10/etc/repmgr.conf.

Wenn beispielsweise bei einem Standby-Knoten ein SSH-Problem vorliegt und Sie GET https://primary_host_IP:5480/api/1.0.0/nodes ausführen, gibt die /nodes-API möglicherweise die folgenden Informationen zurück.
{
    "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": []
}

Wenn Sie GET https://unreachable_standby_host_IP:5480/api/1.0.0/nodes ausführen, weil der Knoten nicht vertrauenswürdig ist, sind die Daten zu localClusterFailover und localClusterState unter Umständen nicht korrekt. Die /nodes-API gibt Warnmeldungen mit dem Hinweis zurück, dass unreachable_standby_host_name keine Verbindung zu den zugehörigen Peer-Knoten herstellen kann.

Beispiel: Die /nodes-API gibt möglicherweise die folgenden Informationen zurück.
{
    "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)"
    ]
}

Ursache

VMware Cloud Director speichert die SSH-Zertifikate des postgres-Benutzers im Speicher des gemeinsam genutzten NFS-Übertragungsservers. Alle Datenbankknoten müssen über Zugriff auf den gemeinsam genutzten Speicher des Übertragungsservers verfügen. Wenn ein Datenbankknoten nicht mehr vertrauenswürdig ist, weil die SSH-Zertifikate des postgres-Benutzers entweder nicht mehr gültig oder nicht mehr zugänglich sind, kann dieser Knoten keine Befehle auf den zugehörigen Peer-Knoten mithilfe eines SSH-Clients ausführen. Die VMware Cloud Director-Appliance muss diese Funktion aufweisen, um im HA-Modus ordnungsgemäß ausgeführt werden zu können.

Lösung

  1. Finden Sie heraus, ob ein Konnektivitätsproblem zwischen den Knoten besteht, und beheben Sie das Problem. Weitere Informationen finden Sie im Überprüfen des Verbindungsstatus eines Datenbank-Hochverfügbarkeits-Clusters.
  2. Stellen Sie sicher, dass der appliance-sync.timer-Dienst auf den Knoten mit dem SSH-Problem ausgeführt wird, indem Sie folgenden Befehl verwenden.
    systemctl status appliance-sync.timer
    Der Befehl gibt beispielsweise Folgendes zurück:
    * 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. Wenn der Status des appliance-sync.timer-Diensts nicht auf Aktiv festgelegt ist, starten Sie den Dienst neu, indem Sie folgenden Befehl ausführen.
    systemctl start appliance-sync.timer
  4. Warten Sie etwa 90 Sekunden und stellen Sie sicher, dass die Clusterintegrität auf FEHLERFREI festgelegt ist, indem Sie die VMware Cloud Director-Verwaltungsbenutzeroberfläche verwenden oder die /nodes-API aufrufen.