Изменение размера сегментов журнала WAL
Процедура проверена на конфигурациях Pangolin 6.x.x и Pangolin 5.5.x. Детальные инструкции для каждой версии приведены ниже.
Дополнительная информация о работе утилит, применяемых в процедуре изменения размера сегментов журнала WAL, доступна в документации:
-
описание параметров и режима работы pg_resetwal;
-
описание структуры выходных данных и возможностей pg_waldump.
Изменение размера сегментов WAL в Pangolin 6.x.*
В разделе описываются команды и последовательность действий, которые позволяют контролировать состояние файлов WAL, служебные логи PostgreSQL, параметры кластера под управлением Pangolin Manager и выполнить изменение размера сегментов WAL.
Мониторинг изменений WAL
В подразделе приведены команды для базового и расширенного мониторинга состояния журнала WAL и параметров кластера.
Базовый мониторинг
Команда выполняет непрерывный просмотр последних файлов WAL, логов и информации о составе кластера:
watch -n 0.5 "ls -lt /pgdata/06/data/pg_wal/ | head -n 6; \
echo '----'; \
ls -lt /pgerrorlogs/06/ | head -n 5; \
echo '----'; \
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list <cluster_name>"
Расширенный мониторинг (с просмотром состояния узлов в DCS)
Команда выводит также состояние основных параметров узлов PostgreSQL в DCS:
watch -n 0.5 "ls -lt /pgdata/06/data/pg_wal/ | head -n 6; \
echo '----'; \
ls -lt /pgerrorlogs/06/ | head -n 5; \
echo '----'; \
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list <cluster_name>; \
echo '----'; \
pangolin-dcs-ctl -u <username>:<password> get /service/<cluster_name>/members/<server_primary>; \
echo '----'; \
pangolin-dcs-ctl -u <username>:<password> get /service/<cluster_name>/members/<server_replica>; \
echo '----'; \
ls -lt /pgdata/06/data/global | grep pg_control"
Пример полного расширенного вывода мониторинга
Ниже приведен полный пример результата выполнения команды watch:
Every 0.5s: ls -lt /pgdata/06/data/pg_wal/ | head -n 6; echo '----'; ls -lt /pgerrorlogs/06/ | head -n 5; ec... <server_primary>: Wed Apr 30 07:55:36 2025
total 1114120
-rw------- 1 postgres postgres 16777216 Apr 30 07:53 0000000200000000000000D1
-rw------- 1 postgres postgres 16777216 Apr 30 07:32 0000000200000000000000D0
-rw------- 1 postgres postgres 16777216 Apr 30 07:26 0000000200000000000000CF
-rw------- 1 postgres postgres 16777216 Apr 30 07:02 0000000200000000000000CE
-rw------- 1 postgres postgres 16777216 Apr 30 06:56 0000000200000000000000CD
----
total 1412
drwx------ 2 postgres postgres 4096 Apr 30 07:54 audit
-rw------- 1 postgres postgres 155617 Apr 30 07:53 postgresql-2025-04-30_000000.log
drwx------ 2 postgres postgres 4096 Apr 30 00:00 raft
drwx------ 2 postgres postgres 4096 Apr 30 00:00 pangolin-pooler
----
+ Cluster: <cluster_name> (7498207218355021637)+--------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+------------------+---------------------------+--------------+-----------+----+-----------+
| <server_primary> | <server_primary>:5433 | Leader | running | 2 | |
| <server_replica> | <server_replica>:5433 | Sync Standby | streaming | 2 | 0 |
+------------------+---------------------------+--------------+-----------+----+-----------+
----
/service/<cluster_name>/members/<server_primary>
{'conn_url': 'postgres://<server_primary>:5433/postgres', 'api_url': 'http://<server_primary>:8008/patroni', 'state': 'running', 'role': 'master', 'version': '3.2.0', 'xlog_location': 3506438480, 'timeline': 2}
----
/service/<cluster_name>/members/<server_replica>
{'conn_url': 'postgres://<server_replica>:5433/postgres', 'api_url': 'http://<server_replica>:8008/patroni', 'state': 'running', 'role': 'replica', 'version': '3.2.0', 'xlog_location': 3506438480, 'replication_state': 'streaming', 'timeline': 2}
----
-rw------- 1 postgres postgres 8192 Apr 30 07:53 pg_control
Процедура изменения размера WAL
В подразделе описана пошаговая процедура изменения размера сегментов журнала WAL в кластере под управлением Pangolin 6.x.*.
Выполнение операций изменения размера сегментов WAL сопровождается повышенными рисками. Перед выполнением процедуры следует учитывать следующие условия:
- Манипуляции утилитой
pg_resetwalмогут привести к потере надежности хранения данных. Перед началом требуется обязательная резервная копия данных. - Все действия выполняются только при полном отсутствии нагрузки на кластер.
- При наличии резервного узла кластерной конфигурации состояние реплики должно быть синхронным и без задержек применения WAL.
Шаг 1. Выполнение контрольной точки
Этап необходим для записи всех грязных страниц и завершения текущего цикла WAL. Контрольные точки выполняются на обоих узлах.
Основной узел:
psql
Password for user postgres:
psql (15.5)
Type "help" for help.
postgres=# checkpoint;
CHECKPOINT
postgres=# exit;
Резервный узел:
psql -h <server_replica> -p 5433 -U postgres
Password for user postgres:
psql (15.5)
Type "help" for help.
postgres=# select pg_is_in_recovery(); --действительно резервный узел
pg_is_in_recovery
-------------------
t
(1 row)
postgres=# checkpoint;
CHECKPOINT
postgres=# \q
Шаг 2. Перевод кластера Pangolin Manager в режим обслуживания
На данном этапе кластер переводится в режим обслуживания, что отключает автоматическое управление перемещением ролей между узлами.
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml pause <cluster_name>
Success: cluster management is paused
Шаг 3. Остановка PostgreSQL на основном и резервном узле
Остановка кластера обеспечивает стабильное состояние структуры WAL. Действия выполняются отдельно на основном и резервном узле.
Основной узел:
pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped
pg_ctl status
pg_ctl: no server running
Резервный узел:
pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped
pg_ctl status
pg_ctl: no server running
Шаг 4. Проверка совпадения меток контрольной точки
На этапе подтверждается, что контрольные точки завершены корректно и одинаково на обоих узлах.
Основной узел:
pg_controldata | grep -P "Latest checkpoint's REDO location|Latest checkpoint location"
Latest checkpoint location: 0/DE000028
Latest checkpoint's REDO location: 0/DE000028
Резервный узел:
pg_controldata | grep -P "Latest checkpoint's REDO location|Latest checkpoint location"
Latest checkpoint location: 0/DE000028
Latest checkpoint's REDO location: 0/DE000028
Шаг 5. Проверка записи CHECKPOINT_SHUTDOWN в WAL
На этапе выполняется проверка записи CHECKPOINT_SHUTDOWN по адресу LSN, полученному на предыдущем этапе анализа контрольной точки. Значение LSN 0/DE000028 соответствует результату проверки в подразделе выше.
Основной узел:
pg_waldump -t 2 -p /pgdata/06/data/pg_wal -s 0/DE000028
pg_waldump: WAL file is found: "/pgdata/06/data/pg_wal/00000002000000000000009E".
pg_waldump: WAL is not encrypted.
rmgr: XLOG len (rec/tot): 148/148, tx: 0, lsn: 0/DE000028, prev 0/DD83E780, desc: CHECKPOINT_SHUTDOWN redo 0/DE000028; tli 2; prev tli 2; fpw true; xid 77624; oid 19104; multi 203; offset 405; oldest xid 771 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
pg_waldump: error: error in WAL record at 0/DE000028: invalid record length at 0/DE0000C0: wanted 26, got 0
Резервный узел:
pg_waldump -t 2 -p /pgdata/06/data/pg_wal -s 0/DE000028
pg_waldump: WAL file is found: "/pgdata/06/data/pg_wal/00000002000000000000009E".
pg_waldump: WAL is not encrypted.
rmgr: XLOG len (rec/tot): 148/148, tx: 0, lsn: 0/DE000028, prev 0/DD83E780, desc: CHECKPOINT_SHUTDOWN redo 0/DE000028; tli 2; prev tli 2; fpw true; xid 77624; oid 19104; multi 203; offset 405; oldest xid 771 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
pg_waldump: error: error in WAL record at 0/DE000028: record with incorrect prev-link 15D00000/10000A00 at 0/DE0000C0
Шаг 6. Анализ изменений через pg_resetwal (режим предварительного просмотра)
На этапе выполняется предварительный анализ изменений, которые будут применены утилитой pg_resetwal при выполнении операции с фактическим изменением размера сегментов журнала WAL. Команда выводит текущие параметры pg_control и перечень значений, подлежащих изменению.
Основной узел:
pg_resetwal --dry-run --wal-segsize=256 -D /pgdata/06/data/
Current pg_control values:
pg_control version number: 1300
Catalog version number: 202409231
Database system identifier: 7498207218355021637
Latest checkpoint's TimeLineID: 2
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID: 77624
Latest checkpoint's NextOID: 19104
Latest checkpoint's NextMultiXactId: 203
Latest checkpoint's NextMultiOffset: 405
Latest checkpoint's oldestXID: 771
Latest checkpoint's oldestXID's DB: 1
Latest checkpoint's oldestActiveXID: 0
Latest checkpoint's oldestMultiXid: 1
Latest checkpoint's oldestMulti's DB: 1
Latest checkpoint's oldestCommitTsXid:0
Latest checkpoint's newestCommitTsXid:0
Maximum data alignment: 8
Database block size: 8192
Blocks per segment of large relation: 131072
WAL block size: 8192
Bytes per WAL segment: 16777216
Maximum length of identifiers: 128
Maximum columns in an index: 32
Maximum size of a TOAST chunk: 1996
Size of a large-object chunk: 2048
Date/time type storage: 64-bit integers
Float8 argument passing: by value
Data page checksum version: 1
Values to be changed:
First log segment after reset: 00000002000000000000000F
Bytes per WAL segment: 268435456
Резервный узел:
pg_resetwal --dry-run --wal-segsize=256 -D /pgdata/06/data/
Current pg_control values:
pg_control version number: 1300
Catalog version number: 202409231
Database system identifier: 7498207218355021637
Latest checkpoint's TimeLineID: 2
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID: 77624
Latest checkpoint's NextOID: 19104
Latest checkpoint's NextMultiXactId: 203
Latest checkpoint's NextMultiOffset: 405
Latest checkpoint's oldestXID: 771
Latest checkpoint's oldestXID's DB: 1
Latest checkpoint's oldestActiveXID: 0
Latest checkpoint's oldestMultiXid: 1
Latest checkpoint's oldestMulti's DB: 1
Latest checkpoint's oldestCommitTsXid:0
Latest checkpoint's newestCommitTsXid:0
Maximum data alignment: 8
Database block size: 8192
Blocks per segment of large relation: 131072
WAL block size: 8192
Bytes per WAL segment: 16777216
Maximum length of identifiers: 128
Maximum columns in an index: 32
Maximum size of a TOAST chunk: 1996
Size of a large-object chunk: 2048
Date/time type storage: 64-bit integers
Float8 argument passing: by value
Data page checksum version: 1
Values to be changed:
First log segment after reset: 00000002000000000000000F
Bytes per WAL segment: 268435456
Шаг 7. Применение pg_resetwal для изменения размера сегментов WAL
На данном этапе выполняется реальное изменение размера сегментов WAL. После завершения в каталоге pg_wal будет создан один новый сегмент требуемого размера (в примере — 256 МБ).
Основной узел:
pg_resetwal --wal-segsize=256 -D /pgdata/06/data/
Write-ahead log reset
ll $PGDATA/pg_wal/
total 262156
-rw------- 1 postgres postgres 268435456 May 6 08:43 00000002000000000000000F
-rw------- 1 postgres postgres 41 Apr 28 06:55 00000002.history
drwx------ 2 postgres postgres 4096 Apr 28 06:53 archive_status
Резервный узел:
Первый запуск выдает предупреждение. Необходимо выполнить команду с ключом -f:
pg_resetwal --wal-segsize=256 -D /pgdata/06/data/
The database server was not shut down cleanly.
Resetting the write-ahead log might cause data to be lost.
If you want to proceed anyway, use -f to force reset.
Команда с принудительным параметром:
pg_resetwal -f --wal-segsize=256 -D /pgdata/06/data/
Write-ahead log reset
ll $PGDATA/pg_wal/
total 262152
-rw------- 1 postgres postgres 268435456 May 6 08:43 00000002000000000000000F
-rw------- 1 postgres postgres 41 Apr 28 06:55 00000002.history
drwx------ 2 postgres postgres 4096 May 6 08:43 archive_status
Шаг 8. Проверка корректности сгенерированного сегмента WAL
На этапе проверяется запись CHECKPOINT_SHUTDOWN, созданная после применения pg_resetwal, на обоих узлах.
Основной узел:
pg_waldump -p $PGDATA/pg_wal 00000002000000000000000F
pg_waldump: WAL file is found: "/pgdata/06/data/pg_wal/00000002000000000000000F".
pg_waldump: could not find a valid record at 0/F00000C0 in WAL file "00000002000000000000000F": invalid record length at 0/F00000C0: wanted 26, got 0.
pg_waldump: WAL is not encrypted.
rmgr: XLOG len (rec/tot): 148/148, tx: 0, lsn: 0/F0000028, prev 0/00000000, desc: CHECKPOINT_SHUTDOWN redo 0/F0000028; tli 2; prev tli 2; fpw true; xid 77624; oid 19104; multi 203; offset 405; oldest xid 771 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
pg_waldump: error: error in WAL record at 0/F0000028: invalid record length at 0/F00000C0: wanted 26, got 0
Резервный узел:
pg_waldump -p $PGDATA/pg_wal 00000002000000000000000F
pg_waldump: WAL file is found: "/pgdata/06/data/pg_wal/00000002000000000000000F".
pg_waldump: could not find a valid record at 0/F00000C0 in WAL file "00000002000000000000000F": invalid record length at 0/F00000C0: wanted 26, got 0.
pg_waldump: WAL is not encrypted.
rmgr: XLOG len (rec/tot): 148/148, tx: 0, lsn: 0/F0000028, prev 0/00000000, desc: CHECKPOINT_SHUTDOWN redo 0/F0000028; tli 2; prev tli 2; fpw true; xid 77624; oid 19104; multi 203; offset 405; oldest xid 771 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
pg_waldump: error: error in WAL record at 0/F0000028: invalid record length at 0/F00000C0: wanted 26, got 0
Шаг 9. Запуск основного узла в режиме single user
Перед запуском в режиме single user необходимо учитывать, что после применения утилиты pg_resetwal файл pg_control будет содержать параметр wal_level в состоянии minimal. Этот уровень журналирования является ожидаемым вследствие выполнения операции сброса журнала WAL.
Режим single user позволяет выполнить внутренние операции PostgreSQL и обновить управляющий файл pg_control, не создавая новых пользовательских транзакций.
Проверка параметра wal_level до запуска:
pg_controldata | grep wal_level
wal_level setting: minimal
Запуск PostgreSQL в режиме single user:
postgres --single
...
2025-05-06 09:09:50 MSK [2028845]: [12-1] app=[unknown],user=postgres,db=postgres,client=[tty],type=single mode LOG: AUDIT: SESSION, CONNECTION, OPEN,database = postgres,user = postgres
PostgreSQL stand-alone backend 15.5
backend>
Завершение режима выполняется комбинацией Ctrl+D.
Проверка параметра wal_level после запуска:
pg_controldata | grep wal_level
wal_level setting: replica
Проверка появившихся записей в WAL:
pg_waldump -p $PGDATA/pg_wal 00000002000000000000000F
pg_waldump: WAL file is found: "/pgdata/06/data/pg_wal/00000002000000000000000F".
pg_waldump: WAL is not encrypted.
rmgr: XLOG len (rec/tot): 148/148, tx: 0, lsn: 0/F0000028, prev 0/00000000, desc: CHECKPOINT_SHUTDOWN redo 0/F0000028; tli 2; prev tli 2; fpw true; xid 77624; oid 19104; multi 203; offset 405; oldest xid 771 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
rmgr: XLOG len (rec/tot): 56/56, tx: 0, lsn: 0/F00000C0, prev 0/F0000028, desc: PARAMETER_CHANGE max_connections=110 max_worker_processes=32 max_wal_senders=10 max_prepared_xacts=12 max_locks_per_xact=64 wal_level=replica wal_log_hints=on track_commit_timestamp=off
rmgr: XLOG len (rec/tot): 148/148, tx: 0, lsn: 0/F00000F8, prev 0/F00000C0, desc: CHECKPOINT_SHUTDOWN redo 0/F00000F8; tli 2; prev tli 2; fpw true; xid 77624; oid 19104; multi 203; offset 405; oldest xid 771 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
pg_waldump: error: error in WAL record at 0/F00000F8: invalid record length at 0/F0000190: wanted 26, got 0
Шаг 10. Копирование файла pg_control на резервный узел
Действие синхронизирует управляющий файл pg_control между узлами и предотвращает необходимость полной реинициализации резерва:
scp /pgdata/06/data/global/pg_control <server_replica>:/pgdata/06/data/global/
Шаг 11. Запуск основного и резервного узла PostgreSQL
После копирования pg_control выполняется запуск обоих узлов.
Запуск основного узла:
pg_ctl start
...
done
server started
Запуск резервного узла:
pg_ctl start
...
done
server started
Проверка состояния кластера:
+ Cluster: <cluster_name> (7498207218355021637)+--------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+------------------+---------------------------+--------------+-----------+----+-----------+
| <server_primary> | <server_primary>:5433 | Leader | running | 2 | |
| <server_replica> | <server_replica>:5433 | Sync Standby | streaming | 2 | 0 |
+------------------+---------------------------+--------------+-----------+----+-----------+
Maintenance mode: on
Проверка параметров через pg_controldata:
Основной узел:
pg_controldata | grep "Latest checkpoint location"
Latest checkpoint location: 0/F00000F8
Резервный узел:
pg_controldata | grep "Latest checkpoint location"
Latest checkpoint location: 0/F00000F8
Просмотр состояния в DCS:
/service/<cluster_name>/members/<server_primary>
{'conn_url': 'postgres://<server_primary>:5433/postgres', 'api_url': 'http://<server_primary>:8008/patroni', 'state': 'running', 'role': 'master', 'version': '3.2.0', 'xlog_location': 4026582536, 'timeline': 2, 'pause': True}
----
/service/<cluster_name>/members/<server_replica>
{'conn_url': 'postgres://<server_replica>:5433/postgres', 'api_url': 'http://<server_replica>:8008/patroni', 'state': 'running', 'role': 'replica', 'version': '3.2.0', 'xlog_location': 4026582536, 'replication_state': 'streaming', 'timeline': 2, 'pause': True}
Шаг 12. Выход кластера из режима обслуживания
На завершающем этапе кластер возвращается в штатный режим работы:
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml resume <cluster_name>
Success: cluster management is resumed
Проверка состояния:
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list <cluster_name>
+ Cluster: <cluster_name> (7498207218355021637)+--------------+-----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+------------------+---------------------------+--------------+-----------+----+-----------+
| <server_primary> | <server_primary>:5433 | Leader | running | 2 | |
| <server_replica> | <server_replica>:5433 | Sync Standby | streaming | 2 | 0 |
+------------------+---------------------------+--------------+-----------+----+-----------+
Изменение размера сегментов WAL в Pangolin 5.5.*
В разделе описан порядок выполнения процедуры увеличения размера сегментов WAL в кластере PostgreSQL под управлением Pangolin 5.5.*.
Мониторинг состояния сегментов WAL и параметров кластера
Перед выполнением операций рекомендуется организовать непрерывный мониторинг состояния файлов WAL, логов PostgreSQL и управляющей информации кластера под управлением Patroni.
Базовый мониторинг
Команда позволяет контролировать изменения в директории pg_wal, служебные логи и текущее состояние кластера.
watch -n 0.5 "ls -lt /pgdata/05/data/pg_wal/ | head -n 6; \
echo '----'; \
ls -lt /pgerrorlogs/05/ | head -n 5; \
echo '----'; \
patronictl -c /etc/patroni/postgres.yml list <cluster_name>"
Расширенный мониторинг с использованием ETCD
Этот вариант позволяет дополнительно контролировать параметры узлов, полученные напрямую из ETCD, а также состояние управляющего файла pg_control.
ETCDCTL_API=2 watch -n 0.5 "ls -lt /pgdata/05/data/pg_wal/ | head -n 6; \
echo '----'; \
ls -lt /pgerrorlogs/05/ | head -n 5; \
echo '----'; \
patronictl -c /etc/patroni/postgres.yml list <cluster_name>; \
echo '----'; \
etcdctl -u <username>:<password> get /service/<cluster_name>/members/<server_primary>; \
echo '----'; \
etcdctl -u <username>:<password> get /service/<cluster_name>/members/<server_replica>; \
echo '----'; \
ls -lt /pgdata/05/data/global | grep pg_control"
Пример полного вывода мониторинга
Every 0.5s: ls -lt /pgdata/05/data/pg_wal/ | head -n 6; echo '----'; ls -lt /pgerrorlogs/05/ |... <server_replica>: Wed May 7 06:32:26 2025
total 81928
-rw------- 1 postgres postgres 16777216 May 7 06:31 000000020000000000000006
drwx------ 2 postgres postgres 4096 May 7 06:30 archive_status
-rw------- 1 postgres postgres 16777216 May 7 06:30 000000020000000000000005
-rw------- 1 postgres postgres 16777216 May 7 06:21 000000020000000000000004
-rw------- 1 postgres postgres 16777216 May 7 06:18 000000020000000000000003
----
total 48
-rw-r--r-- 1 postgres postgres 3334 May 7 06:32 pgbouncer.log
-rw-r--r-- 1 postgres postgres 35815 May 7 06:30 postgresql-2025-05-07_061211.log
drwx------ 2 postgres postgres 4096 May 7 06:08 pg_certs_rotate_agent
----
+ Cluster: <cluster_name> (7501535780208252192)+--------------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+------------------+---------------------------+--------------+---------+----+-----------+
| <server_primary> | <server_primary>:5433 | Leader | running | 2 | |
| <server_replica> | <server_replica>:5433 | Sync Standby | running | 2 | 0 |
+------------------+---------------------------+--------------+---------+----+-----------+
----
{"conn_url":"postgres://<server_primary>:5433/postgres","api_url":"http://<server_primary>:8008/patroni","state":"running","role":"master","version":"2.1.1","xlog_location":101008408,"timeline":2}
----
{"conn_url":"postgres://<server_replica>:5433/postgres","api_url":"http://<server_replica>:8008/patroni","state":"running","role":"replica","version":"2.1.1","xlog_location":101008408,"timeline":2}
----
-rw------- 1 postgres postgres 8192 May 7 06:16 pg_control
Процедура изменения размера WAL
Далее приведена пошаговая процедура изменения размера сегментов WAL в кластере под управлением Pangolin 5.5.*.
Шаг 1. Выполнение контрольной точки на обоих узлах
Контрольная точка очищает грязные страницы и завершает активные WAL-сегменты, что требуется перед изменением размера сегментов.
Основной узел:
psql
psql (13.8)
Type "help" for help.
postgres=# checkpoint;
CHECKPOINT
postgres=# exit;
Резервный узел:
psql -h <server_replica> -p 5433 -U postgres
psql (13.8)
Type "help" for help.
postgres=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
postgres=# checkpoint;
CHECKPOINT
postgres=# \q
Шаг 2. Перевод Patroni в режим обслуживания
На данном этапе Patroni переводится в режим обслуживания, что запрещает переключение ролей в кластере:
patronictl -c /etc/patroni/postgres.yml pause <cluster_name>
Success: cluster management is paused
Шаг 3. Остановка PostgreSQL на обоих узлах
Остановка позволяет подготовить оба узла к дальнейшим действиям, связанным с изменением структуры журналов WAL.
Основной узел:
pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped
pg_ctl status
pg_ctl: no server running
Резервный узел:
pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped
pg_ctl status
pg_ctl: no server running
Шаг 4. Проверка совпадения контрольных точек
На этапе подтверждается, что основные структурные данные журнала WAL одинаковы на обоих узлах. Значения должны совпадать на обоих узлах.
Основной узел:
pg_controldata | grep -P "Latest checkpoint location|Latest checkpoint's REDO location"
Latest checkpoint location: 0/11000028
Latest checkpoint's REDO location: 0/11000028
Резервный узел:
pg_controldata | grep -P "Latest checkpoint location|Latest checkpoint's REDO location"
Latest checkpoint location: 0/11000028
Latest checkpoint's REDO location: 0/11000028
Шаг 5. Проверка записи CHECKPOINT_SHUTDOWN в WAL
Здесь выполняется поиск записи CHECKPOINT_SHUTDOWN, подтверждающей корректное завершение контрольной точки.
Основной узел:
pg_waldump -t 2 -p /pgdata/05/data/pg_wal -s 0/11000028
pg_waldump: WAL file is found: "/pgdata/05/data/pg_wal/000000010000000000000001".
pg_waldump: WAL is not encrypted.
rmgr: XLOG len (rec/tot): 114/114, tx: 0, lsn: 0/11000028, prev 0/10000148, desc: CHECKPOINT_SHUTDOWN redo 0/11000028; tli 2; prev tli 2; fpw true; xid 0:4950; oid 17987; multi 7; offset 13; oldest xid 513 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
pg_waldump: fatal: error in WAL record at 0/11000028: invalid record length at 0/110000A0: wanted 24, got 0
Резервный узел:
pg_waldump -t 2 -p /pgdata/05/data/pg_wal -s 0/11000028
pg_waldump: WAL file is found: "/pgdata/05/data/pg_wal/000000020000000000000002".
pg_waldump: WAL is not encrypted.
rmgr: XLOG len (rec/tot): 114/114, tx: 0, lsn: 0/11000028, prev 0/10000148, desc: CHECKPOINT_SHUTDOWN redo 0/11000028; tli 2; prev tli 2; fpw true; xid 0:4950; oid 17987; multi 7; offset 13; oldest xid 513 in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 0; shutdown
pg_waldump: fatal: error in WAL record at 0/11000028: invalid record length at 0/110000A0: wanted 24, got 0
Шаг 6. Анализ pg_resetwal в режиме предварительного просмотра
На данном этапе команда позволяет предварительно оценить будущие изменения перед реальным выполнением операции.
Основной узел:
pg_resetwal --dry-run --wal-segsize=256 -D /pgdata/05/data/
Current pg_control values:
pg_control version number: 1300
Catalog version number: 202306131
Database system identifier: 7501535780208252192
Latest checkpoint's TimeLineID: 2
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID: 0:4950
Latest checkpoint's NextOID: 17987
Latest checkpoint's NextMultiXactId: 7
Latest checkpoint's NextMultiOffset: 13
Latest checkpoint's oldestXID: 513
Latest checkpoint's oldestXID's DB: 1
Latest checkpoint's oldestActiveXID: 0
Latest checkpoint's oldestMultiXid: 1
Latest checkpoint's oldestMulti's DB: 1
Latest checkpoint's oldestCommitTsXid:0
Latest checkpoint's newestCommitTsXid:0
Maximum data alignment: 8
Database block size: 8192
Blocks per segment of large relation: 131072
WAL block size: 8192
Bytes per WAL segment: 16777216
Maximum length of identifiers: 128
Maximum columns in an index: 32
Maximum size of a TOAST chunk: 1996
Size of a large-object chunk: 2048
Date/time type storage: 64-bit integers
Float8 argument passing: by value
Data page checksum version: 1
Values to be changed:
First log segment after reset: 000000020000000000000002
Bytes per WAL segment: 268435456
Резервный узел:
pg_resetwal --dry-run --wal-segsize=256 -D /pgdata/05/data/
Current pg_control values:
... (поля идентичны основному узлу)
Values to be changed:
First log segment after reset: 000000020000000000000002
Bytes per WAL segment: 268435456
Шаг 7. Изменение размера WAL на основном узле
На данном этапе на основном узле выполняется реальное изменение размера сегментов WAL.
pg_resetwal --wal-segsize=256 -D /pgdata/05/data/
Write-ahead log reset
ll $PGDATA/pg_wal/
total 262156
-rw------- 1 postgres postgres 268435456 May 7 07:57 000000020000000000000002
-rw------- 1 postgres postgres 41 May 7 06:11 00000002.history
drwx------ 2 postgres postgres 4096 May 7 06:10 archive_status
Шаг 8. Изменение размера WAL на резервном узле
Здесь на резервном узле выполняется принудительное изменение размера сегментов WAL.
pg_resetwal -f --wal-segsize=256 -D /pgdata/05/data/
Write-ahead log reset
ll $PGDATA/pg_wal/
total 262156
-rw------- 1 postgres postgres 268435456 May 7 07:57 000000020000000000000002
-rw------- 1 postgres postgres 41 May 7 06:12 00000002.history
drwx------ 2 postgres postgres 4096 May 7 07:57 archive_status
При расхождении имени ожидаемого сегмента WAL на резервном узле допускается использование параметра -l для явного указания требуемого значения LSN. Это необходимо в ситуациях, когда номер сегмента, определенный на резервном узле, отличается от значения, рассчитанного основным узлом.
Шаг 9. Проверка новой записи WAL
После изменения размера необходимо убедиться, что записи WAL корректно считываются на обоих узлах.
Основной узел:
pg_waldump -p $PGDATA/pg_wal 000000020000000000000002
pg_waldump: WAL file is found: "/pgdata/05/data/pg_wal/000000020000000000000002".
pg_waldump: could not find a valid record at 0/200000A0 in WAL file "000000020000000000000002": invalid record length at 0/200000A0: wanted 24, got 0.
pg_waldump: WAL is not encrypted.
rmgr: XLOG len (rec/tot): 114/114, tx: 0, lsn: 0/20000028, prev 0/00000000, desc: CHECKPOINT_SHUTDOWN redo 0/20000028; tli 2; prev tli 2; fpw true; xid 0:4950...
pg_waldump: fatal: error in WAL record at 0/20000028: invalid record length at 0/200000A0: wanted 24, got 0
Резервный узел:
pg_waldump -p $PGDATA/pg_wal 000000020000000000000002
pg_waldump: WAL file is found: "/pgdata/05/data/pg_wal/000000020000000000000002".
pg_waldump: could not find a valid record at 0/200000A0 in WAL file "000000020000000000000002": invalid record length at 0/200000A0: wanted 24, got 0.
pg_waldump: WAL is not encrypted.
rmgr: XLOG len (rec/tot): 114/114, tx: 0, lsn: 0/20000028, prev 0/00000000, desc: CHECKPOINT_SHUTDOWN redo 0/20000028; tli 2; prev tli 2; fpw true; xid 0:4950...
pg_waldump: fatal: error in WAL record at 0/20000028: invalid record length at 0/200000A0: wanted 24, got 0
Шаг 10. Запуск основного узла
После изменения размера WAL основной узел запускается в штатном режиме.
pg_ctl start
waiting for server to start....
2025-05-07 08:04:28 MSK [3029855]: [3-1] app=,user=,db=,client=,type=postmaster LOG: redirecting log output to logging collector process
2025-05-07 08:04:28 MSK [3029855]: [4-1] app=,user=,db=,client=,type=postmaster HINT: Future log output will appear in directory "/pgerrorlogs/05".
done
server started
Шаг 11. Отключение hot_standby на резервном узле
Перед запуском резервного узла необходимо временно отключить поддержку режима hot_standby.
nano $PGDATA/postgresql.conf
# изменить hot_standby = 'on' на hot_standby = 'off'
cat $PGDATA/postgresql.conf | grep hot_standby
hot_standby = 'off'
pg_controldata | grep wal_level
wal_level setting: minimal
Шаг 12. Запуск резервного узла
На данном этапе выполняется первое включение резервного узла после изменения параметров журнала WAL.
pg_ctl start
waiting for server to start....
2025-05-07 08:16:54 MSK [3238719]: [3-1] ...
done
server started
Состояние кластера:
+ Cluster: <cluster_name> ------+--------------+----------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+------------------+------------+--------------+----------+----+-----------+
| <server_primary> | ... | Leader | running | 2 | |
| <server_replica> | ... | Sync Standby | starting | | unknown |
+------------------+------------+--------------+----------+----+-----------+
Maintenance mode: on
Шаг 13. Остановка резервного узла, включение hot_standby и повторный запуск
После первого запуска параметр hot_standby включается обратно, и узел запускается повторно.
pg_ctl stop
waiting for server to shut down.... done
server stopped
nano $PGDATA/postgresql.conf
# hot_standby = 'on'
pg_controldata | grep wal_level
wal_level setting: replica
Запуск:
pg_ctl start
waiting for server to start....
2025-05-07 08:26:22 MSK [3257247]: [3-1] ...
done
server started
Состояние кластера:
+ Cluster: <cluster_name> ------+--------------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+------------------+------------+--------------+---------+----+-----------+
| <server_primary> | ... | Leader | running | 2 | |
| <server_replica> | ... | Sync Standby | running | 2 | 0 |
+------------------+------------+--------------+---------+----+-----------+
Maintenance mode: on
Шаг 14. Выход из режима обслуживания
На завершающем этапе Patroni возвращается в штатный режим работы.
patronictl -c /etc/patroni/postgres.yml resume <cluster_name>
Success: cluster management is resumed
Проверка:
+ Cluster: <cluster_name> ------+--------------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+------------------+------------+--------------+---------+----+-----------+
| <server_primary> | ... | Leader | running | 2 | |
| <server_replica> | ... | Sync Standby | running | 2 | 0 |
+------------------+------------+--------------+---------+----+-----------+