Нульові сегменти 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

@dezso Незважаючи на низький розмір, це вважається дуже важливим, щоб зменшити ризик втратити будь-яку з цих даних, наскільки це можливо, і провести аудиторський слід змін, які вносяться. Архівування WAL - це остання лінія захисту (в грі також є інші механізми), тому зберігати її дешево було б добре.
Дейв Тернер

Відповіді:


5

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

У версії 9.2 є програма, pg_clearxlogtailяку ви можете використовувати. Ви можете додати його до свого архіву_команди перед кроком стиснення.

Якщо ви використовуєте 9.3, вам не пощастило.

Зверніть увагу, що контрольно-пропускні пункти не є причиною перемикань файлів журналу. Ймовірно, архів_timeout є причиною комутаторів.


D'oh. Так, ми на 9,3, тому проскочили тріщину між цими двома рішеннями. І так, вибачте, ти маєш рацію, що archive_timeoutце викликає вимикачі. Виправив ОП, спасибі.
Дейв Тернер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.