Установка и первоначальная настройка PostgreSQL 17 на Ubuntu 24.04

Относительно недавно (26 сентября 2024) вышла 17-ая версия PostgreSQL.

В ней достаточно много интересных доработок в плане производительности, полный пресс-релиз на русском языке можно прочитать на сайте OpenNet. Так же про 17-ю версию был доклад Павла Лузанова на конференции PGConf.Russia 2024, его можно посмотреть здесь. К сожалению обновленный доклад с PGConf.СПб 2024 про 17-ю версию пока не выложили в публичный доступ, так что ждем его.

Ну а мы сегодня займемся установкой PostgreSQL v17 на Ubuntu 24.04

Исходные данные: Ubuntu 24.04 (noble)
Задача: Установить PostgreSQL 17 (дополнительно изучить файл настроек создания кластера, изучить утилиты просмотра состояния кластера и управления кластером)

Способов установки PostgreSQL довольно много как и статей в Интернете, но мы будет отталкиваться от инструкции на официальном сайте, а не изобретать велосипед.

Существует 2 основных способа установки:
1. Из репозитория дистрибутива
2. Из репозитория разработчиков PostgreSQL на официальном сайте https://www.postgresql.org

Мы выбираем 2-й способ т.к. он позволит установить нам самую свежую версию и в дальнейшем более оперативно получать обновления.

Для начала нам нужно установить репозиторий пакетов apt.postgresql.org в наш дистрибутив. Тут есть 2 способа и они так же описаны по ссылке выше. Я буду устанавливать репозиторий пакетов с помощью скрипта apt.postgresql.org.sh из пакета postgresql-common

Почему так? Потому, что это удобно и требует меньше трудозатрат. К тому же первоначальная установка пакета postgresql-common позволит нам установить параметры нового кластера БД до его инициализации которая происходит сразу после установки пакета базы данных.

Итак давайте пойдем по шагам:

1. Устанавливаем пакет postgresql-common из репозитория дистрибутива ОС:

sudo apt-get install -y postgresql-common

Вместе с пакетом postgresql-common в систему прилетит и пакет postgresql-client-common в котором будет ряд вспомогательных утилит, а многие файлы (psql, pg_basebackup, pgbench и другие) будут на самом деле ссылаться на враппер /usr/share/postgresql-common/pg_wrapper который позволяет запускать разные версии консольных утилит в зависимости от настроек.

Сейчас любая попытка запустить например psql приведет к выводу сообщения:

# psql
Warning: No existing cluster is suitable as a default target. Please see man pg_wrapper(1) how to specify one.
Error: You must install at least one postgresql-client-<version> package

Оно и понятно, в системе сейчас нет ни одного пакета нужной версии клиента postgresql, все они будут установлены чуть позже.

2. Устанавливаем репозиторий apt.postgresql.org

Для автоматической установки и настройки репозиторий apt.postgresql.org нам нужно запустить готовый скрипт из пакета postgresql-common

sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh

На наш запуск он задаст нам вопрос, действительно ли мы хотим установить APT репозиторий apt.postgresql.org в нашу систему. Жмем Enter и все будет установлено, см. вывод ниже:

This script will enable the PostgreSQL APT repository on apt.postgresql.org on
your system. The distribution codename used will be noble-pgdg.

Press Enter to continue, or Ctrl-C to abort.

Using keyring /usr/share/postgresql-common/pgdg/apt.postgresql.org.gpg
Writing /etc/apt/sources.list.d/pgdg.sources ...

Running apt-get update ...
Hit:1 https://mirror.hetzner.com/ubuntu/packages noble InRelease
Hit:2 https://mirror.hetzner.com/ubuntu/packages noble-updates InRelease
Hit:3 https://mirror.hetzner.com/ubuntu/packages noble-backports InRelease
Hit:4 https://mirror.hetzner.com/ubuntu/security noble-security InRelease
Get:5 https://apt.postgresql.org/pub/repos/apt noble-pgdg InRelease [129 kB]
Get:6 https://apt.postgresql.org/pub/repos/apt noble-pgdg/main amd64 Packages [306 kB]
Fetched 435 kB in 1s (379 kB/s)
Reading package lists... Done

You can now start installing packages from apt.postgresql.org.

Have a look at https://wiki.postgresql.org/wiki/Apt for more information;
most notably the FAQ at https://wiki.postgresql.org/wiki/Apt/FAQ

Скрипт помог нам не выполнять ряд рутинных действий по добавлению GPG ключа в систему, создания файла /etc/apt/sources.list.d/pgdg.sources и выполнения apt-get update

Теперь мы можем установить нужную нам версию PostgreSQL.

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

3. Предварительная настройка нового кластера:

Пакет postgresql-common помимо всего прочего создал каталог /etc/postgresql-common в котором располагается ряд полезных файлов которые используются для первоначальной инициализации любого кластера.

Напомню, что мы можем установить в систему несколько разных версий PostgreSQL и для каждой версии создать сколько угодно кластеров. Для управления всем этим в пакете postgresql-common есть несколько скриптов (pg_createcluster, pg_ctlcluster, pg_dropcluster, pg_lsclusters, pg_renamecluster и другие), а основной файл конфигурации используемый при создании кластеров называется /etc/postgresql-common/createcluster.conf

Если мы выведем содержимое файла /etc/postgresql-common/createcluster.conf, то сможем увидеть ряд полезных настроек, см. описание ниже.

cat /etc/postgresql-common/createcluster.conf

В файле конфигурации createcluster.conf используется ряд сокращений (макросов) которые в процессе работы скриптов будут заменены на определенные константы.

%v — будет заменен на мажорную версию PostgreSQL, например, полная версия 17.1, тогда мажорная версия будет 17
%c — имя кластера БД, по умолчанию имя кластера будет main

Ряд настроек в файле createcluster.conf будут закомментировано с помощью знака решетки #, это значит что данные настройки используются по умолчанию с теми значениями что указаны, но их можно раскоментировать и тем самым поменять значения параметров.

Описание настроек createcluster.conf:

#start_conf = 'auto'

Опция start_conf идет закомментирована. Данная опция управляет режимом запуска кластера при загрузке ОС. Значение этой опции будет в последствии перенесено в файл start.conf для вновь созданного кластера. В режиме ‘auto’ (по умолчанию) кластер автоматически запуститься при старте системы. В режиме ‘manual’ кластер не будет запущен при запуске ОС и Вы должны будите его запустить сами. В режиме ‘disabled’ кластер не только не запуститься при старте ОС, но так же Вы не сможете запустить его вручную через pg_ctlcluster

#data_directory = '/var/lib/postgresql/%v/%c'

Опция data_directory идет закомментирована. Данная опция управляет расположением файлов кластеров при его начальной инициализации. Как можно заметить в опции используются макросы которые будут заменены в процессе работы скриптов. Путь /var/lib/postgresql/%v/%c для 17 версии PostgreSQL и кластера main превратиться в /var/lib/postgresql/17/main и именно там по умолчанию и будут располагаться все файлы БД для нового кластера БД. Если по какой-то причине Вам нужно изменить местоположение файлов вновь создаваемых кластеров, то эта опция именно то что нужно. Поменять путь может понадобиться если например для БД используется отдельный диск и он смонтирован в какой-то другой каталог, например в /data, тогда вы можете изменить настройку на такую: data_directory = ‘/data/%v/%c’

#waldir = '/var/lib/postgresql/wal/%v/%c/pg_wal'

Опция waldir идет закомментирована и не используется по умолчанию в отличии от других опций описанных выше. Данная опция управляет местоположением журналов WAL для вновь создаваемых кластеров. Вы можете включить ведение журналов WAL и определить для них свой путь на этапе создания кластера.

#initdb_options = ''

Опция initdb_options идет закомментирована и пустой по умолчанию. Данная опция управляет дополнительными настройками которые будут использованы при создании нового кластера (initdb). Например Вы можете задать специфичные настройки кодировки для нового кластера (—encoding=UTF-8 —lc-collate=en_US.UTF-8 —lc-ctype=en_US.UTF-8) или можете сразу включить проверку контрольных сумм на страницах (—data-checksums) и т.д.

Далее в файле createcluster.conf идет ряд опций значение которых будет перенесено в одноименные опции кластера в файл postgresql.conf

ssl = on

Значение опции ssl будет установлено в файле postgresql.conf для опции ssl. Иначе говоря мы включаем возможность подключаться к БД с шифрованием по SSL с самоподписным системным сертификатом сервера (так называемый snakeoil сертификат).

cluster_name = '%v/%c'

Значение опции cluster_name так же будет установлено в файле postgresql.conf для опции cluster_name, но макросы будут заменены. В итоге для 17 версии и кластера main в файле postgresql.conf значение cluster_name будет ’17/main’

stats_temp_directory = '/var/run/postgresql/%v-%c.pg_stat_tmp'

Значение опции stats_temp_directory так же будет установлено в файле postgresql.conf для опции stats_temp_directory, но макросы будут заменены. В итоге для 17 версии и кластера main в файле postgresql.conf значение stats_temp_directory будет ‘/var/run/postgresql/17-main.pg_stat_tmp’

log_line_prefix = '%%m [%%p] %%q%%u@%%d '

Значение опции log_line_prefix так же будет установлено в файле postgresql.conf для опции log_line_prefix. Но в данном случае мы видим двойные знаки процентов, это не спроста и при переносе этих значений в postgresql.conf двойные % превратятся в одинарные, итого в файле postgresql.conf значение log_line_prefix будет ‘%m [%p] %q%u@%d ‘

add_include_dir = 'conf.d'

Значение опции add_include_dir будет установлено в файле postgresql.conf для опции include_dir. Итого в файле postgresql.conf значение include_dir будет ‘conf.d’

И наконец последняя опция файла createcluster.conf это

include_dir '/etc/postgresql-common/createcluster.d'

Она определяет директорию в которой могут располагаться дополнительные файлы с настройками для createcluster. Настройки в этих файлах могут переопределять настройки файла createcluster.conf. Это сделано для того, чтобы основной файл createcluster.conf не менялся, ведь в процессе обновления пакетов он может дополняться новыми настройками, а если мы его поменяем, то пакетный менеджер поймет это и при следующем обновлении пакета postgresql-common предложит либо заменить файл createcluster.conf на новый, но тогда мы потеряем то что настроили ранее, либо оставить наш исходный createcluster.conf, но тогда мы не узнаем о новых настройках, которые там появились. Вот поэтому createcluster.conf не стоит менять, тем более через средства автоматизации типа ansible.

Стоит отметить, что все настройки PostgreSQL для кластера по умолчанию (main) и всех последующих кластеров (созданных утилитой pg_createcluster) будут создаваться в соответствии с иерархией каталогов /etc/postgresql/%v/%c, то есть для 17-й версии и кластера main это будет каталог /etc/postgresql/17/main

Именно в каталоге /etc/postgresql/17/main будет размещаться основные файлы кластера по умолчанию для 17-й версии. О них мы поговорим после установки нашего первого кластера PostgreSQL.

Я описал все настройки createcluster.conf которые потом перейдут в конфигурацию postgresql.conf и которыми управляется вновь создаваемый кластер. Менять эти настройки в данной статье мы не будем. Мы сейчас установим серверные пакеты для 17-й версии PostgreSQL и проверим, с теми ли настройками что мы описали выше инициализируется новый кластер.

4. Установка PostgreSQL 17:

Для установки сервера нам нужно установить пакет postgresql-17. Если нам вдруг нужно установить только клиентскую часть, то ставим пакет postgresql-client-17

sudo apt-get install -y postgresql-17

В консоль будет выведено примерно такое:

# sudo apt-get install -y postgresql-17
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libllvm17t64 libpq5 postgresql-client-17
Suggested packages:
  postgresql-doc-17
The following NEW packages will be installed:
  libllvm17t64 postgresql-17 postgresql-client-17
The following packages will be upgraded:
  libpq5
1 upgraded, 3 newly installed, 0 to remove and 4 not upgraded.
Need to get 45.5 MB of archives.
After this operation, 193 MB of additional disk space will be used.
Get:1 https://mirror.hetzner.com/ubuntu/packages noble/main amd64 libllvm17t64 amd64 1:17.0.6-9ubuntu1 [26.2 MB]
Get:2 https://apt.postgresql.org/pub/repos/apt noble-pgdg/main amd64 libpq5 amd64 17.0-1.pgdg24.04+1 [220 kB]
Get:3 https://apt.postgresql.org/pub/repos/apt noble-pgdg/main amd64 postgresql-client-17 amd64 17.0-1.pgdg24.04+1 [1,981 kB]
Get:4 https://apt.postgresql.org/pub/repos/apt noble-pgdg/main amd64 postgresql-17 amd64 17.0-1.pgdg24.04+1 [17.2 MB]
Fetched 45.5 MB in 1s (90.6 MB/s)                                        
Preconfiguring packages ...
Selecting previously unselected package libllvm17t64:amd64.
(Reading database ... 47675 files and directories currently installed.)
Preparing to unpack .../libllvm17t64_1%3a17.0.6-9ubuntu1_amd64.deb ...
Unpacking libllvm17t64:amd64 (1:17.0.6-9ubuntu1) ...
Preparing to unpack .../libpq5_17.0-1.pgdg24.04+1_amd64.deb ...
Unpacking libpq5:amd64 (17.0-1.pgdg24.04+1) over (16.4-0ubuntu0.24.04.2) ...
Selecting previously unselected package postgresql-client-17.
Preparing to unpack .../postgresql-client-17_17.0-1.pgdg24.04+1_amd64.deb ...
Unpacking postgresql-client-17 (17.0-1.pgdg24.04+1) ...
Selecting previously unselected package postgresql-17.
Preparing to unpack .../postgresql-17_17.0-1.pgdg24.04+1_amd64.deb ...
Unpacking postgresql-17 (17.0-1.pgdg24.04+1) ...
Setting up libpq5:amd64 (17.0-1.pgdg24.04+1) ...
Setting up libllvm17t64:amd64 (1:17.0.6-9ubuntu1) ...
Setting up postgresql-client-17 (17.0-1.pgdg24.04+1) ...
update-alternatives: using /usr/share/postgresql/17/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up postgresql-17 (17.0-1.pgdg24.04+1) ...
Creating new PostgreSQL cluster 17/main ...
/usr/lib/postgresql/17/bin/initdb -D /var/lib/postgresql/17/main --auth-local peer --auth-host scram-sha-256 --no-instructions
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/17/main ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default "max_connections" ... 100
selecting default "shared_buffers" ... 128MB
selecting default time zone ... Europe/Berlin
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
Processing triggers for postgresql-common (257build1.1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
Processing triggers for libc-bin (2.39-0ubuntu8.3) ...
Scanning processes...                                                                                                                                                                                                                                                                    
Scanning linux images... 

Как можно увидеть из вывода процесса установки, после установки всех необходимых пакетов был создан кластер с именем ’17/main’, для этого была запущена команда /usr/lib/postgresql/17/bin/initdb с опциями

-D /var/lib/postgresql/17/main --auth-local peer --auth-host scram-sha-256 --no-instructions

Опция -D задает путь для размещения файлов нового кластера и он соответствует настройке по умолчанию data_directory из файла /etc/postgresql-common/createcluster.conf

Чтобы проверить что наш новый кластер запущен можно воспользоваться systemctl status и указать имя юнита в формате postgresql@%v-%c.service или для 17-й версии и кластера main это будет [email protected]

systemctl status [email protected]

Вывод команды:

[email protected] - PostgreSQL Cluster 17-main
     Loaded: loaded (/usr/lib/systemd/system/[email protected]; enabled-runtime; preset: enabled)
     Active: active (running) since Mon 2024-10-14 21:18:26 CEST; 5min ago
    Process: 4927 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 17-main start (code=exited, status=0/SUCCESS)
   Main PID: 4932 (postgres)
      Tasks: 6 (limit: 4543)
     Memory: 20.9M (peak: 27.4M)
        CPU: 527ms
     CGroup: /system.slice/system-postgresql.slice/[email protected]
             ├─4932 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgresql.conf
             ├─4933 "postgres: 17/main: checkpointer "
             ├─4934 "postgres: 17/main: background writer "
             ├─4936 "postgres: 17/main: walwriter "
             ├─4937 "postgres: 17/main: autovacuum launcher "
             └─4938 "postgres: 17/main: logical replication launcher "

Oct 14 21:18:23 dbserver.local systemd[1]: Starting [email protected] - PostgreSQL Cluster 17-main...
Oct 14 21:18:26 dbserver.local systemd[1]: Started [email protected] - PostgreSQL Cluster 17-main.

Наш первый кластер PostgreSQL версии 17 установлен и запущен.

С помощью утилиты netstat мы можем проверить что процесс postgres слушает сетевой порт 5432

# netstat -ltupn | grep postgres
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      4932/postgres       
tcp6       0      0 ::1:5432                :::*                    LISTEN      4932/postgres

Так же мы можем подключиться к нашему кластеру через утилиту psql и выполнить простой запрос по проверке версии PostgreSQL (чтобы подключиться без пароля нам нужно запустить psql под пользователем postgres, для этого мы воспользуется утилитой su):

# su - postgres -c psql
psql (17.0 (Ubuntu 17.0-1.pgdg24.04+1))
Type "help" for help.

postgres=# SELECT version();
                                                           version                                                            
------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 17.0 (Ubuntu 17.0-1.pgdg24.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 13.2.0-23ubuntu4) 13.2.0, 64-bit
(1 row)

postgres=# \q

Мы видим, что у нас установлена версия 17.0 из официального репозитория pgdg

5. Файлы конфигурации кластера:

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

Чуть выше я писал, что все файлы нового кластера будут создаваться в каталоге /etc/postgresql в соответствии с иерархией /etc/postgresql/%v/%c (напомню что %v это мажорная версия, а %c это имя кластера)

Таким образом нам нужен каталог /etc/postgresql/17/main

# ls -l /etc/postgresql/17/main
total 60
drwxr-xr-x 2 postgres postgres  4096 Oct 14 21:18 conf.d
-rw-r--r-- 1 postgres postgres   315 Oct 14 21:18 environment
-rw-r--r-- 1 postgres postgres   143 Oct 14 21:18 pg_ctl.conf
-rw-r----- 1 postgres postgres  5924 Oct 14 21:18 pg_hba.conf
-rw-r----- 1 postgres postgres  2640 Oct 14 21:18 pg_ident.conf
-rw-r--r-- 1 postgres postgres 30975 Oct 14 21:18 postgresql.conf
-rw-r--r-- 1 postgres postgres   317 Oct 14 21:18 start.conf

Назначение файлов:
start.conf — это файл о котором я писал выше при рассмотрении опции start_conf из файла createcluster.conf, в нем указывается режим запуска кластера при загрузке ОС (будет ли он запущен автоматически или вручную или вообще не будет запускаться);
postgresql.conf — это основной файл конфигурации PostgreSQL, можно посмотреть его и убедиться что ряд настроек в этом файле были установлены ровно так как я описывал их при описании файла createcluster.conf
pg_hba.conf, pg_ident.conf — это файлы так же непосредственно относящиеся к работе PostgreSQL;
pg_ctl.conf — это файл конфигурации для утилиты pg_ctl;
environment — это файл переменных окружения для процесса postgres, синтаксис у него такой же как у postgresql.conf
conf.d/ — а это уже каталог и там могут располагаться .conf с дополнительными настройками для PostgreSQL, по сути это каталог описанный в настройке include_dir файла postgresql.conf. Туда удобно складывать файлы конфигурации PostgreSQL создаваемые автоматизированным путем, например через ansible, а основной файл postgresql.conf при этом не трогать;

Давайте выведем содержимое /etc/postgresql/17/main/postgresql.conf
В составе пакета postgresql-common есть утилита и на это случай жизни, она называется pg_conftool
Утилита pg_conftool позволяет просматривать и редактировать параметры кластера.
Конечно Вам никто не мешает редактировать их вручную с помощью любого редактора, тут каждый выбирает свой путь.

# pg_conftool 17 main postgresql.conf show all

cluster_name = '17/main'
data_directory = '/var/lib/postgresql/17/main'
datestyle = 'iso, mdy'
default_text_search_config = 'pg_catalog.english'
dynamic_shared_memory_type = posix
external_pid_file = '/var/run/postgresql/17-main.pid'
hba_file = '/etc/postgresql/17/main/pg_hba.conf'
ident_file = '/etc/postgresql/17/main/pg_ident.conf'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
log_line_prefix = '%m [%p] %q%u@%d '
log_timezone = 'Europe/Berlin'
max_connections = 100
max_wal_size = 1GB
min_wal_size = 80MB
port = 5432
shared_buffers = 128MB
ssl = on
ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem'
ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'
timezone = 'Europe/Berlin'
unix_socket_directories = '/var/run/postgresql'

Итак, обратите внимание на значения настроек data_directory, ssl, log_line_prefix, cluster_name, include_dir. Все они были установлены в соответствии с тем что описано в файле /etc/postgresql-common/createcluster.conf

6. Управление кластером:

Теперь давайте поговорим о том как можно управлять кластером через утилиты pg_lsclusters и pg_ctlcluster

С помощью утилиты pg_lsclusters мы можем посмотреть список существующих кластеров, их статус и краткую информацию о таких параметрах как версия, имя кластера, порт, владелец, каталог с данными и каталог с логам.

Запустим утилиту с доп. опцией -s (опция выведет настройку из файла start.conf, чтобы можно было понять режим старта кластера при загрузке ОС)

# pg_lsclusters -s
Ver Cluster Port Status      Owner    Data directory              Log file
17  main    5432 online,auto postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17-main.log

Можно воспользоваться опцией -j для вывода информации в формате json, что может быть удобно для использования в системах мониторинга (я использовал утилиту jq для более удобного наглядного отображения json):

# pg_lsclusters -s -j | jq .
[
  {
    "cluster": "main",
    "configdir": "/etc/postgresql/17/main",
    "ownergid": 114,
    "pgdata": "/var/lib/postgresql/17/main",
    "logfile": "/var/log/postgresql/postgresql-17-main.log",
    "owneruid": 111,
    "version": "17",
    "socketdir": "/var/run/postgresql",
    "configuid": 111,
    "running": 1,
    "port": "5432",
    "config": {
      "log_timezone": "Europe/Berlin",
      "log_line_prefix": "%m [%p] %q%u@%d ",
      "external_pid_file": "/var/run/postgresql/17-main.pid",
      "timezone": "Europe/Berlin",
      "ident_file": "/etc/postgresql/17/main/pg_ident.conf",
      "hba_file": "/etc/postgresql/17/main/pg_hba.conf",
      "lc_messages": "en_US.UTF-8",
      "ssl_cert_file": "/etc/ssl/certs/ssl-cert-snakeoil.pem",
      "ssl_key_file": "/etc/ssl/private/ssl-cert-snakeoil.key",
      "max_connections": "100",
      "datestyle": "iso, mdy",
      "max_wal_size": "1GB",
      "default_text_search_config": "pg_catalog.english",
      "ssl": "on",
      "port": "5432",
      "dynamic_shared_memory_type": "posix",
      "data_directory": "/var/lib/postgresql/17/main",
      "shared_buffers": "128MB",
      "lc_numeric": "en_US.UTF-8",
      "cluster_name": "17/main",
      "lc_time": "en_US.UTF-8",
      "unix_socket_directories": "/var/run/postgresql",
      "lc_monetary": "en_US.UTF-8",
      "min_wal_size": "80MB"
    },
    "start": "auto"
  }
]

Как мы видим, в формате json утилиты выводит намного больше информации, даже конфигурацию PostgreSQL.

С помощью утилиты pg_ctlcluster мы можем управлять нашими кластерами, а именно — смотреть статус кластера, запускать, останавливать и перезапускать кластер БД PostgreSQL, так же делать перезагрузку параметров кластера (reload), выполнять промоут (повышение) реплики до уровня мастера. Так же у утилиты pg_ctlcluster есть ряд дополнительных опций для управления режимами остановки кластера (smart|fast|immediate), управления режимами запуска, а так же возможность указания дополнительных опций для pg_ctl.

Эта утилита использует файлы pg_ctl.conf и start.conf в каталоге настроек нашего кластера (/etc/postgresql/%v/%c или /etc/postgresql/17/main для кластера по умолчанию).

Если копнуть чуть глубже, то утилиты pg_lsclusters, pg_ctlcluster и другие (pg_createcluster, pg_dropcluster, pg_backupcluster, pg_restorecluster, pg_upgradecluster, pg_virtualenv, pg_conftool) — это perl скрипты и их наличие свойственно для дистрибутива Ubuntu. В RedHat-подобных дистрибутивах Вы их не найдете.

Синтаксис утилиты простой pg_ctlcluster:

pg_ctlcluster <version> <cluster> <action> [-- <pg_ctl options>]

Смотрим состояние нашего кластера:

# pg_ctlcluster 17 main status
pg_ctl: server is running (PID: 4932)
/usr/lib/postgresql/17/bin/postgres "-D" "/var/lib/postgresql/17/main" "-c" "config_file=/etc/postgresql/17/main/postgresql.conf"

Видно что кластер запущен (server is running), PID основного процесса 4932, видно каталог с бинарным файлом postgres, видно с какими опциями запущен кластер (это -D которая определяет каталог с данными и -c которая определяет набор опций и в частности config_file которая определяет путь к файлу конфигурации postgresql.conf)

Если мы выполним ps, то увидим что все сходится — PID основного процесса postgres действительно 4932, путь до бинарного файла и опции с которыми он запущен те, что указаны в выводе pg_ctlcluster

# ps -ef | grep [p]ostgres
postgres    4932       1  0 21:18 ?        00:00:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgresql.conf
postgres    4933    4932  0 21:18 ?        00:00:00 postgres: 17/main: checkpointer 
postgres    4934    4932  0 21:18 ?        00:00:00 postgres: 17/main: background writer 
postgres    4936    4932  0 21:18 ?        00:00:00 postgres: 17/main: walwriter 
postgres    4937    4932  0 21:18 ?        00:00:00 postgres: 17/main: autovacuum launcher 
postgres    4938    4932  0 21:18 ?        00:00:00 postgres: 17/main: logical replication launcher

Теперь давайте остановим наш кластер и проверим через разные утилиты и заглянем в лог-файл:

# pg_ctlcluster 17 main stop

# pg_ctlcluster 17 main status
pg_ctl: no server running

# ps -ef | grep [p]ostgres

# pg_lsclusters -s
Ver Cluster Port Status    Owner    Data directory              Log file
17  main    5432 down,auto postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17-main.log

# tail -n 2 /var/log/postgresql/postgresql-17-main.log 
2024-10-14 22:40:26.752 CEST [4933] LOG:  checkpoint complete: wrote 0 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.011 s; sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=242 kB; lsn=0/152E4B8, redo lsn=0/152E4B8
2024-10-14 22:40:26.765 CEST [4932] LOG:  database system is shut down

Как мы видим в случае успеха pg_ctlcluster ничего не выводит, pg_ctlcluster говорит что кластер не запущен, ps говорит, что нет никаких процессов postgres, pg_lsclusters говорит что кластер остановлен (down в колонке Status), а в лог-файле /var/log/postgresql/postgresql-17-main.log написано, что БД успешно остановлена.

Теперь давайте запустим наш кластер и проверим через разные утилиты и заглянем в лог-файл:

# pg_ctlcluster 17 main start

# pg_ctlcluster 17 main status
pg_ctl: server is running (PID: 5901)
/usr/lib/postgresql/17/bin/postgres "-D" "/var/lib/postgresql/17/main" "-c" "config_file=/etc/postgresql/17/main/postgresql.conf"

# ps -ef | grep [p]ostgres
postgres    5901       1  0 22:44 ?        00:00:00 /usr/lib/postgresql/17/bin/postgres -D /var/lib/postgresql/17/main -c config_file=/etc/postgresql/17/main/postgresql.conf
postgres    5902    5901  0 22:44 ?        00:00:00 postgres: 17/main: checkpointer 
postgres    5903    5901  0 22:44 ?        00:00:00 postgres: 17/main: background writer 
postgres    5905    5901  0 22:44 ?        00:00:00 postgres: 17/main: walwriter 
postgres    5906    5901  0 22:44 ?        00:00:00 postgres: 17/main: autovacuum launcher 
postgres    5907    5901  0 22:44 ?        00:00:00 postgres: 17/main: logical replication launcher 

# pg_lsclusters -s
Ver Cluster Port Status      Owner    Data directory              Log file
17  main    5432 online,auto postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17-main.log

# tail -n 2 /var/log/postgresql/postgresql-17-main.log
2024-10-14 22:44:28.456 CEST [5904] LOG:  database system was shut down at 2024-10-14 22:40:26 CEST
2024-10-14 22:44:28.471 CEST [5901] LOG:  database system is ready to accept connections

Кластер запустился, pg_ctlcluster показывает, что все работает, PID = 5901, вывод ps это подтверждает, pg_lsclusters так же говорит что все запущено и в логе видно, что кластер БД готов принимать подключения клиентов.

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

На этом статья завершена, мы изучили файл конфигурации начальной инициализации кластера, установили PostgreSQL 17, познакомились с утилитами просмотра состояния и управления кластерами. До скорых встреч, пока!

В следующей статье мы углубимся в возможности создания/удаления и управления множеством кластеров на одном сервере с помощью утилит pg_createcluster, pg_dropcluster и др.

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


Подписаться
Уведомить о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x