Восстановление после сбоев

MatrixDB — это высокодоступная распределённая база данных, поддерживающая восстановление после простоя узлов. Предпосылкой высокой доступности является избыточное развертывание: узел master должен иметь резервный узел-standby; для узлов segment основной узел (primary) должен иметь соответствующий зеркальный узел (mirror). Схема развертывания системы с высокой доступностью приведена ниже: HA

Независимо от того, является ли узел master или segment, его резервный узел должен размещаться на другом хосте, чтобы избежать недоступности кластера при сбое одного хоста.

1. Диагностика и восстановление сбоев узлов segment

1.1 Служба диагностики сбоев FTS

FTS (Fault Tolerance Service) — это вспомогательный процесс узла master, отвечающий за управление состоянием узлов segment. При сбое узла segment (primary или mirror) процесс FTS автоматически восстанавливает состояние. Состояние узлов можно проверить, запросив таблицу gp_segment_configuration:

mxadmin=# select * from gp_segment_configuration order by content,dbid;
 dbid | content | role | preferred_role | mode | status | port | hostname | address |         datadir
-----+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1 |      -1 | p    | p              | n    | u      | 5432 | mdw      | mdw     | /mxdata/master/mxseg-1
    6 |      -1 | m    | m              | s    | u      | 5432 | smdw     | smdw    | /mxdata/standby/mxseg-1
    2 |       0 | p    | p              | s    | u      | 6000 | sdw1     | sdw1    | /mxdata/primary/mxseg0
    4 |       0 | m    | m              | s    | u      | 6001 | sdw2     | sdw2    | /mxdata/mirror/mxseg0
    3 |       1 | p    | p              | s    | u      | 6000 | sdw2     | sdw2    | /mxdata/primary/mxseg1
    5 |       1 | m    | m              | s    | u      | 6001 | sdw1     | sdw1    | /mxdata/mirror/mxseg1
(6 rows)

Описание столбцов:

Имя столбца Описание
dbid Идентификатор узла, инкрементируется с 1
content Номер пары master-slave: для master и standby — -1, для пар segment — инкрементируется с 0
role Роль узла: p — primary, m — mirror
preferred_role Первоначальная роль узла
mode Состояние синхронизации
status Состояние узла: u — активен, d — недоступен
port Порт
hostname Имя хоста
address Адрес хоста
datadir Директория данных

Из схемы развертывания видно:

  • Master и standby развернуты на разных независимых узлах.
  • Primary и mirror каждого segment развернуты на разных хостах.
  • Primary-узлы segment распределены децентрализованно.

Такой подход предотвращает недоступность системы при сбое одного хоста и распределяет нагрузку по кластеру.

1.1.1 Сбой зеркального узла

Когда FTS обнаруживает, что зеркальный узел недоступен, его статус в таблице gp_segment_configuration помечается как d.

Поскольку сбой mirror не приводит к недоступности кластера, FTS не выполняет дополнительных действий. Восстановление mirror требует команды gprecoverseg, которая будет описана ниже.

Из следующего запроса видно, что при сбое mirror-узла с dbid=4 его статус становится d:

mxadmin=# select * from gp_segment_configuration order by content,dbid;
 dbid | content | role | preferred_role | mode | status | port | hostname | address |         datadir
-----+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1 |      -1 | p    | p              | n    | u      | 5432 | mdw      | mdw     | /mxdata/master/mxseg-1
    6 |      -1 | m    | m              | s    | u      | 5432 | smdw     | smdw    | /mxdata/standby/mxseg-1
    2 |       0 | p    | p              | n    | u      | 6000 | sdw1     | sdw1    | /mxdata/primary/mxseg0
    4 |       0 | m    | m              | n    | d      | 6001 | sdw2     | sdw2    | /mxdata/mirror/mxseg0
    3 |       1 | p    | p              | s    | u      | 6000 | sdw2     | sdw2    | /mxdata/primary/mxseg1
    5 |       1 | m    | m              | s    | u      | 6001 | sdw1     | sdw1    | /mxdata/mirror/mxseg1
(6 rows)

1.1.2 Сбой основного узла

Когда FTS обнаруживает сбой primary-узла, соответствующий mirror-узел автоматически становится primary. При запросе таблицы gp_segment_configuration видно, что роль узла изменилась, а также его состояние.

Из следующего запроса видно, что после сбоя primary-узла с dbid=2 mirror-узел с dbid=4 становится primary. Роль и preferred_role больше не совпадают для пары segment с content=0 — это означает, что роль узла больше не является первоначальной, и его состояние изменилось соответствующим образом:

mxadmin=# select * from gp_segment_configuration order by content,dbid;
 dbid | content | role | preferred_role | mode | status | port | hostname | address |         datadir
-----+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1 |      -1 | p    | p              | n    | u      | 5432 | mdw      | mdw     | /mxdata/master/mxseg-1
    6 |      -1 | m    | m              | s    | u      | 5432 | smdw     | smdw    | /mxdata/standby/mxseg-1
    2 |       0 | m    | p              | n    | d      | 6000 | sdw1     | sdw1    | /mxdata/primary/mxseg0
    4 |       0 | p    | m              | n    | u      | 6001 | sdw2     | sdw2    | /mxdata/mirror/mxseg0
    3 |       1 | p    | p              | s    | u      | 6000 | sdw2     | sdw2    | /mxdata/primary/mxseg1
    5 |       1 | m    | m              | s    | u      | 6001 | sdw1     | sdw1    | /mxdata/mirror/mxseg1
(6 rows)

Помимо системных таблиц, состояние кластера можно отслеживать через графический интерфейс.
На следующих двух изображениях показаны сбой узла segment и завершённое переключение master-slave:

1.2 Инструмент восстановления узлов gprecoverseg

FTS диагностирует состояние узлов segment и выполняет переключение primary→mirror при сбое primary. Однако после переключения для соответствующей пары segment остаётся только один активный узел — primary. При новом сбое восстановить систему будет невозможно. Поэтому необходимо заново создать mirror для нового primary. Для этого используется инструмент gprecoverseg.

Инструмент gprecoverseg выполняет следующие функции:

  • Восстанавливает ранее недоступный mirror-узел
  • Создаёт новый mirror для узла, ставшего primary в результате переключения
  • Восстанавливает распределение ролей, приводя их в соответствие с первоначальными

1.2.1 Восстановление недоступного mirror / создание нового mirror

Для восстановления недоступного mirror выполните команду gprecoverseg:

[mxadmin@mdw ~]$ gprecoverseg
20210908:14:40:18:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Starting gprecoverseg with args:
20210908:14:40:18:012136 gprecoverseg:mdw:mxadmin-[INFO]:-local Greenplum Version: 'postgres (MatrixDB) 4.2.0-community (Greenplum Database) 7.0.0+dev.17004.g36dd1f65d9 build commit:36dd1f65d9ceb770077d5d1b18d5b34d1a472c7d'
20210908:14:40:18:012136 gprecoverseg:mdw:mxadmin-[INFO]:-master Greenplum Version: 'PostgreSQL 12 (MatrixDB 4.2.0-community) (Greenplum Database 7.0.0+dev.17004.g36dd1f65d9 build commit:36dd1f65d9ceb770077d5d1b18d5b34d1a472c7d) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5), 64-bit compiled on Sep  1 2021 03:15:53'
20210908:14:40:18:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Obtaining Segment details from master...
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Heap checksum setting is consistent between master and the segments that are candidates for recoverseg
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Greenplum instance recovery parameters
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Recovery type              = Standard
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Recovery 1 of 1
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-   Synchronization mode                 = Incremental
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-   Failed instance host                 = sdw2
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-   Failed instance address              = sdw2
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-   Failed instance directory            = /mxdata/mirror/mxseg0
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-   Failed instance port                 = 6001
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-   Recovery Source instance host        = sdw1
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-   Recovery Source instance address     = sdw1
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-   Recovery Source instance directory   = /mxdata/primary/mxseg0
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-   Recovery Source instance port        = 6000
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:-   Recovery Target                      = in-place
20210908:14:40:19:012136 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------

Continue with segment recovery procedure Yy|Nn (default=N):
> y
20210908:14:40:20:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Starting to modify pg_hba.conf on primary segments to allow replication connections
20210908:14:40:23:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Successfully modified pg_hba.conf on primary segments to allow replication connections
20210908:14:40:23:012136 gprecoverseg:mdw:mxadmin-[INFO]:-1 segment(s) to recover
20210908:14:40:23:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Ensuring 1 failed segment(s) are stopped
20210908:14:40:24:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Updating configuration with new mirrors
20210908:14:40:24:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Updating mirrors
20210908:14:40:24:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Running pg_rewind on required mirrors
20210908:14:40:25:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Starting mirrors
20210908:14:40:25:012136 gprecoverseg:mdw:mxadmin-[INFO]:-era is 494476b1be478047_210908141632
20210908:14:40:25:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Commencing parallel segment instance startup, please wait...
20210908:14:40:25:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Process results...
20210908:14:40:25:012136 gprecoverseg:mdw:mxadmin-[INFO]:-
20210908:14:40:25:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Triggering FTS probe
20210908:14:40:25:012136 gprecoverseg:mdw:mxadmin-[INFO]:-******************************************************************
20210908:14:40:25:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Updating segments for streaming is completed.
20210908:14:40:25:012136 gprecoverseg:mdw:mxadmin-[INFO]:-For segments updated successfully, streaming will continue in the background.
20210908:14:40:25:012136 gprecoverseg:mdw:mxadmin-[INFO]:-Use  gpstate -s  to check the streaming progress.
20210908:14:40:25:012136 gprecoverseg:mdw:mxadmin-[INFO]:-******************************************************************

1.2.2 Перераспределение ролей узлов

После сбоя primary и завершения переключения mirror на primary, выполнение команды gprecoverseg создаёт новый mirror для нового primary. После этого запрос таблицы gp_segment_configuration показывает:

mxadmin=# select * from gp_segment_configuration order by content,dbid;
 dbid | content | role | preferred_role | mode | status | port | hostname | address |         datadir
-----+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1 |      -1 | p    | p              | n    | u      | 5432 | mdw      | mdw     | /mxdata/master/mxseg-1
    6 |      -1 | m    | m              | s    | u      | 5432 | smdw     | smdw    | /mxdata/standby/mxseg-1
    2 |       0 | m    | p              | s    | u      | 6000 | sdw1     | sdw1    | /mxdata/primary/mxseg0
    4 |       0 | p    | m              | s    | u      | 6001 | sdw2     | sdw2    | /mxdata/mirror/mxseg0
    3 |       1 | p    | p              | s    | u      | 6000 | sdw2     | sdw2    | /mxdata/primary/mxseg1
    5 |       1 | m    | m              | s    | u      | 6001 | sdw1     | sdw1    | /mxdata/mirror/mxseg1
(6 rows)

Видно, что для пары segment с content=0 оба узла — primary и mirror — активны. Однако текущая роль и первоначальная роль поменялись местами. Это происходит потому, что после того, как mirror стал primary, при выполнении gprecoverseg новый mirror-узел переиспользует бывший недоступный primary-узел.

Хотя gprecoverseg создаёт mirror для нового primary, это приводит к новой проблеме: распределение primary-узлов изменилось — оба primary теперь находятся на sdw2. Это вызывает:

  • Неравномерное распределение ресурсов хоста: sdw2 получает повышенную нагрузку
  • При повторном сбое sdw2 последствия будут критичными

Поэтому необходимо выполнить перераспределение primary и mirror, что как раз и является целью столбца preferred_role, хранящего первоначальные роли.

Команда перераспределения:

[mxadmin@mdw ~]$ gprecoverseg -r
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Starting gprecoverseg with args: -r
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-local Greenplum Version: 'postgres (MatrixDB) 4.2.0-community (Greenplum Database) 7.0.0+dev.17004.g36dd1f65d9 build commit:36dd1f65d9ceb770077d5d1b18d5b34d1a472c7d'
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-master Greenplum Version: 'PostgreSQL 12 (MatrixDB 4.2.0-community) (Greenplum Database 7.0.0+dev.17004.g36dd1f65d9 build commit:36dd1f65d9ceb770077d5d1b18d5b34d1a472c7d) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5), 64-bit compiled on Sep  1 2021 03:15:53'
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Obtaining Segment details from master...
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Greenplum instance recovery parameters
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Recovery type              = Rebalance
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Unbalanced segment 1 of 2
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Unbalanced instance host        = sdw2
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Unbalanced instance address     = sdw2
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Unbalanced instance directory   = /mxdata/mirror/mxseg0
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Unbalanced instance port        = 6001
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Balanced role                   = Mirror
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Current role                    = Primary
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Unbalanced segment 2 of 2
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Unbalanced instance host        = sdw1
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Unbalanced instance address     = sdw1
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Unbalanced instance directory   = /mxdata/primary/mxseg0
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Unbalanced instance port        = 6000
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Balanced role                   = Primary
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Current role                    = Mirror
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[WARNING]:-This operation will cancel queries that are currently executing.
20210908:15:24:04:012918 gprecoverseg:mdw:mxadmin-[WARNING]:-Connections to the database however will not be interrupted.

Continue with segment rebalance procedure Yy|Nn (default=N):
> y
20210908:15:24:05:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Getting unbalanced segments
20210908:15:24:05:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Stopping unbalanced primary segments...
20210908:15:24:06:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Triggering segment reconfiguration
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Starting segment synchronization
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-=============================START ANOTHER RECOVER=========================================
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-local Greenplum Version: 'postgres (MatrixDB) 4.2.0-community (Greenplum Database) 7.0.0+dev.17004.g36dd1f65d9 build commit:36dd1f65d9ceb770077d5d1b18d5b34d1a472c7d'
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-master Greenplum Version: 'PostgreSQL 12 (MatrixDB 4.2.0-community) (Greenplum Database 7.0.0+dev.17004.g36dd1f65d9 build commit:36dd1f65d9ceb770077d5d1b18d5b34d1a472c7d) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5), 64-bit compiled on Sep  1 2021 03:15:53'
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Obtaining Segment details from master...
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Heap checksum setting is consistent between master and the segments that are candidates for recoverseg
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Greenplum instance recovery parameters
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Recovery type              = Standard
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Recovery 1 of 1
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Synchronization mode                 = Incremental
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Failed instance host                 = sdw2
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Failed instance address              = sdw2
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Failed instance directory            = /mxdata/mirror/mxseg0
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Failed instance port                 = 6001
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Recovery Source instance host        = sdw1
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Recovery Source instance address     = sdw1
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Recovery Source instance directory   = /mxdata/primary/mxseg0
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Recovery Source instance port        = 6000
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-   Recovery Target                      = in-place
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:----------------------------------------------------------
20210908:15:24:13:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Starting to modify pg_hba.conf on primary segments to allow replication connections
20210908:15:24:16:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Successfully modified pg_hba.conf on primary segments to allow replication connections
20210908:15:24:16:012918 gprecoverseg:mdw:mxadmin-[INFO]:-1 segment(s) to recover
20210908:15:24:16:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Ensuring 1 failed segment(s) are stopped
20210908:15:24:16:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Updating configuration with new mirrors
20210908:15:24:16:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Updating mirrors
20210908:15:24:16:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Running pg_rewind on required mirrors
20210908:15:24:17:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Starting mirrors
20210908:15:24:17:012918 gprecoverseg:mdw:mxadmin-[INFO]:-era is 494476b1be478047_210908141632
20210908:15:24:17:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Commencing parallel segment instance startup, please wait...
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Process results...
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Triggering FTS probe
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-******************************************************************
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Updating segments for streaming is completed.
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-For segments updated successfully, streaming will continue in the background.
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Use  gpstate -s  to check the streaming progress.
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-******************************************************************
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-==============================END ANOTHER RECOVER==========================================
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-******************************************************************
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-The rebalance operation has completed successfully.
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-There is a resynchronization running in the background to bring all
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-segments in sync.
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-Use gpstate -e to check the resynchronization progress.
20210908:15:24:18:012918 gprecoverseg:mdw:mxadmin-[INFO]:-******************************************************************

После выполнения gprecoverseg -r выполните запрос в базе данных:

mxadmin=# select * from gp_segment_configuration order by content,dbid;
 dbid | content | role | preferred_role | mode | status | port | hostname | address |         datadir
-----+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1 |      -1 | p    | p              | n    | u      | 5432 | mdw      | mdw     | /mxdata/master/mxseg-1
    6 |      -1 | m    | m              | s    | u      | 5432 | smdw     | smdw    | /mxdata/standby/mxseg-1
    2 |       0 | p    | p              | n    | u      | 6000 | sdw1     | sdw1    | /mxdata/primary/mxseg0
    4 |       0 | m    | m              | n    | u      | 6001 | sdw2     | sdw2    | /mxdata/mirror/mxseg0
    3 |       1 | p    | p              | s    | u      | 6000 | sdw2     | sdw2    | /mxdata/primary/mxseg1
    5 |       1 | m    | m              | s    | u      | 6001 | sdw1     | sdw1    | /mxdata/mirror/mxseg1
(6 rows)

Видно, что роли пары segment с content=0 вернулись к первоначальному состоянию.

Подробное использование gprecoverseg см. в Документации

2. Восстановление узла master

При сбое узла master база данных перестаёт принимать подключения и становится недоступной. Единственный способ восстановления — активировать standby-узел в качестве нового master.

Примечание!
После сбоя master или при ручной остановке кластера графический интерфейс будет недоступен.

2.1 Активация standby

Метод активации:

[mxadmin@smdw ~]$ export PGPORT=5432
[mxadmin@smdw ~]$ export MASTER_DATA_DIRECTORY=/mxdata/standby/mxseg-1
[mxadmin@smdw ~]$ gpactivatestandby -d /mxdata/standby/mxseg-1
20210908:15:30:37:004123 gpactivatestandby:smdw:mxadmin-[DEBUG]:-Running Command: ps -ef | grep 'postgres -D /mxdata/standby/mxseg-1' | grep -v grep
20210908:15:30:37:004123 gpactivatestandby:smdw:mxadmin-[INFO]:------------------------------------------------------
20210908:15:30:37:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-Standby data directory    = /mxdata/standby/mxseg-1
20210908:15:30:37:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-Standby port              = 5432
20210908:15:30:37:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-Standby running           = yes
20210908:15:30:37:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-Force standby activation  = no
20210908:15:30:37:004123 gpactivatestandby:smdw:mxadmin-[INFO]:------------------------------------------------------
20210908:15:30:37:004123 gpactivatestandby:smdw:mxadmin-[DEBUG]:-Running Command: cat /tmp/.s.PGSQL.5432.lock
Do you want to continue with standby master activation? Yy|Nn (default=N):
> y
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[DEBUG]:-Running Command: ps -ef | grep 'postgres -D /mxdata/standby/mxseg-1' | grep -v grep
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-found standby postmaster process
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-Promoting standby...
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[DEBUG]:-Running Command: pg_ctl promote -D /mxdata/standby/mxseg-1
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[DEBUG]:-Waiting for connection...
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-Standby master is promoted
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-Reading current configuration...
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[DEBUG]:-Connecting to db template1 on host localhost
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:------------------------------------------------------
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-The activation of the standby master has completed successfully.
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-smdw is now the new primary master.
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-You will need to update your user access mechanism to reflect
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-the change of master hostname.
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-Do not re-start the failed master while the fail-over master is
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-operational, this could result in database corruption!
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-MASTER_DATA_DIRECTORY is now /mxdata/standby/mxseg-1 if
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-this has changed as a result of the standby master activation, remember
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-to change this in any startup scripts etc, that may be configured
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-to set this value.
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-MASTER_PORT is now 5432, if this has changed, you
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-may need to make additional configuration changes to allow access
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-to the Greenplum instance.
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-Refer to the Administrator Guide for instructions on how to re-activate
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-the master to its previous state once it becomes available.
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-Query planner statistics must be updated on all databases
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-following standby master activation.
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:-When convenient, run ANALYZE against all user databases.
20210908:15:30:39:004123 gpactivatestandby:smdw:mxadmin-[INFO]:------------------------------------------------------

После активации standby выполните запрос в базе данных — вы увидите, что бывший standby стал master, а новый standby не создан:

mxadmin=# select * from gp_segment_configuration order by content,dbid;
 dbid | content | role | preferred_role | mode | status | port | hostname | address |         datadir
-----+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    6 |      -1 | p    | p              | s    | u      | 5432 | smdw     | smdw    | /mxdata/standby/mxseg-1
    2 |       0 | p    | p              | s    | u      | 6000 | sdw1     | sdw1    | /mxdata/primary/mxseg0
    4 |       0 | m    | m              | s    | u      | 6001 | sdw2     | sdw2    | /mxdata/mirror/mxseg0
    3 |       1 | p    | p              | s    | u      | 6000 | sdw2     | sdw2    | /mxdata/primary/mxseg1
    5 |       1 | m    | m              | s    | u      | 6001 | sdw1     | sdw1    | /mxdata/mirror/mxseg1
(5 rows)

2.2 Инициализация standby

После того как standby стал master, необходимо создать для него новый standby-узел, чтобы предотвратить повторный сбой.

Для инициализации standby используется команда gpinitstandby.

Следующая команда инициализирует standby-узел с портом 5432 в директории /home/mxadmin/standby на хосте mdw:

[mxadmin@smdw ~]$ gpinitstandby -s mdw -S /home/mxadmin/standby -P 5432
20210908:15:38:54:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Validating environment and parameters for standby initialization...
20210908:15:38:55:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Checking for data directory /home/mxadmin/standby on mdw
20210908:15:38:55:004367 gpinitstandby:smdw:mxadmin-[INFO]:------------------------------------------------------
20210908:15:38:55:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Greenplum standby master initialization parameters
20210908:15:38:55:004367 gpinitstandby:smdw:mxadmin-[INFO]:------------------------------------------------------
20210908:15:38:55:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Greenplum master hostname               = smdw
20210908:15:38:55:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Greenplum master data directory         = /mxdata/standby/mxseg-1
20210908:15:38:55:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Greenplum master port                   = 5432
20210908:15:38:55:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Greenplum standby master hostname       = mdw
20210908:15:38:55:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Greenplum standby master port           = 5432
20210908:15:38:55:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Greenplum standby master data directory = /home/mxadmin/standby
20210908:15:38:55:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Greenplum update system catalog         = On
Do you want to continue with standby master initialization? Yy|Nn (default=N):
> y
20210908:15:38:56:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Syncing Greenplum Database extensions to standby
20210908:15:38:56:004367 gpinitstandby:smdw:mxadmin-[WARNING]:-Syncing of Greenplum Database extensions has failed.
20210908:15:38:56:004367 gpinitstandby:smdw:mxadmin-[WARNING]:-Please run gppkg --clean after successful standby initialization.
20210908:15:38:56:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Adding standby master to catalog...
20210908:15:38:56:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Database catalog updated successfully.
20210908:15:38:56:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Updating pg_hba.conf file...
20210908:15:38:58:004367 gpinitstandby:smdw:mxadmin-[INFO]:-pg_hba.conf files updated successfully.
20210908:15:38:59:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Starting standby master
20210908:15:38:59:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Checking if standby master is running on host: mdw  in directory: /home/mxadmin/standby
20210908:15:39:00:004367 gpinitstandby:smdw:mxadmin-[INFO]:-MasterStart pg_ctl cmd is env GPSESSID=0000000000 GPERA=None $GPHOME/bin/pg_ctl -D /home/mxadmin/standby -l /home/mxadmin/standby/log/startup.log -t 600 -o " -p 5432 -c gp_role=dispatch " start
20210908:15:39:01:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Cleaning up pg_hba.conf backup files...
20210908:15:39:02:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Backup files of pg_hba.conf cleaned up successfully.
20210908:15:39:02:004367 gpinitstandby:smdw:mxadmin-[INFO]:-Successfully created standby master on mdw

После инициализации выполните запрос — вы увидите, что новый standby-узел создан:

mxadmin=# select * from gp_segment_configuration order by content,dbid;
 dbid | content | role | preferred_role | mode | status | port | hostname | address |         datadir
-----+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    6 |      -1 | p    | p              | s    | u      | 5432 | smdw     | smdw    | /mxdata/standby/mxseg-1
    7 |      -1 | m    | m              | s    | u      | 5432 | mdw      | mdw     | /home/mxadmin/standby
    2 |       0 | p    | p              | s    | u      | 6000 | sdw1     | sdw1    | /mxdata/primary/mxseg0
    4 |       0 | m    | m              | s    | u      | 6001 | sdw2     | sdw2    | /mxdata/mirror/mxseg0
    3 |       1 | p    | p              | s    | u      | 6000 | sdw2     | sdw2    | /mxdata/primary/mxseg1
    5 |       1 | m    | m              | s    | u      | 6001 | sdw1     | sdw1    | /mxdata/mirror/mxseg1
(6 rows)

Подробности использования gpinitstandby см. в Документации

Подробное использование gpactivatestandby см. в Документации