Em uma implantação de dispositivo VMware Cloud Director com configuração de HA do banco de dados, o usuário postgres não pode se conectar aos seus nós de banco de dados peer via SSH.

Problema

Quando há um problema de SSH entre os nós de banco de dados, o VMware Cloud Director mostra localClusterHealth como SSH_PROBLEM. Você deve corrigir esse problema crítico o mais rápido possível.

É possível exibir localClusterHealth usando a interface de usuário de gerenciamento do dispositivo VMware Cloud Director ou executar a API do dispositivo /nodes VMware Cloud Director. Consulte a documentação da API do dispositivo do VMware Cloud Director.

Quando você executar a API /nodes em um nó peer que apresenta o problema de SSH, a API /nodes retorna informações de que localClusterHealth é SSH_PROBLEM e localClusterFailover é INDETERMINATE. O modo de failover é INDETERMINATE porque o nó no qual você executa a API /nodes não pode se conectar a um dos seus nós peer via SSH. O trecho "details" na parte da saída de "failover" do corpo de resposta para o nó com problema de SSH exibe: ssh failed. command: ssh unreachable_standby_host_IP /usr/bin/grep failover=manual /opt/vmware/vpostgres/10/etc/repmgr.conf.

Por exemplo, se um nó em espera tiver um problema de SSH e você executar GET https://primary_host_IP:5480/api/1.0.0/nodes, a API /nodes poderá retornar as seguintes informações.
{
    "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": []
}

Se você executar GET https://unreachable_standby_host_IP:5480/api/1.0.0/nodes, como o nó não é confiável, as informações de localClusterFailover e localClusterState poderão não estar corretas. A API /nodes retorna mensagens de aviso indicando que unreachable_standby_host_name não consegue se conectar aos seus nós peer.

Por exemplo, a API /nodes pode retornar as seguintes informações.
{
    "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)"
    ]
}

Causa

O VMware Cloud Director armazena os certificados SSH do usuário postgres no armazenamento do servidor de transferência compartilhado NFS. Todos os nós de banco de dados devem ter acesso ao armazenamento do servidor de transferência compartilhado. Se um nó do banco de dados se tornar não confiável, ou seja, se os certificados SSH do usuário postgres não forem mais válidos ou acessíveis, ele não poderá executar comandos em seus nós peer usando um cliente SSH. O dispositivo VMware Cloud Director deve ter esse recurso para ser executado corretamente quando está no modo HA.

Solução

  1. Determine se há um problema de conectividade entre os nós e corrija o problema. Consulte Verificar o status de conectividade de um cluster de alta disponibilidade de banco de dados.
  2. Verifique se o serviço appliance-sync.timer está em execução nos nós que têm o problema de SSH, executando o seguinte comando.
    systemctl status appliance-sync.timer
    Por exemplo, o comando pode retornar:
    * 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. Se o status do serviço appliance-sync.timer não for Ativo, reinicie esse serviço executando o seguinte comando.
    systemctl start appliance-sync.timer
  4. Aguarde aproximadamente 90 segundos e verifique se a estado do cluster é HEALTHY usando a UI de gerenciamento do VMware Cloud Director ou chame a API /nodes.