Репликация в Postgresql приостанавливается, когда запросы и репликация выполняются одновременно

Postgress следует правилам MVCC. Таким образом, любой запрос, выполняемый в таблице, не конфликтует с записями, которые происходят в таблице. Запрос возвращает результат на основе моментального снимка в точке выполнения запроса.

Теперь у меня есть хозяин и раб. Подчиненный используется аналитиками для выполнения запросов и анализа. Когда ведомое устройство выполняет репликацию, и когда аналитик одновременно выполняет свои запросы, я могу видеть задержку репликации в течение длительного времени. Если запросы выполняются долго, репликация задерживается на длительное время, и если число записей на главном сервере оказывается равным довольно высоко, тогда я теряю файлы WAL, и репликация может продолжаться дольше. Я просто должен раскрутить другого раба. Почему это происходит? Как я могу позволить запросам и репликации происходить одновременно в позах? Есть ли какие-либо настройки параметров, которые я могу применить, чтобы это произошло?

1 ответ

Реплика не может применить больше WAL от мастера, потому что мастер мог перезаписать блоки данных, все еще необходимые для запросов, выполняющихся на реплике, которые старше, чем те, которые еще работают на мастер. Реплика нуждается в более старых версиях строк, чем мастер. Именно из- за MVCC эта пауза необходима.

Вы, вероятно, установили высокий max_standby_streaming_delay чтобы избежать "отмены заявления из-за конфликта с восстановлением" ошибок.

Если вы включите hot_standby_feedback вместо этого реплика может сказать мастеру сохранить эти строки. Но мастер не может очистить свободное место так же эффективно, и может не хватить места в pg_xlog если режим ожидания становится слишком далеко позади.

См. Руководство PostgreSQL: обработка конфликтов запросов.

Что касается сохраняющей части WAL: включите архивирование WAL и restore_command для вашего ожидания. Вы все равно должны использовать его для восстановления на определенный момент времени. PgBarman теперь делает это легко с barman get-wal команда. Если вы не хотите архивировать WAL, вы можете вместо этого настроить свои серверы реплики на использование слота репликации для подключения к мастеру, чтобы мастер знал, что нужно хранить WAL, в котором они нуждаются, в течение неопределенного времени. Конечно, это может привести к тому, что мастеру не хватит места в pg_xlog и прекратите бег, так что вам нужно более внимательно следить, если вы делаете это.

Другие вопросы по тегам