Глава 48. Отслеживание прогресса репликации#

Глава 48. Отслеживание прогресса репликации

Глава 48. Отслеживание прогресса репликации

Репликационные источники предназначены для упрощения реализации логических репликационных решений на основе логического декодирования. Они предоставляют решение для двух распространенных проблем:

  • Как безопасно отслеживать прогресс репликации

  • Как изменить поведение репликации на основе источника строки; например, чтобы предотвратить петли в двунаправленных настройках репликации

Репликационные источники имеют всего два свойства: имя и идентификатор. Имя, которое должно использоваться для обращения к источнику в разных системах, может быть произвольным текстом text. Оно должно использоваться таким образом, чтобы конфликты между репликационными источниками, созданными разными решениями репликации, были маловероятными, например, путем добавления префикса имени решения репликации. Идентификатор используется только для избежания необходимости хранить длинную версию в ситуациях, где важна экономия места. Он никогда не должен передаваться между системами.

Воспроизводить источники репликации можно с помощью функции pg_replication_origin_create(); удалять их с помощью функции pg_replication_origin_drop(); и просматривать в системном каталоге pg_replication_origin.

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

С помощью инфраструктуры источника репликации сессия может быть помечена как воспроизводимая с удаленного узла (с использованием функции pg_replication_origin_session_setup()). Кроме того, LSN и временная метка комита каждой исходной транзакции могут быть настроены для каждой транзакции с помощью функции pg_replication_origin_xact_setup(). Если это сделано, прогресс репликации будет сохраняться в безопасном от сбоев режиме. Прогресс воспроизведения для всех источников репликации можно увидеть в представлении pg_replication_origin_status . Прогресс отдельного источника, например, при возобновлении репликации, можно получить с помощью функции pg_replication_origin_progress() для любого источника или функции pg_replication_origin_session_progress() для источника, настроенного в текущей сессии.

В топологиях репликации, более сложных, чем репликация от одной системы к другой, еще одной проблемой может быть то, что трудно избежать повторной репликации воспроизведенных строк. Это может привести как к циклам в репликации, так и к неэффективности. Репликационные источники предоставляют дополнительный механизм для распознавания и предотвращения этого. При настройке с использованием функций, указанных в предыдущем абзаце, каждое изменение и транзакция, переданные обратным вызовам плагина вывода (см. Раздел 47.6), сгенерированные сессией, помечаются источником репликации генерирующей сессии. Это позволяет обрабатывать их по-разному в плагине вывода, например, игнорировать все, кроме локально происходящих строк. Кроме того, обратный вызов filter_by_origin_cb может использоваться для фильтрации потока изменений логической декодировки на основе источника. Хотя это менее гибкое решение, фильтрация через этот обратный вызов значительно более эффективна, чем выполнение ее в плагине вывода.