Репликация в PostgreSQL
Репликация в PostgreSQL — это механизм автоматического копирования и синхронизации данных с одного сервера базы данных (источника) на один или несколько других серверов (приёмников). Репликация обеспечивает отказоустойчивость, масштабирование нагрузки на чтение, географическую распределённость данных и возможность создания резервных копий без остановки основного сервера. В PostgreSQL поддерживается несколько типов репликации, различающихся по способу передачи данных, уровню синхронности и архитектуре.
История
Развитие репликации в PostgreSQL прошло несколько этапов. До версии 8.0 (2005 год) репликация была реализована сторонними расширениями, такими как Slony-I и Londiste, которые работали на уровне триггеров и очередей. В версии 8.0 появилась встроенная асинхронная репликация на основе журнала предзаписи (WAL — Write-Ahead Log), которая позволяла передавать изменения на уровне файлов WAL. В версии 9.0 (2010 год) была добавлена потоковая репликация (streaming replication), которая сделала процесс передачи данных более эффективным и удобным. В версии 9.1 (2011 год) появилась синхронная репликация, гарантирующая, что транзакция подтверждается только после записи на приёмник. В версии 10 (2017 год) была введена логическая репликация, работающая на уровне отдельных таблиц и позволяющая реплицировать данные между разными версиями PostgreSQL и даже между разными СУБД. В последующих версиях (11–16) были улучшены механизмы управления конфликтами, добавлена поддержка параллельной репликации и расширены возможности логической репликации.
Типы репликации
Физическая репликация
Физическая репликация (или потоковая репликация) основана на передаче журнала предзаписи (WAL) с основного сервера (primary) на резервный (standby). WAL содержит все изменения, внесённые в базу данных, на уровне блоков данных. Приёмник применяет эти изменения к своей копии базы данных, поддерживая её в точном соответствии с источником. Физическая репликация работает на уровне всего кластера баз данных — реплицируются все базы данных, таблицы и другие объекты.
- Асинхронная физическая репликация: изменения передаются на приёмник без ожидания подтверждения. Основной сервер не ждёт записи на приёмник, что обеспечивает минимальную задержку на основном сервере, но возможна потеря данных при сбое.
- Синхронная физическая репликация: транзакция на основном сервере считается завершённой только после того, как изменения записаны на диск хотя бы на одном синхронном приёмнике. Это гарантирует нулевую потерю данных, но увеличивает время отклика.
Логическая репликация
Логическая репликация работает на уровне отдельных таблиц и использует механизм логического декодирования WAL. Вместо передачи блоков данных передаются логические изменения (вставка, обновление, удаление) в виде структурированных записей. Это позволяет реплицировать данные между разными версиями PostgreSQL, а также между разными СУБД (через сторонние коннекторы). Логическая репликация поддерживает фильтрацию по таблицам и строкам, а также позволяет реплицировать только часть данных.
Каскадная репликация
Каскадная репликация — это архитектура, при которой один или несколько приёмников получают данные не напрямую от основного сервера, а от другого приёмника. Это позволяет снизить нагрузку на основной сервер и организовать географически распределённые системы. Каскадная репликация поддерживается как для физической, так и для логической репликации.
Двунаправленная репликация
Двунаправленная репликация (или multi-master) позволяет нескольким серверам одновременно принимать записи и синхронизировать изменения между собой. В PostgreSQL двунаправленная репликация не является встроенной и реализуется через сторонние расширения, такие как BDR (Bi-Directional Replication) или pglogical. Она требует сложного управления конфликтами, так как изменения могут вноситься одновременно на разных серверах.
Механизмы работы
Журнал предзаписи (WAL)
WAL — это основной механизм, обеспечивающий репликацию в PostgreSQL. Все изменения данных сначала записываются в WAL, а затем применяются к самой базе данных. При физической репликации WAL передаётся на приёмник, который воспроизводит изменения. WAL состоит из сегментов фиксированного размера (обычно 16 МБ). Для потоковой репликации используется протокол, основанный на TCP/IP.
Процессы репликации
- WAL sender — процесс на основном сервере, который отправляет WAL-данные приёмникам.
- WAL receiver — процесс на приёмнике, который принимает WAL-данные и записывает их в локальный WAL.
- WAL apply — процесс на приёмнике, который применяет принятые WAL-данные к базе данных.
Слоты репликации
Слоты репликации (replication slots) — это механизм, который гарантирует, что WAL-данные, необходимые для репликации, не будут удалены на основном сервере, пока приёмник их не получит. Слоты предотвращают потерю данных при отключении приёмника, но требуют контроля за их состоянием, чтобы избежать переполнения диска.
Конфигурация и настройка
Основные параметры
Для настройки репликации в PostgreSQL используются следующие параметры в файле postgresql.conf:
wal_level = replica(илиlogicalдля логической репликации) — определяет уровень детализации WAL.max_wal_senders— максимальное количество процессов WAL sender.max_replication_slots— максимальное количество слотов репликации.hot_standby = on— разрешает выполнение запросов на чтение на приёмнике.
Аутентификация
Для подключения приёмников к основному серверу используется аутентификация через файл pg_hba.conf. Обычно добавляется строка вида:
`` host replication all <IP_приёмника>/32 md5 ``
Переключение на приёмник (failover)
В случае сбоя основного сервера приёмник может быть переведён в основной режим. Для этого используется команда pg_ctl promote или утилита pg_rewind, которая позволяет синхронизировать старый основной сервер с новым после восстановления. Для автоматического переключения применяются сторонние инструменты, такие как Patroni, repmgr или Pacemaker.
Преимущества и недостатки
Преимущества
- Отказоустойчивость: при выходе из строя основного сервера приёмник может взять на себя его функции.
- Масштабирование чтения: приёмники могут обслуживать запросы на чтение, снижая нагрузку на основной сервер.
- Резервное копирование: можно создавать резервные копии с приёмника без остановки основного сервера.
- Географическая распределённость: данные могут быть размещены в разных дата-центрах.
Недостатки
- Задержка репликации: при асинхронной репликации возможна задержка в передаче данных, что может привести к потере данных при сбое.
- Сложность управления: настройка и мониторинг репликации требуют квалификации администратора.
- Ограничения логической репликации: логическая репликация не поддерживает репликацию DDL (изменения структуры таблиц) и некоторые типы данных (например, большие объекты).
Применение
Репликация в PostgreSQL широко используется в различных сценариях:
- Высокая доступность (HA): создание кластеров с автоматическим переключением на приёмник при сбое.
- Балансировка нагрузки: распределение запросов на чтение между несколькими приёмниками.
- Географическое распределение: размещение копий данных в разных регионах для снижения задержек.
- Миграция данных: логическая репликация позволяет переносить данные между разными версиями PostgreSQL или между разными СУБД.
- Резервное копирование: создание резервных копий с приёмника без остановки основного сервера.
Инструменты управления
- Patroni — система управления кластерами PostgreSQL с поддержкой автоматического переключения и конфигурации через DCS (etcd, Consul, ZooKeeper).
- repmgr — утилита для управления репликацией и переключениями.
- pg_auto_failover — расширение для автоматического переключения на приёмник.
- Barman — инструмент для резервного копирования и восстановления, интегрируемый с репликацией.
Интересные факты
- Репликация в PostgreSQL поддерживает до 64 приёмников на один основной сервер (ограничение параметра
max_wal_senders). - Логическая репликация может использоваться для репликации данных между разными версиями PostgreSQL, например, с версии 12 на версию 16.
- В версии 14 была добавлена поддержка параллельной репликации, что ускорило применение WAL-данных на приёмнике.
- Репликация может быть настроена как на уровне всего кластера, так и на уровне отдельных таблиц (логическая репликация).
Источники
- Официальная документация PostgreSQL: «Replication, Backup, and High Availability» (PostgreSQL Global Development Group).
- Книга «PostgreSQL 14 Administration Cookbook» by Simon Riggs and Gianni Ciolli.
- Статья «Understanding PostgreSQL Replication» на сайте PostgreSQL Tutorial.
- Документация Patroni: «Patroni: A Template for PostgreSQL HA» (Zalando SE).
- Статья «Logical Replication in PostgreSQL» на сайте PostgreSQL Documentation.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →