Tôi sẽ thêm một số thông tin và tài liệu tham khảo được cập nhật vào câu trả lời tuyệt vời của @ max-malysh ở trên.
Nói tóm lại, nếu bạn làm một cái gì đó trên chủ, nó cần được nhân rộng trên nô lệ. Postgres sử dụng các bản ghi WAL cho việc này, được gửi sau mỗi hành động được ghi lại trên bản gốc cho nô lệ. Các nô lệ sau đó thực hiện hành động và hai người lại đồng bộ. Trong một trong một số tình huống, bạn có thể xung đột với nô lệ với những gì đến từ chủ trong hành động WAL. Trong hầu hết trong số họ, có một giao dịch xảy ra trên nô lệ mâu thuẫn với những gì hành động WAL muốn thay đổi. Trong trường hợp đó, bạn có hai tùy chọn:
- Trì hoãn ứng dụng của hành động WAL một chút, cho phép nô lệ hoàn thành giao dịch xung đột của mình, sau đó áp dụng hành động đó.
- Hủy bỏ các truy vấn xung đột trên nô lệ.
Chúng tôi quan tâm đến # 1 và hai giá trị:
max_standby_archive_delay
- đây là độ trễ được sử dụng sau khi ngắt kết nối dài giữa chủ và phụ, khi dữ liệu đang được đọc từ kho lưu trữ WAL, đây không phải là dữ liệu hiện tại.
max_standby_streaming_delay
- độ trễ được sử dụng để hủy các truy vấn khi các mục nhập WAL được nhận thông qua sao chép phát trực tuyến.
Nói chung, nếu máy chủ của bạn có nghĩa là sao chép tính sẵn sàng cao, bạn muốn giữ những con số này ngắn. Cài đặt mặc định của 30000
(mili giây nếu không có đơn vị nào được cung cấp) là đủ cho việc này. Tuy nhiên, nếu bạn muốn thiết lập một cái gì đó như một kho lưu trữ, báo cáo hoặc đọc bản sao có thể có các truy vấn chạy rất lâu, thì bạn sẽ muốn đặt nó thành một cái gì đó cao hơn để tránh các truy vấn bị hủy. Các 900s
thiết lập được đề xuất ở trên có vẻ như là một điểm khởi đầu tốt. Tôi không đồng ý với các tài liệu chính thức về việc đặt một giá trị vô hạn -1
là một ý tưởng hay - có thể che giấu một số mã lỗi và gây ra nhiều vấn đề.
Một lưu ý về các truy vấn chạy dài và đặt các giá trị này cao hơn là các truy vấn khác chạy trên nô lệ song song với truy vấn chạy dài khiến hành động WAL bị trì hoãn sẽ thấy dữ liệu cũ cho đến khi hoàn thành truy vấn dài. Các nhà phát triển sẽ cần hiểu điều này và tuần tự hóa các truy vấn không nên chạy đồng thời.
Để được giải thích đầy đủ về cách thức max_standby_archive_delay
và max_standby_streaming_delay
công việc và tại sao, hãy vào đây .