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_timeout
co 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:
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ć.
Niech Postgres wyzeruje plik segmentu WAL, gdy zaczyna / kończy go używać. Ponownie, dokumenty nie wydają się sugerować, że jest to możliwe.
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?
Zeruj nieużywaną część segmentu przed zarchiwizowaniem go za pomocą danych wyjściowych z,
pg_xlogdump
aby 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.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.