Проверка и восстановление сегментов
Зеркалирование сегментов позволяет кластерам Greengage DB (на основе Greenplum) оставаться полностью доступными в случае отказа одного или нескольких сегментов. Когда сегмент выходит из строя, Greengage DB автоматически назначает его зеркало новым основным сегментом и продолжает обрабатывать пользовательские запросы. Транзакции, которые выполнялись в момент отказа, откатываются и автоматически перезапускаются после переключения на зеркало. Как следствие, сбои сегментов могут проходить незаметно для пользователей, если их зеркала продолжают работать.
Однако такие сбои могут привести к снижению производительности, поскольку кластер переходит в несбалансированное состояние. Некоторые сегмент-хосты начинают обрабатывать больший объем данных и выполнять больше операций, чем другие. Кроме того, кластер теряет часть вычислительных ресурсов.
Чтобы вернуть кластеру оптимальную производительность, отказоустойчивость и балансировку, необходимо восстановить вышедшие из строя сегменты и обеспечить равномерное распределение данных.
В этом разделе описано, как проверить и восстановить вышедшие из строя сегменты в кластере Greengage DB.
Проверка вышедших из строя сегментов
В этом разделе описано, как обнаружить вышедшие из строя сегменты в кластере Greengage DB.
Утилита gpstate
Утилита gpstate
имеет параметр -e
, который отображает информацию о сегментах с возможными проблемами зеркалирования:
-
Смена ролей между основными и зеркальными сегментами.
-
Несинхронизированные пары основных и зеркальных сегментов.
-
Сегменты в состоянии отказа (статус
down
).
$ gpstate -e
Пример вывода с проблемами зеркалирования:
[INFO]:----------------------------------------------------- [INFO]:-Segment Mirroring Status Report [INFO]:----------------------------------------------------- [INFO]:-Segments with Primary and Mirror Roles Switched [INFO]:- Current Primary Port Mirror Port [INFO]:- sdw1 11000 sdw2 10000 [INFO]:- sdw1 11001 sdw2 10001 [INFO]:----------------------------------------------------- [INFO]:-Unsynchronized Segment Pairs [INFO]:- Current Primary Port WAL sync remaining bytes Mirror Port [INFO]:- sdw1 10000 Unknown sdw2 11000 [INFO]:- sdw1 10001 Unknown sdw2 11001 [INFO]:- sdw1 11000 Unknown sdw2 10000 [INFO]:- sdw1 11001 Unknown sdw2 10001 [INFO]:----------------------------------------------------- [INFO]:-Downed Segments (may include segments where status could not be retrieved) [INFO]:- Segment Port Config status Status [INFO]:- sdw2 11000 Down Down in configuration [INFO]:- sdw2 11001 Down Down in configuration [INFO]:- sdw2 10000 Down Down in configuration [INFO]:- sdw2 10001 Down Down in configuration
Если проблем не обнаружено, вывод заканчивается следующим сообщением:
[INFO]:-All segments are running normally
Таблицы gp_segment_configuration и gp_configuration_history
Таблица системного каталога gp_segment_configuration
содержит метаданные обо всех сегментах кластера, включая их текущее состояние.
Сегменты, которые вышли из строя, имеют значение d
(down) в столбце status
.
Получить информацию об отказах сегментов можно с помощью следующего запроса:
SELECT * FROM gp_segment_configuration WHERE status='d';
Пример результата:
dbid | content | role | preferred_role | mode | status | port | hostname | address | datadir ------+---------+------+----------------+------+--------+-------+----------+---------+----------------------- 6 | 0 | m | m | n | d | 11000 | sdw2 | sdw2 | /data1/mirror/gpseg0 7 | 1 | m | m | n | d | 11001 | sdw2 | sdw2 | /data1/mirror/gpseg1 4 | 2 | m | p | n | d | 10000 | sdw2 | sdw2 | /data1/primary/gpseg2 5 | 3 | m | p | n | d | 10001 | sdw2 | sdw2 | /data1/primary/gpseg3 (4 rows)
Обратите внимание, что отказавшие сегменты, назначенные основными в конфигурации (значение preferred_role
равно p
), автоматически становятся зеркалами после отказа.
Еще одна таблица системного каталога — gp_configuration_history
— хранит историю изменений конфигурации сегментов, включая смену ролей и статусов, вместе с временными метками.
Эта информация может быть полезной при расследовании сложных инцидентов.
Например, такой запрос находит события, которые произошли между указанными датами:
SELECT * FROM gp_configuration_history WHERE time BETWEEN '2025-04-29' AND '2025-04-30';
Пример строки таблицы gp_configuration_history
:
time | dbid | desc -------------------------------+------+------------------------------------------------------------------------------- 2025-04-29 04:38:18.248111+00 | 9 | FTS: update role, status, and mode for dbid 9 with contentid 3 to m, u, and s
Лог-файлы
Утилита gplogfilter
выполняет поиск в логах Greengage DB по заданным критериям.
Подробная информация о логах Greengage DB приведена в статье Логирование.
При использовании параметра -t
(--trouble
) утилита фильтрует записи типов ERROR
, FATAL
и PANIC
.
Они часто указывают на сбои сегментов или другие серьезные проблемы.
-
Чтобы проверить логи мастер-экземпляра:
$ gplogfilter -t
Для анализа конкретного лог-файла передайте путь к нему в качестве аргумента:
$ gplogfilter -t $MASTER_DATA_DIRECTORY/pg_log/gpdb-2025-03-31_064402.csv
Чтобы сохранить отфильтрованный вывод в файле для последующего анализа, используйте параметр
-o
(--out
):$ gplogfilter -t -o master_issues
-
Чтобы проверить логи сегментов, используйте
gpssh
для выполнения одной и той же командыgplogfilter
на всех сегмент-хостах. Например, для поиска в pg_log внутри каталогов данных сегментов:$ gpssh -f hostfile_segment_hosts -e " \ source /usr/local/gpdb/greengage_path.sh && \ gplogfilter /data1/*/*/pg_log/gpdb*.csv \ --trouble"
где
<hostfile_segment_hosts>
— это список сегмент-хостов кластера.Чтобы сохранить вывод логов сегментов для анализа на мастер-хосте, перенаправьте вывод
gpssh
в файл:$ gpssh -f hostfile_segment_hosts -e " \ source /usr/local/gpdb/greengage_path.sh && \ gplogfilter /data1/*/*/pg_log/gpdb*.csv \ --trouble" > segment_issues
Восстановление отказавших сегментов
После обнаружения сбоя сегмента в кластере определите его причину, чтобы выбрать подходящую стратегию восстановления.
Если причина сбоя временная, например кратковременный сбой системы или разрыв сетевого соединения, восстановление сегментов часто возможно на исходном хосте после перезагрузки или перезапуска соответствующих служб. Это называется восстановлением на месте (in-place recovery).
Однако в более серьезных случаях, например при аппаратном сбое, исходный хост может быть недоступен или непригоден к использованию. Для восстановления в таких ситуациях необходимо перенести отказавшие сегменты на другие хосты: существующие в кластере или новые.
После выявления причин сбоя и выбора сценария восстановления вы можете использовать утилиту gprecoverseg
для восстановления отказавших сегментов, как описано в этом разделе.
Типы восстановления после сбоя
СУБД Greengage поддерживает три типа восстановления сегментов после сбоя для различных сценариев:
-
Инкрементальное восстановление. Это метод по умолчанию для восстановления на месте. Greengage DB определяет различия между отказавшим сегментом и его исправным зеркалом, анализируя их WAL-файлы. Затем недостающие транзакции воспроизводятся с помощью утилиты
pg_rewind
, чтобы синхронизировать сегмент. Этот метод эффективный и быстрый, так как не требует полной передачи данных. Если при инкрементальном восстановлении сегмента происходит ошибка, требуется дифференциальное или полное восстановление. -
Дифференциальное восстановление. Этот метод использует утилиту
rsync
для сравнения файловых систем отказавшего сегмента и его исправного зеркала. На целевой сегмент копируются только измененные файлы. Дифференциальное восстановление похоже на полное восстановление, но работает быстрее при восстановлении на месте, так как передает меньше данных. Используется, если инкрементное восстановление невозможно, но хочется избежать копирования полного объема данных. -
Полное восстановление. Создает новый каталог данных сегмента с нуля, используя полную копию данных зеркала. Копирование выполняется с помощью утилиты
pg_basebackup
. При полном восстановлении на месте существующий каталог данных отказавшего сегмента удаляется. Это единственный возможный метод для переноса сегментов на другой хост, как на существующий в кластере, так и на новый.
Применимость типов восстановления по сценариям:
-
Восстановление на месте: инкрементальное, дифференциальное или полное.
-
Восстановление на другой хост в кластере: только полное.
-
Восстановление на новый хост: только полное.
Общий порядок действий
Для восстановления сегмента используйте следующий базовый порядок действий:
-
Оцените, хотите ли вы восстановить сегмент на исходном хосте. Если нет или восстановление на месте невозможно, переходите сразу к последнему шагу.
-
После устранения проблемы на отказавшем хосте попытайтесь выполнить инкрементальное восстановление.
-
Если инкрементальное восстановление не удалось, попробуйте дифференциальное восстановление на месте.
-
Если ни инкрементальное, ни дифференциальное восстановление не сработало, выполните полное восстановление. Это можно сделать либо на месте, либо на другом хосте (внутри кластера или новом).
Восстановление на месте
Чтобы восстановить все отказавшие сегменты на их исходных хостах (in-place), выполните инкрементальное восстановление:
-
Запустите
gprecoverseg
:$ gprecoverseg
Greengage DB планирует восстановление и выводит подробности для каждого сегмента, подлежащего восстановлению:
[INFO]:---------------------------------------------------------- [INFO]:-Recovery 1 of 4 [INFO]:---------------------------------------------------------- [INFO]:- Synchronization mode = Incremental [INFO]:- Failed instance host = sdw2 [INFO]:- Failed instance address = sdw2 [INFO]:- Failed instance directory = /data1/mirror/gpseg0 [INFO]:- Failed instance port = 11000 [INFO]:- Recovery Source instance host = sdw1 [INFO]:- Recovery Source instance address = sdw1 [INFO]:- Recovery Source instance directory = /data1/primary/gpseg0 [INFO]:- Recovery Source instance port = 10000 [INFO]:- Recovery Target = in-place
-
Введите
y
и нажмитеEnter
для подтверждения восстановления:Continue with segment recovery procedure Yy|Nn (default=N):
ПРИМЕЧАНИЕЧтобы запустить восстановление без подтверждения, добавьте опцию
-a
:$ gprecoverseg -a
После успешного восстановления будут показаны следующие строки:
[INFO]:-******************************** [INFO]:-Segments successfully recovered. [INFO]:-******************************** [INFO]:-Recovered mirror segments need to sync WAL with primary segments. [INFO]:-Use 'gpstate -e' to check progress of WAL sync remaining bytes
Для оптимальной производительности выполните балансировку кластера, чтобы вернуть сегменты к их предпочтительным ролям.
Частичное восстановление на месте
Greengage DB поддерживает частичное восстановление на месте, при котором восстанавливается только часть отказавших сегментов. Это полезно, например, если несколько сегмент-хостов вышли из строя и не все из них вернулись к работе.
Для частичного восстановления необходим файл конфигурации восстановления.
Этот файл содержит список расположений сегментов, которые требуется восстановить за один вызов gprecoverseg
.
Файл можно сгенерировать с помощью gprecoverseg
или подготовить вручную в соответствии с описанной ниже структурой.
Чтобы создать шаблон файла конфигурации восстановления, выполните gprecoverseg
с параметром -o
, указав имя файла:
$ gprecoverseg -o recover_conf_file
Сгенерированный файл построчно описывает все отказавшие сегменты в следующем формате:
failedAddress|failedPort|failedDataDirectory
или
failedHostname|failedAddress|failedPort|failedDataDirectory
Закомментируйте с помощью #
или удалите строки сегментов, которые не нужно восстанавливать.
Затем выполните восстановление оставшихся сегментов:
-
Запустите
gprecoverseg
, передав имя файла в опции-i
:$ gprecoverseg -i recover_conf_file
Greengage DB спланирует восстановление и выведет информацию для каждого сегмента, который будет восстановлен.
[INFO]:---------------------------------------------------------- [INFO]:-Recovery 1 of 2 [INFO]:---------------------------------------------------------- [INFO]:- Synchronization mode = Incremental [INFO]:- Failed instance host = sdw2 [INFO]:- Failed instance address = sdw2 [INFO]:- Failed instance directory = /data1/mirror/gpseg0 [INFO]:- Failed instance port = 11000 [INFO]:- Recovery Source instance host = sdw1 [INFO]:- Recovery Source instance address = sdw1 [INFO]:- Recovery Source instance directory = /data1/primary/gpseg0 [INFO]:- Recovery Source instance port = 10000 [INFO]:- Recovery Target = in-place
-
Введите
y
и нажмитеEnter
для подтверждения восстановления:Continue with segment recovery procedure Yy|Nn (default=N):
После успешного восстановления будут показаны следующие строки:
[INFO]:-******************************** [INFO]:-Segments successfully recovered. [INFO]:-******************************** [INFO]:-Recovered mirror segments need to sync WAL with primary segments. [INFO]:-Use 'gpstate -e' to check progress of WAL sync remaining bytes
После завершения частичного восстановления:
-
Выполните балансировку кластера, чтобы вернуть восстановленные сегменты к предпочтительным ролям.
-
Восстановите остальные отказавшие сегменты, чтобы вернуть кластер к полностью рабочему состоянию.
Полное и дифференциальное восстановление на месте
Если каталоги данных или файлы отказавших сегментов повреждены, инкрементальное восстановление может быть невозможно. В таком случае используйте полное восстановление, чтобы создать сегмент заново.
Для выполнения полного восстановления используйте параметр -F
команды gprecoverseg
:
$ gprecoverseg -F
При полном восстановлении на месте существующий каталог данных удаляется и заменяется новой копией с зеркального сегмента. Любые пользовательские файлы или каталоги, находившиеся в исходном расположении сегмента, будут утрачены и не восстановятся.
Если данные были повреждены или утрачены частично, дифференциальное восстановление может быть более быстрым вариантом, так как передает только измененные файлы:
$ gprecoverseg -differential
Оба типа восстановления — полное и дифференциальное — можно выполнять для отдельных сегментов с помощью файла конфигурации восстановления:
$ gprecoverseg -F -i recover_conf_file
Восстановление на другом хосте
Если сегменты невозможно восстановить на исходных хостах, их можно временно перенести на другие хосты кластера. В этом случае требуется полное восстановление, так как на новых хостах отсутствуют данные этих сегментов.
Для восстановления на другом хосте необходимо подготовить файл конфигурации восстановления, в котором указаны новые расположения для отказавших сегментов.
Вы можете сгенерировать этот файл с помощью утилиты gprecoverseg
или создать его вручную в соответствии с описанной ниже структурой.
Чтобы создать шаблон с новыми расположениями сегментов, выполните команду gprecoverseg
с двумя параметрами:
-
-o
— имя выходного файла. -
-p
— целевой хост, на который будут восстановлены отказавшие сегменты.
$ gprecoverseg -o recover_out -p sdw3
Обычно рекомендуется восстанавливать сегменты на одном хосте за раз. Однако можно указать несколько хостов через запятую:
$ gprecoverseg -o recover_out -p sdw3,sdw4
Сгенерированный файл содержит список отказавших сегментов и их новых расположений на указанных хостах. Каждая строка имеет следующую структуру:
failedAddress|failedPort|failedDataDirectory newAddress|newPort|newDataDirectory
или
failedHostname|failedAddress|failedPort|failedDataDirectory newHostname|newAddress|newPort|newDataDirectory
Обратите внимание, что между информацией об исходном сегменте и о его новом расположении должен быть пробел.
Чтобы задать собственные расположения для восстановления, отредактируйте соответствующие строки файла.
Для частичного восстановления закомментируйте ненужные строки с помощью #
или удалите их.
Для обеспечения отказоустойчивости убедитесь, что ни один основной сегмент не размещается на одном хосте со своим зеркалом.
Выполните восстановление:
-
Запустите
gprecoverseg
, передав имя файла в опции-i
:$ gprecoverseg -i recover_conf_file
Greengage DB спланирует восстановление и выведет информацию для каждого сегмента, который будет восстановлен.
[INFO]:---------------------------------------------------------- [INFO]:-Recovery 1 of 4 [INFO]:---------------------------------------------------------- [INFO]:- Synchronization mode = Full [INFO]:- Failed instance host = sdw2 [INFO]:- Failed instance address = sdw2 [INFO]:- Failed instance directory = /data1/mirror/gpseg0 [INFO]:- Failed instance port = 11000 [INFO]:- Recovery Source instance host = sdw1 [INFO]:- Recovery Source instance address = sdw1 [INFO]:- Recovery Source instance directory = /data1/primary/gpseg0 [INFO]:- Recovery Source instance port = 10000 [INFO]:- Recovery Target instance host = sdw3 [INFO]:- Recovery Target instance address = sdw3 [INFO]:- Recovery Target instance directory = /data1/mirror/gpseg0 [INFO]:- Recovery Target instance port = 10000
-
Введите
y
и нажмитеEnter
для подтверждения восстановления:Continue with segment recovery procedure Yy|Nn (default=N):
После успешного восстановления будут показаны следующие строки:
[INFO]:-******************************** [INFO]:-Segments successfully recovered. [INFO]:-******************************** [INFO]:-Recovered mirror segments need to sync WAL with primary segments. [INFO]:-Use 'gpstate -e' to check progress of WAL sync remaining bytes
После завершения восстановления:
-
Выполните балансировку кластера, чтобы вернуть восстановленные сегменты к предпочтительным ролям.
-
Восстановите остальные отказавшие сегменты, чтобы вернуть кластер к полностью рабочему состоянию.
Балансировка кластера
После сбоя сегмента кластер переходит в несбалансированное состояние. Зеркала отказавших сегментов становятся основными сегментами и начинают обрабатывать пользовательские запросы. Это увеличивает нагрузку на соответствующие хосты.
После восстановления отказавших сегментов Greengage DB возвращает их в качестве зеркал, в то время как их бывшие зеркала остаются основными сегментами. Таким образом, кластер остается работоспособным, но его конфигурация больше не соответствует исходной.
Проверить состояние дисбаланса можно с помощью gpstate
:
-
gpstate -m
: наличие сегментов со статусомActing as primary
.[INFO]:-------------------------------------------------------------- [INFO]:--Current GPDB mirror list and status [INFO]:--Type = Group [INFO]:-------------------------------------------------------------- [INFO]:- Mirror Datadir Port Status Data Status [INFO]:- sdw2 /data1/mirror/gpseg0 10000 Passive Synchronized [INFO]:- sdw2 /data1/mirror/gpseg1 10001 Passive Synchronized [INFO]:- sdw1 /data1/mirror/gpseg2 11000 Acting as Primary Synchronized [INFO]:- sdw1 /data1/mirror/gpseg3 11001 Acting as Primary Synchronized [INFO]:--------------------------------------------------------------
-
gpstate -e
: секцияSegments with Primary and Mirror Roles Switched
.[INFO]:----------------------------------------------------- [INFO]:-Segments with Primary and Mirror Roles Switched [INFO]:- Current Primary Port Mirror Port [INFO]:- sdw1 11000 sdw2 10000 [INFO]:- sdw1 11001 sdw2 10001
Чтобы вернуть все сегменты к их исходным (предпочтительным) ролям:
-
Выполните
gprecoverseg
с опцией-r
:$ gprecoverseg -r
Greengage DB выведет информацию о каждом сегменте, который требуется вернуть к исходной роли:
[INFO]:---------------------------------------------------------- [INFO]:-Unbalanced segment 1 of 4 [INFO]:---------------------------------------------------------- [INFO]:- Unbalanced instance host = sdw1 [INFO]:- Unbalanced instance address = sdw1 [INFO]:- Unbalanced instance directory = /data1/mirror/gpseg2 [INFO]:- Unbalanced instance port = 11000 [INFO]:- Balanced role = Mirror [INFO]:- Current role = Primary
-
Введите
y
и нажмитеEnter
для подтверждения балансировки:Continue with segment rebalance procedure Yy|Nn (default=N):
После успешного завершения выводится следующая строка:
[INFO]:-The rebalance operation has completed successfully.
Чтобы убедиться, что все сегменты вернулись к исходным ролям, повторно выполните gpstate -e
:
$ gpstate -e
В конце вывода должно быть сообщение:
[INFO]:-All segments are running normally