Отслеживание прогресса репликации
Источники репликации предназначены для упрощения реализации решений логической репликации поверх логического декодирования. Они обеспечивают решение двух распространенных проблем:
-
Как максимально надежно отслеживать прогресс репликации
-
Как менять поведение репликации в зависимости от источника строки; например, для предотвращения циклов в конфигурациях с двунаправленной репликацией
Источники репликации имеют только два свойства: имя и идентификатор. Имя, по которому следует обращаться к источнику из разных систем, является значением типа text в произвольной форме. Его следует задавать так, чтобы конфликты между источниками репликации, созданными различными решениями репликации, были маловероятны; например, добавлять к нему в качестве префикса имя решения репликации. Идентификатор используется только для того, чтобы не приходилось хранить длинное текстовое имя там, где критично эффективное использование памяти. Он не может совместно использоваться разными системами.
Источники репликации можно создать функцией pg_replication_origin_create(), удалить функцией pg_replication_origin_drop() и увидеть в системном каталоге pg_replication_origin.
Одной из нетривиальных задач при формировании решения репликации является отслеживание прогресса воспроизведения наиболее безопасным способом. К примеру, когда применяющий изменения процесс (или весь кластер) умирает, нужно иметь возможность выявить, до какой точки данные были успешно реплицированы. Наивные решения этого вопроса, такие как изменение строки в некоторой таблице для каждой воспроизведенной транзакции, имеют свои недостатки вроде издержек во время выполнения и «разбухания» базы данных.
При использовании инфраструктуры источников репликации сеанс можно пометить как воспроизводящий изменения из удаленного узла (с помощью функции pg_replication_origin_session_setup()). Кроме того, с помощью функции pg_replication_origin_xact_setup() для каждой транзакции из источника можно сконфигурировать LSN и временную метку фиксации. Если проделать все это, отслеживание прогресса репликации будет защищено от сбоев. Прогресс воспроизведения для всех источников репликации можно увидеть в представлении pg_replication_origin_status. Прогресс отдельного источника, например, при возобновлении репликации, можно получить для любого источника, вызвав функцию pg_replication_origin_progress(), или для источника, сконфигурированного в текущем сеансе, вызвав функцию pg_replication_origin_session_progress().
В более сложных топологиях репликации, чем простая репликация из одной системы в другую, возможна еще одна проблема: трудно избежать повторной репликации уже воспроизведенных строк. Это может привести к зацикливанию репликации и снижению эффективности. Источники репликации обеспечивают оптимальный механизм распознавания и предотвращения этой проблемы. Если при конфигурации применить функции, упомянутые в предыдущем параграфе, во все сгенерированные сеансом изменения и транзакции, передаваемые функциям обратного вызова в плагине вывода (см. раздел Плагины вывода логического декодирования), добавляется пометка источника репликации генерирующего сеанса. Это позволяет обрабатывать их в плагине вывода по-разному, например, игнорировать все строки, кроме имеющих локальное происхождение. Кроме того, можно воспользоваться функцией обратного вызова filter_by_origin_cb и отфильтровать поток изменений логического декодирования в зависимости от источника. Хотя фильтрация посредством этой функции не такая гибкая, как проверка меток внутри плагина вывода, она гораздо более эффективна.