Обнуление сегментов WAL в Postgres

9

У нас есть относительно небольшая база данных Postgres с непрерывным архивированием, настроенным для сжатия каждого сегмента WAL и отправки его на S3. Поскольку это система с небольшим объемом, она срабатывает archive_timeoutкаждые 10 минут или около того и архивирует в основном неиспользуемый сегмент WAL, который раньше очень хорошо сжимался, поскольку в основном это были просто нули.

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

Есть ли способ уменьшить количество места, которое мы используем для хранения нашего архива WAL? Некоторые неоптимальные возможности:

  1. Не позволяйте Postgres каким-либо образом перерабатывать сегменты WAL, поэтому каждый раз он начинается с обнуленного файла. Документы не указывают, что есть возможность сделать это, но я мог пропустить это.

  2. Пусть Postgres обнулит файл сегмента WAL, когда он начинает / заканчивает его использовать. Опять же, документы, похоже, не предполагают, что это возможно.

  3. Внешне обнулите или удалите некоторые файлы сегментов WAL, пока они не используются. Есть ли безопасный способ определить, какие это файлы?

  4. Обнулите неиспользуемую часть сегмента, прежде чем архивировать ее, используя выходные данные, pg_xlogdumpчтобы определить, где начинается мусор. Возможно, хотя мне это не нравится. По крайней мере, выполнив это в команде архивирования, вы можете быть уверены, что Postgres не собирается повторно использовать файл.

  5. Только заархивируйте использованную часть файла сегмента, опять-таки, интерпретировав результат pg_xlogdumpкаким-либо образом, а затем добавьте его в нули во время восстановления. Также возможно звучит, хотя мне это не очень нравится.

Дэйв Тернер
источник
Интересная проблема. Могу я спросить, для чего вы используете непрерывное архивирование?
Дезсо
@dezso Несмотря на низкий отток, считается очень важным максимально снизить риск потери любых из этих данных и отслеживать результаты внесенных изменений. Архивирование WAL является последней линией защиты (есть и другие механизмы в игре), поэтому было бы неплохо сохранить его дешевым.
Дейв Тернер

Ответы:

5

Начиная с версии 9.4, теперь он автоматически обнуляет конечный конец файла WAL. (На самом деле это просто ноль, есть некоторые заголовки блоков, которые не обнуляются, но все же результат очень сжимаемый).

В версии 9.2 есть программа, которую pg_clearxlogtailвы можете использовать. Вы можете добавить его в вашу команду archive_command перед этапом сжатия.

Если вы используете 9.3, вам не повезло.

Обратите внимание, что контрольные точки по сути не вызывают переключение файлов журнала. Это вероятно archive_timeout, который вызывает переключатели.

jjanes
источник
D'о. Да, мы на 9.3, так что проскользнули сквозь щель между этими двумя решениями. И да, извините, вы правы, именно archive_timeoutэто вызывает переключатели. Исправил ОП, спасибо.
Дейв Тернер