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

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

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. Нажимайте Сброс поочередно для каждой реплики до тех пор, пока кластер не будет восстановлен.