Чистка архива WAL в реплицируемых базах Postgresql

by Anton Chernousov aka GITA-DEV


Опубликовано: 18 Сен 2018 (последние правки 1 месяц)


Чистка архива WAL в реплицируемых базах Postgresql

Потоковая репликация Postgresql это конечно круто, но есть у этой технологии и немного минусов. Во первых, при активной записи и обновлении данных генерируется довольно много трафика и я на одном из микро-тарифов довольно быстро вышел за лимиты, а во вторых, WAL-логи при активной записи и обновлении данных в базе Postgresql очень быстро разрастаются и начинают занимать гораздо больше места, чем сама база данных. Сегодня мы будем решать вторую проблему.

Официальная дока на тему находится по адресу https://www.postgresql.org/docs/9.2/static/pgarchivecleanup.html Я же продемонстрирую немного практики, как раз на том сервере который вышел за все допустимые лимиты.

Сейчас наблюдается такая картина

# du -hs /var/lib/postgresql/10/archive/
2.6G   /var/lib/postgresql/10/archive/
# du -hs /var/lib/postgresql/10/main/
1.3G   /var/lib/postgresql/10/main/

Размер архив-логов в два раза больше чем сама база (что логично) поэтому мы можем или чистить архив-логи автоматически или производить эти операции вручную.

Можно почистить архив в ручном режиме и для этого мы создаем точку backup на мастер-сервере (задаем ей метку):

# su postgres
$ psql
# SELECT pg_start_backup('test-archive-clean', true);
# SELECT pg_stop_backup();

В чистом виде нас интересует исключительно создание backup-файла в архиве WAL:

$ ls /var/lib/postgresql/10/archive/ | grep backup
00000001000000000000000E.00000028.backup
0000000100000000000000AD.00000028.backup

Проверяем состояние репликации (текущую позицию) у MASTER-сервера:

# select pg_current_wal_lsn();
 pg_current_wal_lsn
--------------------
 0/AE1D8000
(1 row)

На Slave-сервере:
# select pg_last_wal_replay_lsn();
 pg_last_wal_replay_lsn
------------------------
 0/AE1E9A68
(1 row)

На Slave-сервере принудительно выполним очистку архива wal-логов до текущей backup-точки:

$ pg_archivecleanup -d /var/lib/postgresql/10/archive/ 0000000100000000000000AD.00000028.backup

В результате выполнения команды будет выведен список удаленных файлов журнала:

$ pg_archivecleanup -d /var/lib/postgresql/10/archive/ 0000000100000000000000AD.00000028.backup
pg_archivecleanup: keeping WAL file "/var/lib/postgresql/10/archive//0000000100000000000000AD" and later
pg_archivecleanup: removing file "/var/lib/postgresql/10/archive//00000001000000000000005B"
...
pg_archivecleanup: removing file "/var/lib/postgresql/10/archive//0000000100000000000000A5"
pg_archivecleanup: removing file "/var/lib/postgresql/10/archive//000000010000000000000015"

Теперь архив содерхит только следующие записи:

$ ls -lua /var/lib/postgresql/10/archive/
total 131096
drwxr-xr-x 2 postgres postgres   12288 Aug 28 2018 .
drwxr-xr-x 4 postgres postgres    4096 Aug 28 09:22 ..
-rw------- 1 postgres postgres     304 Aug 1 14:56 00000001000000000000000E.00000028.backup
-rw------- 1 postgres postgres 16777216 Aug 28 09:34 0000000100000000000000AD
-rw------- 1 postgres postgres     305 Aug 28 09:34 0000000100000000000000AD.00000028.backup
-rw------- 1 postgres postgres 16777216 Aug 28 10:05 0000000100000000000000AE
-rw------- 1 postgres postgres 16777216 Aug 28 10:11 0000000100000000000000AF
-rw------- 1 postgres postgres 16777216 Aug 28 10:29 0000000100000000000000B0
-rw------- 1 postgres postgres 16777216 Aug 28 10:39 0000000100000000000000B1
-rw------- 1 postgres postgres 16777216 Aug 28 10:49 0000000100000000000000B2
-rw------- 1 postgres postgres 16777216 Aug 28 11:03 0000000100000000000000B3
-rw------- 1 postgres postgres 16777216 Aug 28 11:11 0000000100000000000000B4

Для автоматической очистки мы добавим в файл /var/lib/postgresql/10/main/recovery.conf параметр:

archive_cleanup_command = 'pg_archivecleanup -d /var/lib/postgresql/10/archive/ %r >> /var/log/postgresql/cleanup.log 2>&1'

Перезапускаем Postgresql:

# /etc/init.d/postgresql restart

Проверяем лог чистки архива:

pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000AD"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000AF"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B0"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B4"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B3"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B2"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B1"
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000AE"
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B5" и последующие
pg_archivecleanup: будет сохранён файл WAL "/var/lib/postgresql/10/archive//0000000100000000000000B6" и последующие
pg_archivecleanup: удаление файла "/var/lib/postgresql/10/archive//0000000100000000000000B5"

Чистить wal-логи надо обязательно, на интенсивных операциях обновления и записи они разрастаются неприлично быстро.



Обратите внимание на статьи:


Настройка потоковой репликации Postgresql сервера (WAL-репликация)

Настройка потоковой репликации Postgresql сервера (WAL-репликация)

Потоковая репликация Postgresql сервера позволяет создать асинхронную Read Only копию сервера баз данных который можно использовать как FailOver-сервер или строить на нем какие-то тяжелые аналитические отчеты которые бы в свою очередь сильно загрузили боевой сервер. Назначений можно придумать огромное множество, да и настраивается эта технология довольно просто, правда есть у нее есть и несколько недостатков.


Установка свежих версий Postgresql (10.X) в Debian Linux

Установка свежих версий Postgresql (10.X) в Debian Linux

В LTS-версии дистрибутивов обычно входят такие-же LTS версии пакетов и в ряде случаев это конечно хорошо и стабильные обкатанные версии это гораздо лучше чем dev-ветки, но иногда требуются именно новые возможности которые появились недавно. Например мне, требовалась логическая репликация Postgresql в Debian версии 9.4, но логическая репликация появилась только в Postgresql 10, а штатный пакет в дистрибутиве имеет версию 9.6.


Легковесный почтовый сервер с хранением учетных данных в базе Postgresql

Легковесный почтовый сервер с хранением учетных данных в базе Postgresql

До этого я рассказывал исключительно о монстроидальном комплексе совместной работы под названием Zimbra и вы наверное поняли, что запустить его на небольшом VPS у вас не получится, так как он потребляет просто огромное количество системных ресурсов. Но, что же делать, если требуется собственный почтовый сервер и вы сильно ограничены в системных ресурсах? Правильный ответ, это собрать его самому из Opensource-компонентов и полученный результат удивит вас своей легковесностью.


Установка Postgresql 10.4 на платформу ARM

Установка Postgresql 10.4 на платформу ARM

Собрать Postgresql 10.4 под платформу ARM я решил для того чтобы проверить одну свою идею по поводу логической репликации. Логическая репликация это новая фишка Postgresql 10-ой версии позволяющая реплицировать в Read only режиме отдельные таблицы на другой Postgresql server. Но вот правда одна незадача выяснилась, а именно под мою ARM-платформу собранных пакетов не нашлось.


Установка Postgresql версии 10 в Ubuntu Linux и Debian Linux

Установка Postgresql версии 10 в Ubuntu Linux и Debian Linux

На данный момент,10-ая версия Postgresql является стабильной и данный релиз принес довольно много "вкусностей", таких как: логическая репликация, партиционирование, улучшена производительность физической репликации, hash-индексы стали реплицируемы, поддержка полнотекстового поиска на jsonb колонках, улучшенная поддержка работы с xml и многое другое ... Естественно, что сходу мигрировать ваш сайт или приложение на новую версию не стоит, так как в ряде случаев вам потребуется некоторая доработка для обеспечения совместимости с десятой версией.


Есть вопросы?
Спрашивайте и я обязательно вам отвечу!

* Поля обязательные для заполнения .

Блог это некоммерческий проект! Если вам понравился мой блог и то что я пишу помогло вам на практике, то можете сказать спасибо материально.