2016-05-06 3 views
2

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

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

+0

Чтобы добавить, посттермическая репликация однопоточная ... Итак, если я запрашиваю таблицу A на подчиненном устройстве, я думаю, таблица A получает блокировки для репликации. Теперь, если в таблице B есть вставки/обновления, происходящие на главном компьютере, они ждут в файлах WAL за таблицей A ... Поэтому, если запрос в таблице A не завершен, репликация не может продолжаться ... Если это было многопоточно, таблица B insert/updates знал бы, что это не имеет ничего общего с таблицей А и может продолжаться без задержек ... Я правильно понимаю механизм репликации постгера? – Ramanan

+0

"репликация длится долго, и если количество записей на главном компьютере довольно велико, то я теряю файлы WAL, и репликация может продолжиться", что указывает на то, что репликация не была настроена должным образом. Почему бы вам не уточнить вопрос более подробно. Экстракты из вашего файла конфигурации также помогут. – e4c5

+0

Также этот вопрос может быть лучше подходит для dba.stackexchange.com – e4c5

ответ

1

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

Возможно, вы установили высокий max_standby_streaming_delay, чтобы избежать "canceling statement due to conflict with recovery" errors.

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

См. PostgreSQL manual: Handling Query Conflicts.

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

+1

Спасибо за ответ. Я попробую hot_standby_feedback с нашей настройкой. Мое понимание из вашего объяснения состоит в том, что мертвые строки все равно будут храниться на главном сервере, а значит, раздувают таблицы в течение некоторого времени ... Итак, когда происходит очистка на первичной основе? Выполняется ли очистка после завершения выполнения запроса? – Ramanan

Смежные вопросы