Если произошел сбой базы данных устройства, после которого не работает ни один ее узел, или после сбоя основного узла нарушена синхронизация всех узлов-реплик, попытайтесь восстановить базу данных с помощью следующей процедуры.

Данная процедура подходит для ситуаций, когда в кластере, работающем в несинхронном режиме, нет работоспособных узлов базы данных. В этом случае при попытке загрузить или обновить страницу интерфейса управления виртуальными устройствами обычно возникают ошибки, аналогичные следующим:

Error initializing the database service: Could not open JDBC Connection for transaction; nested exception is org.postgresql.util.PSQLException: The connection attempt failed.

Процедура

  1. Попытайтесь восстановить базу данных, используя интерфейс управления виртуальными устройствами с одного из узлов базы данных.
    1. а. Если возможно, откройте страницу Кластер в интерфейсе управления виртуальными устройствами для узла с наиболее актуальным состоянием. Обычно это узел, который был основным до сбоя базы данных.
    2. б. Если не удается открыть интерфейс управления виртуальными устройствами для основного узла, попробуйте открыть интерфейс для узлов-реплик.
    3. в. Если имеется узел базы данных с работоспособным интерфейсом управления виртуальными устройствами, попытайтесь восстановить его, выполнив аварийное переключение вручную.
  2. Если не удалось выполнить процедуру, описанную в шаге 1, запустите сеанс оболочки и попытайтесь найти узел с самым последним состоянием. Запустите сеанс оболочки для всех доступных узлов кластера и попытайтесь запустить базы данных с помощью следующей команды: service vpostgres start
  3. Используйте следующую процедуру для каждого узла, на котором работает локальная база данных, чтобы определить узел с самым последним состоянием.
    1. а. Запустите следующую команду, чтобы определить узел с самым последним состоянием: Если при выполнении команды возвращается результат f, то это узел с самым последним состоянием, и можно переходить к шагу 4.
      su - postgres
      psql vcac
      vcac=# select pg_is_in_recovery();
       pg_is_in_recovery
      • Если при выполнении команды возвращается результат f, то это узел с самым последним состоянием.
      • Если узел возвращает результат t, запустите на этом узле следующую команду:
      SELECT pg_last_xlog_receive_location() as receive_loc, pg_last_xlog_replay_location() as replay_loc, extract(epoch from pg_last_xact_replay_timestamp()) as replay_timestamp;
      Эта команда должна вернуть результат, аналогичный приведенному ниже.
      vcac=# SELECT pg_last_xlog_receive_location() as receive_loc, pg_last_xlog_replay_location() as replay_loc, extract(epoch from pg_last_xact_replay_timestamp()) as replay_timestamp;
       receive_loc | replay_loc | replay_timestamp
      -------------+------------+------------------
       0/20000000 | 0/203228A0 | 1491577215.68858
      (1 row)
      
  4. Сравните результаты для каждого узла и определите, какой из них находится в самом последнем состоянии.
    Выберите узел с наибольшим значением в столбце receive_loc. Если значения в этом столбце равны у всех узлов, выберите узел с наибольшим значением в столбце replay_loc. Если эти значения также равны для всех узлов, выберите узел с наибольшим значением в столбце replay_timestamp.
  5. Запустите следующую команду на узле с самым последним состоянием: vcac-vami psql-promote-master -force
  6. Откройте файл /etc/haproxy/conf.d/10-psql.cfg в текстовом редакторе и измените следующую строку,
    server masterserver sc-rdops-vm06-dhcp-170-156.eng.vmware.com:5432 check on-marked-up shutdown-backup-sessions
    
    указав полное доменное имя текущего узла. Строка должна выглядеть так:
    server masterserver current-node-fqdn:5432 check on-marked-up shutdown-backup-sessions
  7. Сохраните файл.
  8. Выполните команду service haproxy restart.
  9. Откройте страницу Кластер в интерфейсе управления виртуальными устройствами для узла с наиболее актуальным состоянием.
    Этот узел должен отображаться как основной, а остальные узлы — как недопустимые реплики. Для этих реплик также доступна кнопка Сброс.
  10. Нажимайте Сброс поочередно для каждой реплики до тех пор, пока кластер не будет восстановлен.