Отслеживание прогресса репликации
Эта страница переведена при помощи нейросети GigaChat.
Оригинальные источники репликации предназначены для упрощения реализации решений логической репликации поверх логического декодирования. Они предоставляют решение двух общих проблем:
- как безопасно отслеживать прогресс репликации;
- как изменить поведение репликации в зависимости от источника строки, например, чтобы предотвратить зацикливание при двусторонней настройке репликации.
Источники репликации имеют всего два свойства: имя и идентификатор. Имя, которое должно использоваться для ссылки на источник в разных системах, является свободной формой 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() для источника, настроенного в текущем сеансе.
В топологиях репликации, более сложных, чем репликация с одной системы точно на другую систему, еще одна проблема может заключаться в том, что трудно избежать повторной репликации воспроизведенных строк. Это может привести как к циклам в репликации, так и к неэффективности. Происхождение репликации предоставляет необязательный механизм для распознавания и предотвращения этого. При настройке с использованием функций, упомянутых в предыдущем абзаце, каждое изменение и транзакция, переданные обратным вызовом плагина вывода, генерируемые сеансом, помечаются происхождением репликации сеанса генерации. Это позволяет обрабатывать их по-разному в выходном плагине, например, игнорировать все строки, кроме локально происходящих. Кроме того, обратный вызов filter_by_origin_cb
можно использовать для фильтрации потока изменений логического декодирования на основе источника. Хотя он менее гибкий, фильтрация через этот обратный вызов значительно эффективнее, чем выполнение ее в выходном плагине.