Zerowanie segmentów WAL w Postgres

9

Mamy relatywnie małą bazę danych Postgres z ciągłą archiwizacją skonfigurowaną do kompresji każdego segmentu WAL i wysłania go do S3. Ponieważ jest to system o niskim poziomie głośności, uderza archive_timeoutco około 10 minut i archiwizuje najczęściej nieużywany segment WAL, który kiedyś bardzo dobrze się kompresował, ponieważ był to po prostu zero.

Jednak Postgres przetwarza swoje segmenty WAL, aby uniknąć kosztów przydzielania nowych plików na każdym przełączniku WAL, co jest przydatne w sytuacji dużego obciążenia, ale oznacza to, że po serii intensywniejszych działań nasze pliki segmentów WAL są teraz pełne śmieci z poprzednich segmentów i wcale się nie kompresują. Przechowujemy wiele kopii wszystkich tych śmieci.

Czy istnieje sposób na zmniejszenie ilości miejsca używanego do przechowywania naszego archiwum WAL? Niektóre nieoptymalne możliwości:

  1. Zapobiegaj ponownemu przetworzeniu przez Postgres segmentów WAL, więc zaczyna się od wyzerowanego pliku za każdym razem. Dokumenty nie wskazują, że istnieje taka możliwość, ale mogłem to przegapić.

  2. Niech Postgres wyzeruje plik segmentu WAL, gdy zaczyna / kończy go używać. Ponownie, dokumenty nie wydają się sugerować, że jest to możliwe.

  3. Zewnętrznie wyzeruj lub usuń niektóre pliki segmentów WAL, gdy nie są one używane. Czy istnieje bezpieczny sposób na określenie, które to pliki?

  4. Zeruj nieużywaną część segmentu przed zarchiwizowaniem go za pomocą danych wyjściowych z, pg_xlogdumpaby znaleźć miejsce, w którym zaczyna się śmieci. Możliwe, chociaż mi się nie podoba. Przynajmniej robiąc to w poleceniu archiwizacji możesz być pewien, że Postgres nie zamierza ponownie użyć pliku.

  5. Archiwizuj tylko zużytą część pliku segmentu, ponownie interpretując dane wyjściowe pg_xlogdump, a następnie wypełniając je zerami podczas przywracania. Brzmi również możliwe, chociaż tak naprawdę nie lubię tego.

Dave Turner
źródło
Ciekawy problem. Czy mogę zapytać, do jakiej ciągłej archiwizacji używasz?
dezso
@dezso Pomimo niskiej rezygnacji, bardzo ważne jest zmniejszenie ryzyka utraty któregokolwiek z tych danych w najszerszym możliwym zakresie i posiadanie ścieżki audytu wprowadzanych zmian. Archiwizacja WAL jest ostatnią linią obrony (w grze są też inne mechanizmy), więc utrzymanie go w dobrym stanie byłoby dobre.
Dave Turner

Odpowiedzi:

5

Począwszy od wersji 9.4, teraz automatycznie zeruje koniec pliku WAL. (W rzeczywistości jest to po prostu zero, istnieją nagłówki bloków, które nie są zerowane, ale wynik jest bardzo ściśliwy).

W wersji 9.2 dostępny jest program o nazwie, pg_clearxlogtailktórego można użyć. Możesz dodać go do swojego polecenia archive_command przed krokiem kompresji.

Jeśli używasz 9.3, nie masz szczęścia.

Należy pamiętać, że punkty kontrolne z natury nie powodują przełączania plików dziennika. Prawdopodobnie jest to czas_archiwizacji, który powoduje przełączenia.

jjanes
źródło
Nie. Tak, korzystamy z wersji 9.3, więc przeszliśmy przez szczelinę między tymi dwoma rozwiązaniami. I tak, przepraszam, masz rację, to archive_timeoutpowoduje przełączniki. Poprawiłem OP, dzięki.
Dave Turner