Потоковая репликация в PostgreSQL. Alexey Lesovsky alexey.lesovsky@dataegret.com
dataegret.com Введение • Что такое репликация и зачем. • Какая бывает репликация. • Как устроена потоковая репликация в PostgreSQL. Настройка • Настройка потоковой репликации. • Проверка результата. • Особенности эксплуатации. 02 01
Введение 01
Что такое репликация01 dataegret.com Синхронизация объектов. Изменения распространяются на копии. Репликация может быть физической или логической.
Зачем нужна репликация01 dataegret.com Отказоустойчивость базы данных. Масштабирование на чтение/запись. Аналитика и BI.
Логическая репликация01 dataegret.com Плюсы: ● Работает между разными версиями и архитектурами. ● Позволяет реплицировать отдельные наборы таблиц. Минусы: ● Сложность в реализации синхронной репликации. ● Утилизация CPU (триггеры, преобразование текста, ...). Примеры: ● Slony, Londiste (Skytools), Bucardo, Pglogical.
Физическая репликация01 dataegret.com Плюсы: ● Небольшие накладные расходы на использование ресурсов. ● Легкость установки и обслуживания. Минусы: ● Запасные узлы доступны только для чтения. ● Не работает между разными версиями и архитектурами. ● Не умеет реплицировать наборы таблиц.
REDO журнал01 dataegret.com Необходимость подтверждать все изменения (Durability в ACID). Все (почти) изменения записываются в REDO журнал. REDO журнал это история «последних» изменений. REDO журнал используется: ● При аварийном восстановлении; ● При резервном копировании; ● При репликации.
REDO журнал в PostgreSQL01 dataegret.com В PostgreSQL, REDO журнал называется Write Ahead Log (WAL). WAL гарантирует что информация об изменениях будет зафиксирована ДО реальных изменений. Как это работает: ● LSN (log sequence number) – положение записи внутри WAL; ● Страницы маркируются LSN; ● Перед записью страницы на диск, проверяем что LSN уже записан в журнал.
Упрощенная схема01 dataegret.com клиент клиент клиент автовауум ... WAL writer* WAL Startup/Recovery SR/Archiving/Hot Standby Point in Time WAL Sender/WAL Receiver * - опционально
Startup процесс01 dataegret.com Главный компонент который запускает СУБД. Запускается восстановление по WAL журналу. Чтение конфигурации и определение источника WAL. REDO цикл: ● Чтение WAL из pg_xlog/ или WAL архива; ● Установка соединения с upstream.
WAL Receiver процесс01 dataegret.com WAL receiver: ● Определение с какого места начать прием WAL; ● Подключение к мастеру и отправка LSN отметки; ● Принимает WAL и записывает на диск; ● Обновляет особую переменную в shared memory; ● Отправляет статистику на мастер. Startup процесс использует особую переменную чтобы воспроизвести WAL до этого места.
WAL Sender процесс01 dataegret.com Для каждого клиента, создается отдельный backend-процесс. WAL sender это тоже backend. WAL sender запускает репликацию. Отправляет WAL журнал клиенту. Или спит если нет новых журналов.
Упрощенный порядок работы01 dataegret.com Мастер Реплика Запуск WAL sender и получение позиции Проверка наличия журнала Отправка журнала Обновление статистики Проверка источника XLOG Запуск WAL receiver Вычисление стартовой позиции Подключение к мастеру, отправка позиции Запись журнала на диск Обновление «отметки» Отправка статистики Воспроизведение журнала Начальная фаза Цикл репликации
Настройка 02
План02 dataegret.com Варианты настройки. Подготовка мастера. Запуск репликации. Проверка результата. Особенности эксплуатации.
Варианты настройки02 dataegret.com Синхронная или асинхронная репликация. Каскадная конфигурация.
Стандартный алгоритм02 dataegret.com Подготовка мастера (настройка конфигурации). Копирование каталога DATADIR. Подготовка реплики (настройка конфигурации). Запуск реплики. Проверка результата.
Настройка мастера02 dataegret.com Создание отдельного пользователя для репликации. Правка postgresql.conf. Правка pg_hba.conf. Создание слота репликации (необязательно).
Настройка мастера02 dataegret.com Отдельный пользователь для репликации (psql или createuser). ● CREATE ROLE replica WITH LOGIN REPLICATION PASSWORD '123'; Правка postgresql.conf. Правка pg_hba.conf. Создание слота репликации (необязательно).
Настройка мастера02 dataegret.com Выделенный пользователь для репликации. Правка postgresql.conf. ● wal_level = replica (or logical) ● max_wal_senders = 8 ● wal_keep_segments = 200 ● Рестарт обязателен. Правка pg_hba.conf. Создание слота репликации (необязательно).
Настройка мастера02 dataegret.com Отдельный пользователь для репликации. Правка postgresql.conf. Правка pg_hba.conf. ● host replication username client_addr/mask authtype ● host replication replica 10.1.0.99/32 md5 ● Требуется reload. Создание слота репликации (необязательно).
Настройка мастера02 dataegret.com Выделенный пользователь для репликации. Правка postgresql.conf. Правка pg_hba.conf. Создание слота репликации (опциональный шаг). ● postgresql.conf — max_replication_slots = 4. ● Создание слота с pg_create_physical_replication_slot('name'); ● recovery.conf — primary_slot_name = 'name'.
Копирование DATADIR02 dataegret.com pg_basebackup (с версии 9.1) -h, --host=…; -p, --port=…; -U, --username=…; -d, --dbname=…; -D, --pgdata=... -c, --checkpoint=fast | spread -X, --xlog-method=fetch | stream – stream c версии 9.2 -R, --write-recovery-conf – c версии 9.3 -r, --max-rate=… – c версии 9.4 --xlogdir=… – c версии 9.4 -T, --tablespace-mapping=olddir=newdir – c версии 9.4 -P, --progress pg_basebackup -P -R -X stream -c fast -h 1.2.3.4 -U replica -D /pgdb
Копирование DATADIR02 dataegret.com Утилиты файлового копирования - cp, scp, tar, rsync... Снимки: ● ZFS send/receive; ● LVM + dd. pg_start_backup() + pg_stop_backup().
Настройка реплики02 dataegret.com Файлы конфигурации: ● Должны быть одинаковыми (желательно); ● postgresql.conf; ● recovery.conf.
Настройка реплики02 dataegret.com Файлы конфигурации (postgresql.conf): ● hot_standby = on;
Настройка реплики02 dataegret.com Файлы конфигурации (recovery.conf): ● primary_conninfo = 'host=… port=…' – обязателен ● standby_mode = on – обязателен ● primary_slot_name = 'slotname' - слоты? ● trigger_file = '…' – рекомендуется ● recovery_min_apply_delay. - отложенная реплика
Запуск реплики02 dataegret.com pg_ctl – штатная утилита PostgreSQL. pg_ctlcluster – perl обертка над pg_ctl в Debian/Ubuntu Linux. sysvinit, upstart, openrc, systemd…
Проверка результата02 dataegret.com Наличие процессов WAL sender и WAL receiver. Проверка системного журнала. Простое подключение через psql. Системное представление pg_stat_replication.
Проверка результата02 dataegret.com Наличие процессов WAL sender и WAL receiver. master $ ps aux |grep -i wal postgres: wal sender process postgres [10.1.0.99] streaming 4/EA000060 standby $ ps aux |grep -i wal postgres: wal receiver process streaming 4/EA000060
Проверка результата02 dataegret.com Проверка системного журнала. LOG: database system was interrupted; last known up at 2017-02-10 12:28:54 LOG: entering standby mode LOG: redo starts at 4/E9000028 LOG: consistent recovery state reached at 4/E9000130 LOG: database system is ready to accept read only connections LOG: started streaming WAL from primary at 4/EA000000 on timeline 1
Проверка результата02 dataegret.com Подключение через psql. $ psql -h replica -U postgres psql (9.6.2) Type "help" for help. postgres=# select pg_is_in_recovery(); true
Проверка результата02 dataegret.com Системное представление pg_stat_replication. postgres=# select * from pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 29351 usesysid | 10 usename | postgres application_name | walreceiver client_addr | 10.1.0.99 client_hostname | client_port | 5432 backend_start | 2017-04-15 12:52:54.639356+05 backend_xmin | state | streaming sent_location | 4/EA000060 write_location | 4/EA000060 flush_location | 4/EA000060 replay_location | 4/EA000060 sync_priority | 0 sync_state | async
Особенности эксплуатации02 dataegret.com Поставил и забыл.
Особенности эксплуатации02 dataegret.com Мониторинг и поиск проблем: ● pg_stat_replication — лаг репликации. ● pg_current_xlog_location(), pg_xlog_location_diff(). ● pg_stat_activity — запросы на реплике.
Особенности эксплуатации02 dataegret.com Использование слотов: ● wal_keep_segments не нужен. ● pg_replication_slots – мониторинг слотов. ● мониторинг дискового пространства.
Особенности эксплуатации02 dataegret.com Долгие запросы на реплике могут быть причиной лага: ● Неизбежное зло. ● Переписывать запросы или отстреливать их. ● Или вообще забить.
Особенности эксплуатации02 dataegret.com DDL и autovacuum может аффектить запросы на реплике: ● Конфликты репликации. ● pg_stat_database_conflicts. ● hot_standby_feedback = on. ● max_standby_streaming_delay = ...
Особенности эксплуатации02 dataegret.com Нет встроенных средств автофайловера. ● trigger_file (recovery.conf). ● Скрипты на Shell/Python/Ansible/whatever. ● Repmgr, Patroni, Stolon.
Особенности эксплуатации02 dataegret.com Бэкап: ● Реплика != Бэкап. ● pg_basebackup + WAL архив. ● pgBarman, pgBackRest.
Резюме02 dataegret.com Репликация это нужно и полезно. Настроить репликацию легко. Репликация проста в обслуживании.
Спасибо за внимание! dataegret.com alexey.lesovsky@dataegret.com

PostgreSQL Streaming Replication