Chúng tôi có cơ sở dữ liệu Postgres khối lượng tương đối thấp với lưu trữ liên tục được thiết lập để nén từng phân đoạn WAL và gửi đến S3. Bởi vì nó là một hệ thống âm lượng thấp, archive_timeout
cứ sau 10 phút lại có một hệ thống lưu trữ và không lưu trữ phân khúc WAL hầu như không được sử dụng, vốn được sử dụng để nén rất tốt vì nó chủ yếu chỉ là số không.
Tuy nhiên, Postgres tái chế các phân đoạn WAL của mình để tránh chi phí phân bổ các tệp mới tại mỗi công tắc WAL, điều này rất hữu ích trong tình huống tải cao nhưng điều đó có nghĩa là sau một loạt hoạt động nặng hơn bình thường, các tệp phân đoạn WAL của chúng tôi đã đầy rác từ các phân khúc trước và không nén rất tốt. Chúng tôi đang lưu trữ rất nhiều bản sao của tất cả những thứ linh tinh này.
Có cách nào để giảm dung lượng chúng tôi sử dụng để lưu trữ WAL không? Một số khả năng tối ưu:
Ngăn chặn Postgres tái chế các phân đoạn WAL bằng cách nào đó, do đó, nó bắt đầu với một tệp zeroed mỗi lần. Các tài liệu không chỉ ra rằng có một tùy chọn để làm điều này nhưng tôi có thể đã bỏ lỡ nó.
Có Postgres zero tệp phân đoạn WAL khi nó bắt đầu / kết thúc bằng cách sử dụng nó. Một lần nữa, các tài liệu dường như không đề xuất điều này là có thể.
Không có bên ngoài hoặc xóa một số tệp phân đoạn WAL trong khi chúng không được sử dụng. Có cách nào an toàn để xác định đây là tập tin nào không?
Không có phần không được sử dụng của phân khúc trước khi lưu trữ nó bằng cách sử dụng đầu ra từ
pg_xlogdump
để tìm nơi rác bắt đầu. Có thể, mặc dù tôi không thích nó. Ít nhất bằng cách thực hiện điều này trong lệnh lưu trữ, bạn có thể chắc chắn rằng Postgres sẽ không sử dụng lại tệp.Chỉ lưu trữ phần được sử dụng của tệp phân đoạn, một lần nữa bằng cách diễn giải đầu ra của một
pg_xlogdump
cách nào đó, sau đó đệm nó bằng các số 0 trong quá trình khôi phục. Cũng có thể âm thanh mặc dù tôi không thực sự ưa thích nó.