Открыть сервис

Логическая репликация

Логическая репликация — это метод синхронизации данных между базами данных, при котором изменения, внесённые в источник (публикатор), воспроизводятся на целевом узле (подписчике) путём выполнения набора логических операций (INSERT, UPDATE, DELETE), а не путём копирования физических блоков данных. В отличие от физической репликации, работающей на уровне страниц или файлов, логическая репликация оперирует записями и их изменениями, что обеспечивает независимость от внутреннего формата хранения, версии СУБД и платформы.

Принцип работы

Логическая репликация основана на механизме декодирования журнала предзаписи (WALWrite-Ahead Log). В системах, таких как PostgreSQL, все изменения данных сначала записываются в WAL. Специальный процесс (обычно называемый выходным плагином, например pgoutput) преобразует записи WAL в поток логических изменений — последовательность операций, каждая из которых соответствует одной строке: вставка, обновление или удаление. Этот поток передаётся подписчику через сетевое соединение.

На стороне подписчика работает процесс приёмника, который применяет полученные изменения к локальной базе данных. Для этого он использует обычные SQL-команды или внутренние интерфейсы, что позволяет подписчику иметь собственную схему данных, индексы и триггеры, отличные от источника.

Основные компоненты

  • Публикация (Publication) — набор изменений, генерируемых на стороне источника. Публикация может включать все таблицы, определённые таблицы или даже отдельные строки (через фильтры WHERE). Каждая публикация имеет имя и привязывается к конкретной базе данных.
  • Подписка (Subscription) — конфигурация на стороне подписчика, которая указывает, откуда получать данные (строка подключения к публикатору) и какие публикации применять. Подписка может быть активной или приостановленной.
  • Слот репликации (Replication Slot) — механизм на стороне публикатора, который гарантирует, что WAL не будет удалён до тех пор, пока все подписчики не получат изменения. Без слота возможна потеря данных при отключении подписчика.

История

Концепция логической репликации появилась как развитие идей тиражирования данных, реализованных в коммерческих СУБД (Oracle, IBM DB2) в 1990-х годах. В открытых системах долгое время доминировала физическая репликация (например, MySQL Master-Slave через бинарный лог). Однако она имела ограничения: невозможность реплицировать между разными версиями СУБД, сложность частичной репликации и проблемы с обновлением схемы.

В PostgreSQL логическая репликация была введена в версии 10 (2017 год) как встроенная функция. До этого использовались сторонние расширения, такие как Slony-I, Londiste и Bucardo, которые работали через триггеры и очереди, но были менее эффективны и сложны в настройке. Внедрение нативной логической репликации в PostgreSQL стало значительным событием, так как позволило решить многие задачи, ранее требовавшие сложных обходных путей.

Отличия от физической репликации

ХарактеристикаФизическая репликацияЛогическая репликация
Уровень копированияБлоки данных (страницы)Логические операции (строки)
Совместимость версийТребует одинаковой мажорной версии СУБДДопускает разные версии (например, PostgreSQL 14 → 16)
Совместимость платформТребует одинаковой архитектуры (x86, ARM)Не зависит от платформы
Частичная репликацияТолько полная копия базы данныхВозможна репликация отдельных таблиц или строк
Изменение схемыТребует остановки репликации при DDLМожет работать с разными схемами (но DDL требует осторожности)
ЗадержкаМинимальная (синхронная/асинхронная)Обычно выше из-за декодирования WAL
Нагрузка на источникНизкая (копирование блоков)Выше (требуется декодирование и передача строк)

Преимущества и недостатки

Преимущества

  • Гибкость архитектуры: позволяет создавать системы с разными версиями СУБД на разных узлах, что упрощает обновления и миграции.
  • Частичная репликация: можно реплицировать только критичные таблицы, экономя ресурсы и трафик.
  • Независимость схемы: подписчик может иметь дополнительные индексы, триггеры или даже другую структуру таблиц (например, денормализованную).
  • Возможность агрегации данных: несколько источников могут реплицировать данные в одну базу-подписчик (много-к-одному).
  • Поддержка фильтрации: можно реплицировать только строки, удовлетворяющие условию (например, WHERE region = 'RU').

Недостатки

  • Высокая нагрузка на источник: декодирование WAL и передача каждой строки требуют больше ресурсов CPU и сети, чем физическая репликация.
  • Задержка (latency): обычно выше, чем у физической репликации, особенно при большом количестве мелких транзакций.
  • Сложность с DDL: изменение схемы на источнике (добавление столбца, изменение типа) не всегда автоматически применяется на подписчике, что может привести к ошибкам.
  • Ограничения по типам данных: не все типы данных могут быть корректно декодированы (например, пользовательские типы без поддержки).
  • Требования к слоту репликации: если подписчик долго отключён, WAL на источнике может переполнить диск.

Применение

Логическая репликация используется в различных сценариях:

  • Обновление СУБД без простоя: создаётся подписчик на новой версии, данные синхронизируются, затем трафик переключается на него.
  • Создание аналитических копий: реплицируются только нужные таблицы на отдельный сервер для отчётов, не нагружая основную базу.
  • Геораспределённые системы: данные реплицируются между дата-центрами, возможно, с разными версиями СУБД.
  • Интеграция с другими системами: логическая репликация может быть использована для передачи изменений в Kafka, ClickHouse или другие хранилища через специальные коннекторы (например, Debezium).
  • Аудит и мониторинг: поток логических изменений может быть записан в отдельную базу для отслеживания истории изменений.

Примеры реализации

  • PostgreSQL: нативная логическая репликация через публикации и подписки. Поддерживается с версии 10, постоянно улучшается (добавлены фильтры строк, параллельная репликация, поддержка последовательностей).
  • MySQL: логическая репликация реализована через бинарный лог (binlog) в формате ROW. Используется в стандартной репликации Master-Slave, а также в Group Replication и InnoDB Cluster.
  • Oracle: реализована через Oracle GoldenGate — отдельный продукт, который может реплицировать данные между различными СУБД (Oracle, MySQL, PostgreSQL, DB2 и др.).
  • Microsoft SQL Server: логическая репликация доступна через компонент «Репликация транзакций» (Transactional Replication), который работает на основе журнала транзакций.

Ограничения и особенности

Логическая репликация не является панацеей. Она не поддерживает автоматическое разрешение конфликтов при двунаправленной репликации (многие-ко-многим). Для этого требуются дополнительные механизмы (например, CRDT — Conflict-free Replicated Data Types). Также логическая репликация может быть неэффективна для больших объёмов данных с высокой частотой обновлений, так как каждая операция передаётся отдельно, в отличие от физической репликации, которая копирует целые блоки.

При использовании логической репликации важно учитывать, что DDL-операции (ALTER TABLE, CREATE INDEX) на источнике не реплицируются автоматически. Их необходимо выполнять вручную на подписчике, что может привести к временной рассинхронизации.

Источники

  • PostgreSQL Documentation: Chapter 31. Logical Replication
  • MySQL 8.0 Reference Manual: Chapter 18. Replication
  • Oracle GoldenGate Documentation: Introduction to Oracle GoldenGate
  • Microsoft SQL Server Documentation: Transactional Replication
  • Статья «Logical Replication in PostgreSQL: A Comprehensive Guide» (Haki Benita, 2023)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →