Базовое использование PgDoorman

PgDoorman -- пулер соединений PostgreSQL, основанный на PgCat. В этом руководстве описаны конфигурация, эксплуатация и администрирование.

Параметры командной строки

PgDoorman поддерживает несколько параметров командной строки для настройки поведения при запуске:

$ pg_doorman --help

PgDoorman: Nextgen PostgreSQL Pooler (based on PgCat)

Usage: pg_doorman [OPTIONS] [CONFIG_FILE] [COMMAND]

Commands:
  generate  Generate configuration for pg_doorman by connecting to PostgreSQL and auto-detecting databases and users
  help      Print this message or the help of the given subcommand(s)

Arguments:
  [CONFIG_FILE]  [env: CONFIG_FILE=] [default: pg_doorman.toml]

Options:
  -l, --log-level <LOG_LEVEL>    [env: LOG_LEVEL=] [default: INFO]
  -F, --log-format <LOG_FORMAT>  [env: LOG_FORMAT=] [default: text] [possible values: text, structured, debug]
  -n, --no-color                 disable colors in the log output [env: NO_COLOR=]
  -d, --daemon                   run as daemon [env: DAEMON=]
  -h, --help                     Print help
  -V, --version                  Print version

Доступные параметры

ПараметрОписание
-d, --daemonЗапуск в фоне. Без этого параметра процесс работает на переднем плане.

В daemon-режиме обязательны daemon_pid_file и syslog_prog_name. После ухода в фон сообщения в stderr больше не пишутся.
-l, --log-levelУровень логирования: INFO, DEBUG или WARN.
-F, --log-formatФормат логов. Возможные значения: text, structured, debug.
-n, --no-colorОтключить цвета в выводе логов.
-V, --versionПоказать информацию о версии.
-h, --helpПоказать справку.

Установка и настройка

Структура файла конфигурации

PgDoorman поддерживает форматы YAML и TOML. Для новых установок рекомендуется YAML. Конфигурация разбита на несколько секций:

general:        # Глобальные настройки сервиса PgDoorman
pools:
  <name>:       # Настройки конкретного пула базы данных
    users:
      - ...     # Настройки пользователя для этого пула

Important

Некоторые параметры обязательно должны быть указаны в файле конфигурации, чтобы PgDoorman запустился, даже если у них есть значения по умолчанию. Например, для доступа к admin-консоли нужно указать admin username и password.

Минимальный пример конфигурации

Минимальный пример конфигурации для старта:

YAML (рекомендуется)

general:
  host: "0.0.0.0"         # Слушать на всех интерфейсах
  port: 6432               # Порт для клиентских соединений
  admin_username: "admin"
  admin_password: "admin"  # Поменяйте это в production!

pools:
  exampledb:
    server_host: "127.0.0.1"  # Адрес сервера PostgreSQL
    server_port: 5432          # Порт сервера PostgreSQL
    pool_mode: "transaction"   # Режим пулинга
    users:
      - pool_size: 40
        username: "doorman"
        password: "SCRAM-SHA-256$4096:6nD+Ppi9rgaNyP7...MBiTld7xJipwG/X4="

TOML

[general]
host = "0.0.0.0"
port = 6432
admin_username = "admin"
admin_password = "admin"

[pools.exampledb]
server_host = "127.0.0.1"
server_port = 5432
pool_mode = "transaction"

[pools.exampledb.users.0]
pool_size = 40
username = "doorman"
password = "SCRAM-SHA-256$4096:6nD+Ppi9rgaNyP7...MBiTld7xJipwG/X4="

Полный список параметров конфигурации можно получить командой pg_doorman generate --reference --output ref.yaml -- она генерирует аннотированный конфиг со всеми параметрами и значениями по умолчанию.

Автоматическая генерация конфигурации

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

# Посмотреть все доступные опции
pg_doorman generate --help

# Сгенерировать YAML-конфиг (рекомендуется)
pg_doorman generate --output pg_doorman.yaml

# Сгенерировать TOML-конфиг (для обратной совместимости)
pg_doorman generate --output pg_doorman.toml

# Сгенерировать reference-конфиг со всеми настройками (без подключения к PG)
pg_doorman generate --reference --output pg_doorman.yaml

# Сгенерировать reference-конфиг с русскими комментариями для быстрого старта
pg_doorman generate --reference --ru --output pg_doorman.yaml

# Сгенерировать конфиг без комментариев (plain serialization)
pg_doorman generate --no-comments --output pg_doorman.yaml

Команда generate поддерживает несколько опций:

ОпцияОписание
--hostХост PostgreSQL для подключения (если не указано, используется localhost)
--port, -pПорт PostgreSQL для подключения (по умолчанию: 5432)
--user, -uПользователь PostgreSQL для подключения (нужны привилегии superuser, чтобы читать pg_shadow)
--passwordПароль PostgreSQL для подключения
--database, -dБаза данных PostgreSQL для подключения (если не указано, используется имя пользователя)
--sslПодключение к серверу PostgreSQL по SSL/TLS
--pool-sizeРазмер пула в сгенерированной конфигурации (по умолчанию: 40)
--session-pool-mode, -sСессионный режим пулинга в сгенерированной конфигурации
--output, -oФайл для сгенерированной конфигурации (если не указан, используется stdout)
--server-hostПереопределить server_host в конфиге (если не указано, используется значение --host)
--no-commentsОтключить inline-комментарии в сгенерированной конфигурации (по умолчанию они включены)
--referenceСгенерировать полный reference-конфиг с примерами значений, без подключения к PG
--russian-comments, --ruСгенерировать комментарии на русском для быстрого старта
--format, -fФормат вывода: yaml (по умолчанию) или toml. Если задан --output, формат определяется по расширению файла. Этот флаг переопределяет автоопределение

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

Переменные окружения PostgreSQL

Команда generate также учитывает стандартные переменные окружения PostgreSQL: PGHOST, PGPORT, PGUSER, PGPASSWORD и PGDATABASE.

Passthrough Authentication (по умолчанию)

PgDoorman по умолчанию использует passthrough authentication: криптографическое доказательство клиента (MD5-хэш или SCRAM ClientKey) автоматически переиспользуется для аутентификации в backend-сервере PostgreSQL. Plaintext-пароли в конфиге не нужны -- достаточно записать в password хэш из pg_shadow / pg_authid.

Указывайте server_username и server_password только тогда, когда backend-пользователь отличается от username пула (например, маппинг username или JWT-аутентификация):

users:
  - username: "app_user"              # имя для клиента
    password: "md5..."                # хэш для аутентификации клиента
    server_username: "pg_app_user"    # другой backend-пользователь PostgreSQL
    server_password: "real_password"  # plaintext-пароль для этого пользователя

Подробнее см. описания полей server_username и server_password в сгенерированном reference-конфиге.

Привилегии superuser

Чтение информации о пользователях из PostgreSQL требует привилегий superuser, чтобы получить доступ к таблице pg_shadow.

Контроль доступа клиентов (pg_hba)

PgDoorman может применять правила доступа клиентов в стиле PostgreSQL pg_hba.conf через параметр general.pg_hba. Правила можно встроить прямо в конфиг или сослаться на путь к файлу. Полные примеры -- в reference-разделе.

Trust-режим: когда правило использует trust, PgDoorman принимает соединения без запроса пароля у клиента -- зеркально поведению PostgreSQL. Учитываются TLS-зависимые типы правил: hostssl требует TLS, hostnossl его запрещает.

Запуск PgDoorman

После создания файла конфигурации запустите PgDoorman из командной строки:

$ pg_doorman pg_doorman.toml

Если файл конфигурации не указан, PgDoorman будет искать pg_doorman.toml в текущей директории.

Подключение к PostgreSQL через PgDoorman

После запуска PgDoorman подключайтесь к нему вместо прямого подключения к PostgreSQL:

$ psql -h localhost -p 6432 -U doorman exampledb

Строку подключения вашего приложения нужно изменить так, чтобы она указывала на PgDoorman, а не напрямую на PostgreSQL:

postgresql://doorman:password@localhost:6432/exampledb

PgDoorman прозрачно обработает пулинг соединений, поэтому приложению не нужно знать, что оно подключается через пулер.

Администрирование

Admin-консоль

PgDoorman предоставляет административный интерфейс через специальную базу данных pgdoorman (или pgbouncer для обратной совместимости):

$ psql -h localhost -p 6432 -U admin pgdoorman

После подключения можно посмотреть доступные команды:

pgdoorman=> SHOW HELP;
NOTICE:  Console usage
DETAIL:
	SHOW HELP|CONFIG|DATABASES|POOLS|POOLS_EXTENDED|POOLS_MEMORY|POOL_COORDINATOR|POOL_SCALING
	SHOW CLIENTS|SERVERS|USERS|CONNECTIONS|STATS|PREPARED_STATEMENTS|AUTH_QUERY
	SHOW LISTS|SOCKETS|LOG_LEVEL|VERSION
	SET log_level = '<filter>'
	RELOAD
	SHUTDOWN
	UPGRADE
	PAUSE [db]
	RESUME [db]
	RECONNECT [db]

Совместимость протокола

Admin-консоль на данный момент поддерживает только simple query protocol. Некоторые драйверы баз данных используют extended query protocol для всех команд, что делает их непригодными для работы с admin-консолью. В таких случаях используйте клиент psql для администрирования.

Безопасность

Войти в admin-консоль может только пользователь, указанный в admin_username файла конфигурации. Если это разрешено правилами general.pg_hba, в admin-консоль можно входить методом trust (без запроса пароля), например:

# Разрешить только локальному admin доступ к admin-БД без пароля
host  pgdoorman  admin  127.0.0.1/32  trust

Используйте trust с предельной осторожностью. Всегда ограничивайте по адресу и, по возможности, требуйте TLS через hostssl. В production предпочитайте методы с паролями, если только не понимаете последствия полностью.

Мониторинг PgDoorman

Admin-консоль предоставляет несколько команд для мониторинга текущего состояния PgDoorman:

  • SHOW STATS -- посмотреть статистику производительности.
  • SHOW CLIENTS -- список текущих клиентских соединений.
  • SHOW SERVERS -- список текущих серверных соединений.
  • SHOW POOLS -- состояние пулов соединений.
  • SHOW DATABASES -- список настроенных баз данных.
  • SHOW USERS -- список настроенных пользователей.

Эти команды подробно описаны в разделе Команды admin-консоли ниже.

Перечитывание конфигурации

Если вы изменили pg_doorman.toml, изменения можно применить без перезапуска сервиса:

pgdoorman=# RELOAD;

При перечитывании конфигурации:

  1. PgDoorman читает обновлённый файл конфигурации.
  2. Обнаруживаются изменения параметров подключения к базам.
  3. Существующие серверные соединения закрываются при следующем возврате в пул (в соответствии с режимом пулинга).
  4. Новые серверные соединения сразу используют обновлённые параметры.

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

Команды admin-консоли

Admin-консоль предоставляет набор команд для мониторинга и управления PgDoorman. Команды используют SQL-подобный синтаксис и могут выполняться из любого PostgreSQL-клиента, подключённого к admin-консоли.

SHOW-команды

SHOW-команды отображают информацию о работе PgDoorman. Каждая команда даёт свой срез данных о производительности и текущем состоянии пулера.

SHOW STATS

SHOW STATS показывает развёрнутую статистику работы PgDoorman:

pgdoorman=> SHOW STATS;

Статистика приводится для каждой пары (database, user):

МетрикаОписание
databaseИмя базы данных
userИмя пользователя
total_xact_countВсего SQL-транзакций с момента запуска
total_query_countВсего SQL-команд с момента запуска
total_receivedВсего байт получено от клиентов
total_sentВсего байт отправлено клиентам
total_xact_timeВсего микросекунд в транзакциях (включая idle in transaction)
total_query_timeВсего микросекунд на выполнение запросов
total_wait_timeВсего микросекунд клиенты ждали серверного соединения
total_errorsВсего ошибок с момента запуска
avg_xact_countСреднее число транзакций в секунду за последние 15 секунд
avg_query_countСреднее число запросов в секунду за последние 15 секунд
avg_recvСреднее число байт в секунду, получаемых от клиентов
avg_sentСреднее число байт в секунду, отправляемых клиентам
avg_errorsСреднее число ошибок в секунду за последние 15 секунд
avg_xact_timeСредняя длительность транзакции в микросекундах
avg_query_timeСредняя длительность запроса в микросекундах
avg_wait_timeСреднее время ожидания сервера в микросекундах

Мониторинг производительности

Особое внимание обращайте на метрику avg_wait_time. Если её значение стабильно высокое, это может означать, что размер пула слишком мал для вашей нагрузки.

SHOW SERVERS

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

pgdoorman=> SHOW SERVERS;
КолонкаОписание
server_idУникальный идентификатор серверного соединения
server_process_idPID backend-процесса PostgreSQL (если доступен)
database_nameИмя базы данных, к которой подключено соединение
userUsername, под которым PgDoorman подключается к серверу PostgreSQL
application_nameЗначение параметра application_name, выставленное на серверном соединении
stateТекущее состояние соединения: active, idle или used
waitСостояние ожидания соединения: idle, read или write
transaction_countСколько транзакций обработало это соединение
query_countСколько запросов обработало это соединение
bytes_sentВсего байт отправлено серверу PostgreSQL
bytes_receivedВсего байт получено от сервера PostgreSQL
age_secondsВремя жизни текущего серверного соединения в секундах
prepare_cache_hitЧисло попаданий в кэш prepared statements
prepare_cache_missЧисло промахов кэша prepared statements
prepare_cache_sizeЧисло уникальных prepared statements в кэше

Состояния соединений

  • active: соединение прямо сейчас выполняет запрос.
  • idle: соединение свободно для использования.
  • used: соединение выделено клиенту, но прямо сейчас не выполняет запрос.

SHOW CLIENTS

SHOW CLIENTS показывает информацию обо всех клиентских соединениях к PgDoorman:

pgdoorman=> SHOW CLIENTS;
КолонкаОписание
client_idУникальный идентификатор клиентского соединения
databaseИмя базы данных (пула), к которой подключён клиент
userUsername, с которым клиент подключился
application_nameИмя приложения, заявленное клиентом
addrIP-адрес и порт клиента (IP:port)
tlsИспользует ли соединение TLS-шифрование (true или false)
stateТекущее состояние клиентского соединения: active, idle или waiting
waitСостояние ожидания клиентского соединения: idle, read или write
transaction_countСколько транзакций обработано для этого клиента
query_countСколько запросов обработано для этого клиента
error_countСколько ошибок было у этого клиента
age_secondsВремя жизни клиентского соединения в секундах

Мониторинг долгоживущих соединений

Колонка age_seconds помогает находить долгоживущие соединения, которые могут зря держать ресурсы. Подумайте о настройке таймаутов на idle-соединения в приложении.

SHOW POOLS

SHOW POOLS показывает информацию о пулах соединений. Для каждой пары (database, user) создаётся отдельная запись пула:

pgdoorman=> SHOW POOLS;
КолонкаОписание
databaseИмя базы данных
userUsername, ассоциированный с пулом
pool_modeИспользуемый режим пулинга: session или transaction
cl_idleЧисло idle-клиентов (вне транзакции)
cl_activeЧисло активных клиентских соединений (привязаны к серверу или idle)
cl_waitingЧисло клиентских соединений, ожидающих серверного соединения
cl_cancel_reqЧисло cancel-запросов от клиентов
sv_activeЧисло серверных соединений, привязанных к клиентам
sv_idleЧисло idle-серверных соединений, доступных для немедленного использования
sv_usedЧисло серверных соединений, недавно использованных, но ещё не ставших idle
sv_loginЧисло серверных соединений, которые сейчас в процессе логина
pool_sizeНастроенный максимальный размер пула для этой пары (database, user)
maxwaitМаксимальное время ожидания в секундах для самого старого клиента в очереди
maxwait_usМикросекундная часть максимального времени ожидания
avg_xact_timeСредняя длительность транзакции в микросекундах
pausedНа паузе ли пул: 1 (paused) или 0 (active)

Сигнал о производительности

Если значение maxwait начинает расти, серверный пул может не справляться с обработкой запросов. Это может быть вызвано перегруженным сервером PostgreSQL или недостаточным pool_size.

SHOW USERS

SHOW USERS показывает информацию обо всех настроенных пользователях:

pgdoorman=> SHOW USERS;
КолонкаОписание
nameUsername, как настроен в PgDoorman
pool_modeРежим пулинга, назначенный пользователю: session или transaction

SHOW DATABASES

SHOW DATABASES показывает информацию обо всех настроенных пулах баз данных:

pgdoorman=> SHOW DATABASES;
КолонкаОписание
nameИмя настроенного пула
hostHostname сервера PostgreSQL
portНомер порта сервера PostgreSQL
databaseРеальное имя базы на бэкенде (может отличаться от имени пула, если задан server_database)
force_userПользователь, форсированный для этого пула (если настроено)
pool_sizeМаксимальное число серверных соединений для этого пула
min_pool_sizeМинимальное число серверных соединений, которое поддерживается
reserve_poolМаксимальное число дополнительных reserve-соединений
pool_modeРежим пулинга по умолчанию для этого пула
max_connectionsМаксимально разрешённое число серверных соединений (из max_db_connections)
current_connectionsТекущее число серверных соединений для этого пула

Управление соединениями

Следите за соотношением current_connections и pool_size, чтобы убедиться, что пул адекватно размерен. Если current_connections часто доходит до pool_size, увеличьте размер пула.

SHOW SOCKETS

SHOW SOCKETS показывает количество сокетов в разных состояниях для TCP/TCP6/Unix (только Linux):

pgdoorman=> SHOW SOCKETS;

Показывает агрегированные счётчики состояний сокетов (ESTABLISHED, SYN_SENT и т.д.), полученные из /proc/net/tcp, /proc/net/tcp6 и /proc/net/unix.

SHOW VERSION

SHOW VERSION показывает информацию о версии PgDoorman:

pgdoorman=> SHOW VERSION;

Полезно, чтобы проверить, какая версия запущена, особенно после обновлений.

Управляющие команды

PgDoorman предоставляет управляющие команды, позволяющие управлять работой сервиса прямо из admin-консоли.

SHUTDOWN

Команда SHUTDOWN корректно завершает процесс PgDoorman:

pgdoorman=> SHUTDOWN;

При выполнении:

  1. PgDoorman перестаёт принимать новые клиентские соединения.
  2. Существующим транзакциям даётся время завершиться (в пределах настроенного таймаута).
  3. Все соединения закрываются.
  4. Процесс завершается.

Прерывание сервиса

Команда SHUTDOWN останавливает сервис PgDoorman, отключая всех клиентов. В production используйте её с осторожностью.

SET log_level

Изменить уровень логирования на лету, не перезапуская пулер:

-- Глобальный уровень
pgdoorman=> SET log_level = 'debug';

-- На модуль (синтаксис RUST_LOG)
pgdoorman=> SET log_level = 'warn,pg_doorman::pool::pool_coordinator=debug';

-- Посмотреть текущий уровень
pgdoorman=> SHOW LOG_LEVEL;

-- Сбросить на стартовое значение
pgdoorman=> SET log_level = 'default';

Изменения временные -- теряются при перезапуске. Допустимые уровни: error, warn, info, debug, trace, off.

RELOAD

Команда RELOAD обновляет конфигурацию PgDoorman без перезапуска сервиса:

pgdoorman=> RELOAD;

Эта команда:

  1. Перечитывает файл конфигурации.
  2. Обновляет все изменяемые настройки.
  3. Применяет изменения параметров соединений для новых соединений.
  4. Сохраняет существующие соединения, пока они не вернутся в пул.

Изменение конфигурации без простоя

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

PAUSE

Команда PAUSE [db] блокирует получение новых backend-соединений для указанной базы (или всех баз, если аргумент не задан). Активные транзакции продолжают работать -- блокируются только запросы на новые соединения.

-- Поставить на паузу все пулы
pgdoorman=> PAUSE;

-- Поставить на паузу только пулы конкретной базы
pgdoorman=> PAUSE mydb;

Клиенты, которые запросят новое backend-соединение во время паузы, будут ждать RESUME или истечения query_wait_timeout -- что наступит раньше. Если истечёт таймаут, клиент получит ошибку timeout.

Используйте SHOW POOLS для проверки состояния паузы -- колонка paused покажет 1 для приостановленных пулов.

Когда использовать PAUSE

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

  • Failover базы: PAUSE → переключить бэкенд → RECONNECT → RESUME.
  • Полная ротация соединений: PAUSE → RECONNECT → RESUME гарантирует, что все соединения будут пересозданы.
  • Обслуживание бэкенда: PAUSE на время изменений схемы, затем RESUME.

RESUME

Команда RESUME [db] снимает PAUSE и немедленно разблокирует всех ожидающих клиентов:

-- Снять паузу со всех пулов
pgdoorman=> RESUME;

-- Снять паузу только с пулов конкретной базы
pgdoorman=> RESUME mydb;

Клиенты, которые ждали из-за PAUSE, немедленно продолжат получать backend-соединения.

RECONNECT

Команда RECONNECT [db] форсирует пересоздание всех backend-соединений:

-- Reconnect для всех пулов
pgdoorman=> RECONNECT;

-- Reconnect только для пулов конкретной базы
pgdoorman=> RECONNECT mydb;

При выполнении:

  1. Внутренний epoch-счётчик пула увеличивается.
  2. Все idle-соединения сразу закрываются.
  3. Активные соединения (которые сейчас обслуживают транзакцию) продолжают работать, но утилизируются при возврате в пул -- они не будут переиспользованы.

То есть RECONNECT не прерывает активные транзакции. Новые соединения создаются по запросу с текущим epoch, поэтому они будут приняты recycle().

Шаблоны ротации соединений

Постепенная ротация (минимум воздействия): Один RECONNECT -- idle-соединения сбрасываются сразу, активные -- по завершении текущей транзакции. Новые соединения создаются по мере необходимости.

Полная ротация (гарантированно все новые соединения): PAUSE → RECONNECT → RESUME -- сначала пауза не даёт стартовать новым транзакциям, потом RECONNECT помечает всё на утилизацию. После RESUME все последующие запросы получают свежие соединения.

RECONNECT и min_pool_size

После RECONNECT пулы с настроенным min_pool_size будут автоматически дозаполнены до минимума на следующем retain-цикле. У новых соединений будет текущий epoch.

Граничные случаи и поведение

В таблице ниже описано поведение PAUSE, RESUME и RECONNECT в граничных случаях:

СценарийПоведение
PAUSE для уже приостановленного пулаNo-op (идемпотентно). Ошибка не возвращается.
RESUME для не приостановленного пулаNo-op (идемпотентно). Ошибка не возвращается.
RECONNECT для приостановленного пулаРаботает: idle-соединения дренируются, epoch инкрементируется. После RESUME новые соединения создаются с новым epoch.
PAUSE/RESUME/RECONNECT для несуществующей базыВозвращает ошибку: No pool for database "xxx". Без аргумента-базы команда применяется ко всем пулам (ошибки нет, даже если пулов нет).
query_wait_timeout во время PAUSEКлиенты, ожидающие соединение, ожидаемо получают ошибку timeout. Пул остаётся на паузе.
RELOAD во время PAUSERELOAD пересоздаёт пулы из конфигурации, поэтому состояние паузы теряется. Это ожидаемое поведение -- новая конфигурация означает новые пулы.
GC приостановленных динамических пуловПриостановленные динамические пулы защищены от garbage collection даже при 0 соединений.
Replenish во время PAUSEПулы с min_pool_size не дозаполняются, пока на паузе -- новые соединения не создаются. Дозаполнение возобновляется после RESUME.
Время жизни соединений во время PAUSERetain-задача продолжает закрывать просроченные соединения (idle timeout, server lifetime). Соединения по-прежнему стареют.
Несколько вызовов RECONNECTКаждый вызов увеличивает epoch ещё. Только соединения, созданные после последнего RECONNECT, считаются валидными.

Обработка сигналов

PgDoorman реагирует на стандартные Unix-сигналы для управления и контроля. Сигналы посылаются через kill (например, kill -HUP <pid>).

СигналЭффект
SIGHUPПеречитывание конфигурации -- эквивалент admin-команды RELOAD.
SIGUSR2Binary upgrade и graceful shutdown. Валидирует новый бинарник флагом -t, запускает новый процесс, затем завершается. Рекомендуется для обновлений. См. Binary upgrade.
SIGINTForeground + TTY (Ctrl+C): только graceful shutdown (без binary upgrade). Daemon / без TTY: binary upgrade и graceful shutdown (legacy-поведение).
SIGTERMНемедленное завершение. Активные соединения обрываются.

Управление процессом

В окружениях на базе systemd unit-файл по умолчанию использует ExecReload=/bin/kill -SIGUSR2 $MAINPID, чтобы запускать binary upgrade при systemctl reload.