Потоковая репликация
в 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