GitHub

Запуск и остановка кластера

Павел Семёнов

Этот раздел описывает, как запустить, остановить и перезапустить кластер Greengage DB (на основе Greenplum).

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

  • gpstart — запуск кластера.

  • gpstop — остановка или перезапуск кластера, перезагрузка конфигурации.

Утилиты расположены в подкаталоге bin каталога установки Greengage DB ($GPHOME).

Запуск кластера

Вызов gpstart на мастер-хосте запускает инициализированный кластер Greengage DB:

$ gpstart
ПРИМЕЧАНИЕ

Вызов gpstart не требуется при первом запуске кластера после его инициализации с помощью gpinitsystem. Кластер запускается автоматически.

Эта команда проверяет окружение и выводит информацию о конфигурации кластера:

[INFO]:---------------------------
[INFO]:-Master instance parameters
[INFO]:---------------------------
[INFO]:-Database                 = template1
[INFO]:-Master Port              = 5432
[INFO]:-Master directory         = /data1/master/gpseg-1
[INFO]:-Timeout                  = 600 seconds
[INFO]:-Master standby start     = On
[INFO]:---------------------------------------
[INFO]:-Segment instances that will be started
[INFO]:---------------------------------------
[INFO]:-   Host   Datadir                 Port    Role
[INFO]:-   sdw1   /data1/primary/gpseg0   10000   Primary
[INFO]:-   sdw2   /data1/mirror/gpseg0    10500   Mirror
[INFO]:-   sdw1   /data1/primary/gpseg1   10001   Primary
[INFO]:-   sdw2   /data1/mirror/gpseg1    10501   Mirror
[INFO]:-   sdw2   /data1/primary/gpseg2   10000   Primary
[INFO]:-   sdw1   /data1/mirror/gpseg2    10500   Mirror
[INFO]:-   sdw2   /data1/primary/gpseg3   10001   Primary
[INFO]:-   sdw1   /data1/mirror/gpseg3    10501   Mirror

Введите y и нажмите Enter, чтобы подтвердить конфигурацию и продолжить запуск кластера. Чтобы запустить кластер без подтверждения, используйте параметр -a:

$ gpstart -a

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

[INFO]:-Database successfully started

По умолчанию gpstart использует до 64 процессов для параллельного запуска экземпляров. Чтобы изменить это число, используйте параметр -B:

$ gpstart -B 16

Запуск только мастера

Режим запуска только мастера (master-only) позволяет запустить мастер-экземпляр кластера, не запуская сегменты. Этот режим в основном используется для выполнения задач технического обслуживания, не затрагивающих хранимые данные.

Для запуска в режиме master-only вызовите gpstart с параметром -m на мастер-хосте:

$ gpstart -m

Введите y и нажмите Enter, чтобы подтвердить запуск.

ВНИМАНИЕ

Изменение системного каталога вручную может привести к несогласованности кластера. Используйте режим master-only с осторожностью.

Для выполнения обслуживания в режиме master-only:

  1. Запустите кластер в режиме только мастера:

    $ gpstart -m
  2. Подключитесь к базе данных мастера в служебном режиме:

    $ PGOPTIONS='-c gp_session_role=utility' psql postgres
  3. Выполните обслуживание.

  4. Остановите мастер:

    $ gpstop -m
  5. (Опционально) Запустите весь кластер:

    $ gpstart
РЕКОМЕНДАЦИЯ

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

$ gpstart -R

Остановка кластера

ВНИМАНИЕ

Не используйте команду kill для остановки экземпляров Greengage DB. Это может привести к повреждению данных и несогласованности кластера.

Чтобы остановить кластер Greengage DB, выполните gpstop на мастер-хосте:

$ gpstop

Команда выводит информацию об экземплярах, которые будут остановлены:

[INFO]:---------------------------------------------
[INFO]:-Master instance parameters
[INFO]:---------------------------------------------
[INFO]:-   Master Greengage instance process active PID   = 14255
[INFO]:-   Database                                       = template1
[INFO]:-   Master port                                    = 5432
[INFO]:-   Master directory                               = /data1/master/gpseg-1
[INFO]:-   Shutdown mode                                  = smart
[INFO]:-   Timeout                                        = 120
[INFO]:-   Shutdown Master standby host                   = On
[INFO]:---------------------------------------------
[INFO]:-Segment instances that will be shutdown:
[INFO]:---------------------------------------------
[INFO]:-   Host   Datadir                 Port    Status
[INFO]:-   sdw1   /data1/primary/gpseg0   10000   u
[INFO]:-   sdw2   /data1/mirror/gpseg0    10500   u
[INFO]:-   sdw1   /data1/primary/gpseg1   10001   u
[INFO]:-   sdw2   /data1/mirror/gpseg1    10501   u
[INFO]:-   sdw2   /data1/primary/gpseg2   10000   u
[INFO]:-   sdw1   /data1/mirror/gpseg2    10500   u
[INFO]:-   sdw2   /data1/primary/gpseg3   10001   u
[INFO]:-   sdw1   /data1/mirror/gpseg3    10501   u

Введите y и нажмите Enter, чтобы подтвердить остановку кластера. Чтобы остановить кластер без подтверждения, используйте параметр -a:

$ gpstop -a

Если остановка прошла успешно, в выводе появится сообщение:

[INFO]:-Database successfully shutdown with no errors reported

По умолчанию gpstop использует до 64 процессов для параллельной остановки экземпляров. Чтобы изменить это число, используйте параметр -B:

$ gpstop -B 16

Режимы остановки кластера

Greengage DB предоставляет три режима остановки кластера в контексте работы с активными транзакциями: smart, fast и immediate. Режим определяет, как обрабатываются активные транзакции и клиентские подключения во время остановки кластера.

Режимы остановки
Режим Команда Описание

Smart

gpstop

gpstop -M smart

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

Fast

gpstop -M fast

Выполняет откат активных транзакций, завершает клиентские подключения и корректно останавливает кластер

Immediate

gpstop -M immediate

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

  • Отправить SIGQUIT дочерним процессам Postgres и подождать их остановки.

  • Прервать оставшиеся процессы с помощью SIGKILL.

  • Остановить процесс мастер-экземпляра Greengage DB.

ВНИМАНИЕ

Использование режима остановки immediate может привести к повреждению базы данных и несогласованности кластера.

Типичная остановка кластера Greengage DB может проходить следующим образом:

  1. Попытайтесь остановить кластер в режиме smart:

    $ gpstop
  2. Если активные транзакции мешают остановке, завершите их, используя системные функции pg_cancel_backend() и pg_terminate_backend(). Узнайте больше в разделе Остановка клиентских запросов и процессов.

  3. Когда завершение клиентских подключений безопасно, продолжите остановку в режиме fast.

    $ gpstop -M fast

Остановка клиентских запросов и процессов

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

  • pg_cancel_backend() отменяет выполнение запроса по указанному идентификатору процесса (PID), оставляя открытым клиентское подключение.

  • pg_terminate_backend() принудительно завершает указанный процесс, закрывая связанное с ним клиентское подключение.

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

SELECT pg_cancel_backend(1234);
SELECT pg_terminate_backend(2345, 'Shutting down the server for maintenance.');

Идентификаторы активных клиентских процессов хранятся в системном представлении pg_stat_activity:

SELECT pid, usename, state, query FROM pg_stat_activity;

Результат выполнения этого запроса может выглядеть так:

 pid  | usename |        state        |                          query
------+---------+---------------------+----------------------------------------------------------
 7662 | gpadmin | active              | SELECT pid, usename, state, query FROM pg_stat_activity;
 7831 | alice   | idle in transaction | select count (*) from pg_settings;
(2 rows)

Пользуясь информацией из этого представления, вы можете остановить или прервать несколько процессов одним запросом:

  • Отменить выполнение всех текущих запросов:

    SELECT pg_cancel_backend(pid) FROM pg_stat_activity
    WHERE state = 'active' AND pid <> pg_backend_pid();
    ПРИМЕЧАНИЕ

    Условие pid <> pg_backend_pid() не позволяет запросу прервать свое собственное выполнение.

  • Прервать все клиентские подключения к указанной базе:

    SELECT pg_terminate_backend (pid) FROM pg_stat_activity
    WHERE pg_stat_activity.datname = '<database_name>';

    где <database_name> — имя базы данных.

Остановка сегментов на хосте

Для обслуживания единичного хоста вы можете остановить все сегменты, работающие на нем:

$ gpstop --host <hostname>

где <hostname> — имя сегмент-хоста.

Аргумент --host нужно указывать в соответствии с колонкой hostname таблицы gp_segment_configuration.

В результате выполнения этой команды:

  • Для каждого основного сегмента, работающего на этом хосте, соответствующий зеркальный сегмент становится основным.

  • Основные и зеркальные сегменты на этом хосте останавливаются.

ВАЖНО

Сегменты, работающие на хосте, нельзя отключить с помощью gpstop --host, если:

  • Зеркалирование сегментов отключено.

  • Зеркало основного сегмента, который будет остановлен, работает на том же хосте.

  • Основной сегмент, который будет остановлен, не синхронизирован со своим зеркалом.

  • На этом хосте работает основной или резервный мастер.

Перезапуск кластера

Для перезапуска кластера Greengage DB выполните gpstop с параметром -r на мастер-хосте:

$ gpstop -r

Эта команда останавливает все экземпляры, а затем запускает их заново.

РЕКОМЕНДАЦИЯ

Вы можете объединять несколько аргументов вызова в одну строку для краткости. Например, использовать gpstop -arM fast вместо gpstop -a -r -M fast для перезагрузки кластера с остановкой в режиме fast без подтверждения.

Перезагрузка конфигурации кластера

Чтобы применить изменения конфигурации без прерывания работы, выполните gpstop с параметром -u:

$ gpstop -u

Перезагрузка конфигурации используется, например, после изменения файлов конфигурации pg_hba.conf или postgresql.conf (только для параметров, изменяемых во время работы). Изменения применяются ко всем активным сессиям и не требуют переподключения.

ПРИМЕЧАНИЕ

Для применения параметров, которые нельзя изменить во время работы, требуется перезапуск с вызовом gpstop -r.

Проверка состояния кластера

Для отображения сводной информации о состоянии кластера используйте утилиту gpstate:

$ gpstate

Эта команда выводит общую информацию о кластере, например, суммарное число сегментов, процессов, ошибок и так далее.

[INFO]:-Starting gpstate with args:
[INFO]:-local Greengage Version: 'postgres (Greengage Database) 6.28.0+dev.1.g8552cb80e5 build dev'
[INFO]:-master Greengage Version: 'PostgreSQL 9.4.26 (Greengage Database 6.28.0+dev.1.g8552cb80e5 build dev) on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit compiled on Mar  7 2025 05:20:53'
[INFO]:-Obtaining Segment details from master...
[INFO]:-Gathering data from segments...
.
[INFO]:-Greengage instance status summary
[INFO]:-----------------------------------------------------
[INFO]:-   Master instance                                           = Active
[INFO]:-   Master standby                                            = smdw
[INFO]:-   Standby master state                                      = Standby host passive
[INFO]:-   Total segment instance count from metadata                = 16
[INFO]:-----------------------------------------------------
[INFO]:-   Primary Segment Status
[INFO]:-----------------------------------------------------
[INFO]:-   Total primary segments                                    = 8
[INFO]:-   Total primary segment valid (at master)                   = 8
[INFO]:-   Total primary segment failures (at master)                = 0
[INFO]:-   Total number of postmaster.pid files missing              = 0
[INFO]:-   Total number of postmaster.pid files found                = 8
[INFO]:-   Total number of postmaster.pid PIDs missing               = 0
[INFO]:-   Total number of postmaster.pid PIDs found                 = 8
[INFO]:-   Total number of /tmp lock files missing                   = 0
[INFO]:-   Total number of /tmp lock files found                     = 8
[INFO]:-   Total number postmaster processes missing                 = 0
[INFO]:-   Total number postmaster processes found                   = 8
[INFO]:-----------------------------------------------------
[INFO]:-   Mirror Segment Status
[INFO]:-----------------------------------------------------
[INFO]:-   Total mirror segments                                     = 8
[INFO]:-   Total mirror segment valid (at master)                    = 8
[INFO]:-   Total mirror segment failures (at master)                 = 0
[INFO]:-   Total number of postmaster.pid files missing              = 0
[INFO]:-   Total number of postmaster.pid files found                = 8
[INFO]:-   Total number of postmaster.pid PIDs missing               = 0
[INFO]:-   Total number of postmaster.pid PIDs found                 = 8
[INFO]:-   Total number of /tmp lock files missing                   = 0
[INFO]:-   Total number of /tmp lock files found                     = 8
[INFO]:-   Total number postmaster processes missing                 = 0
[INFO]:-   Total number postmaster processes found                   = 8
[INFO]:-   Total number mirror segments acting as primary segments   = 0
[INFO]:-   Total number mirror segments acting as mirror segments    = 8
[INFO]:-----------------------------------------------------

Чтобы просмотреть детальную информацию по каждому сегменту, добавьте параметр -s:

$ gpstate -s

Информация о кластере и мастер-экземпляре:

[INFO]:-Starting gpstate with args: -s
[INFO]:-local Greengage Version: 'postgres (Greengage Database) 6.28.0+dev.1.g8552cb80e5 build dev'
[INFO]:-master Greengage Version: 'PostgreSQL 9.4.26 (Greengage Database 6.28.0+dev.1.g8552cb80e5 build dev) on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit compiled on Mar  7 2025 05:20:53'
[INFO]:-Obtaining Segment details from master...
[INFO]:-Gathering data from segments...

[INFO]:-----------------------------------------------------
[INFO]:--Master Configuration & Status
[INFO]:-----------------------------------------------------
[INFO]:-   Master host                    = mdw
[INFO]:-   Master postgres process ID     = 2118
[INFO]:-   Master data directory          = /data1/master/gpseg-1
[INFO]:-   Master port                    = 5432
[INFO]:-   Master current role            = dispatch
[INFO]:-   Greengage initsystem version   = 6.28.0+dev.1.g8552cb80e5 build dev
[INFO]:-   Greengage current version      = PostgreSQL 9.4.26 (Greengage Database 6.28.0+dev.1.g8552cb80e5 build dev) on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit compiled on Mar  7 2025 05:20:53
[INFO]:-   Postgres version               = 9.4.26
[INFO]:-   Master standby                 = smdw
[INFO]:-   Standby master state           = Standby host passive

Информация о каждом сегменте в следующем формате:

[INFO]:-   Segment Info
[INFO]:-      Hostname                              = sdw1
[INFO]:-      Address                               = sdw1
[INFO]:-      Datadir                               = /data1/primary/gpseg0
[INFO]:-      Port                                  = 10000
[INFO]:-   Mirroring Info
[INFO]:-      Current role                          = Primary
[INFO]:-      Preferred role                        = Primary
[INFO]:-      Mirror status                         = Synchronized
[INFO]:-   Replication Info
[INFO]:-      Current write location                = 0/CFAB210
[INFO]:-      Bytes remaining to send to mirror     = 0
[INFO]:-   Status
[INFO]:-      PID                                   = 2757
[INFO]:-      Configuration reports status as       = Up
[INFO]:-      Database status                       = Up

Чтобы быстро увидеть потенциальные проблемы зеркалирования, вы можете вывести информацию о сегментах с такими проблемами с помощью опции -e:

$ gpstate -e
[INFO]:-----------------------------------------------------
[INFO]:-Segment Mirroring Status Report
[INFO]:-----------------------------------------------------
[INFO]:-Segments with Primary and Mirror Roles Switched
[INFO]:-   Current Primary   Port    Mirror   Port
[INFO]:-   sdw3              10500   sdw4     10000
[INFO]:-   sdw3              10501   sdw4     10001
[INFO]:-----------------------------------------------------
[INFO]:-Unsynchronized Segment Pairs
[INFO]:-   Current Primary   Port    WAL sync remaining bytes   Mirror   Port
[INFO]:-   sdw3              10000   Unknown                    sdw4     10500
[INFO]:-   sdw3              10001   Unknown                    sdw4     10501
[INFO]:-   sdw3              10500   Unknown                    sdw4     10000
[INFO]:-   sdw3              10501   Unknown                    sdw4     10001
[INFO]:-----------------------------------------------------
[INFO]:-Downed Segments (may include segments where status could not be retrieved)
[INFO]:-   Segment   Port    Config status   Status
[INFO]:-   sdw4      10500   Down            Down in configuration
[INFO]:-   sdw4      10501   Down            Down in configuration
[INFO]:-   sdw4      10000   Down            Down in configuration
[INFO]:-   sdw4      10001   Down            Down in configuration