Я собираюсь добавить обновленную информацию и ссылки на отличный ответ @ max-malysh выше.
Короче говоря, если вы делаете что-то на ведущем устройстве, его необходимо скопировать на ведомое устройство. Для этого Postgres использует записи WAL, которые отправляются после каждого зарегистрированного действия на ведущем устройстве на ведомое устройство. Затем подчиненное устройство выполняет действие, и оба снова синхронизируются. В одном из нескольких сценариев вы можете вступать в конфликт на подчиненном с тем, что поступает от мастера в действии WAL. В большинстве из них на ведомом устройстве происходит транзакция, которая конфликтует с тем, что хочет изменить действие WAL. В этом случае у вас есть два варианта:
- Немного задержите применение действия WAL, позволяя ведомому устройству завершить конфликтующую транзакцию, затем примените действие.
- Отмените конфликтующий запрос на подчиненном.
Мы имеем дело с # 1 и двумя значениями:
max_standby_archive_delay
- это задержка, используемая после длительного разъединения между ведущим и ведомым, когда данные считываются из архива WAL, который не является текущими данными.
max_standby_streaming_delay
- задержка, используемая для отмены запросов при получении записей WAL посредством потоковой репликации.
Как правило, если ваш сервер предназначен для репликации высокой доступности, вы хотите, чтобы эти цифры были короткими. Для этого достаточно значения по умолчанию 30000
(миллисекунды, если не указано ни одной единицы). Однако, если вы хотите настроить что-то вроде архива, реплик-отчета или реплики чтения, у которых могут быть очень долго выполняющиеся запросы, вам нужно установить это значение выше, чтобы избежать отмененных запросов. Рекомендуемая 900s
настройка выше кажется хорошей отправной точкой. Я не согласен с официальными документами об установке бесконечного значения -1
в качестве хорошей идеи - это может замаскировать некоторый глючный код и вызвать множество проблем.
Единственное предупреждение о длительных запросах и более высоких значениях этих параметров заключается в том, что другие запросы, выполняющиеся на ведомом устройстве параллельно с длительным запросом, который вызывает задержку действия WAL, будут видеть старые данные до тех пор, пока длинный запрос не будет завершен. Разработчики должны понимать это и сериализовать запросы, которые не должны выполняться одновременно.
Для полного объяснения того, как max_standby_archive_delay
и как max_standby_streaming_delay
работать и почему, перейдите сюда .