Slide 1

Slide 1 text

Потоковая репликация в PostgreSQL. Alexey Lesovsky [email protected]

Slide 2

Slide 2 text

dataegret.com Введение • Что такое репликация и зачем. • Какая бывает репликация. • Как устроена потоковая репликация в PostgreSQL. Настройка • Настройка потоковой репликации. • Проверка результата. • Особенности эксплуатации. 02 01

Slide 3

Slide 3 text

Введение 01

Slide 4

Slide 4 text

Что такое репликация 01 dataegret.com Синхронизация объектов. Изменения распространяются на копии. Репликация может быть физической или логической.

Slide 5

Slide 5 text

Зачем нужна репликация 01 dataegret.com Отказоустойчивость базы данных. Масштабирование на чтение/запись. Аналитика и BI.

Slide 6

Slide 6 text

Логическая репликация 01 dataegret.com Плюсы: ● Работает между разными версиями и архитектурами. ● Позволяет реплицировать отдельные наборы таблиц. Минусы: ● Сложность в реализации синхронной репликации. ● Утилизация CPU (триггеры, преобразование текста, ...). Примеры: ● Slony, Londiste (Skytools), Bucardo, Pglogical.

Slide 7

Slide 7 text

Физическая репликация 01 dataegret.com Плюсы: ● Небольшие накладные расходы на использование ресурсов. ● Легкость установки и обслуживания. Минусы: ● Запасные узлы доступны только для чтения. ● Не работает между разными версиями и архитектурами. ● Не умеет реплицировать наборы таблиц.

Slide 8

Slide 8 text

REDO журнал 01 dataegret.com Необходимость подтверждать все изменения (Durability в ACID). Все (почти) изменения записываются в REDO журнал. REDO журнал это история «последних» изменений. REDO журнал используется: ● При аварийном восстановлении; ● При резервном копировании; ● При репликации.

Slide 9

Slide 9 text

REDO журнал в PostgreSQL 01 dataegret.com В PostgreSQL, REDO журнал называется Write Ahead Log (WAL). WAL гарантирует что информация об изменениях будет зафиксирована ДО реальных изменений. Как это работает: ● LSN (log sequence number) – положение записи внутри WAL; ● Страницы маркируются LSN; ● Перед записью страницы на диск, проверяем что LSN уже записан в журнал.

Slide 10

Slide 10 text

Упрощенная схема 01 dataegret.com клиент клиент клиент автовауум ... WAL writer* WAL Startup/Recovery SR/Archiving/Hot Standby Point in Time WAL Sender/WAL Receiver * - опционально

Slide 11

Slide 11 text

Startup процесс 01 dataegret.com Главный компонент который запускает СУБД. Запускается восстановление по WAL журналу. Чтение конфигурации и определение источника WAL. REDO цикл: ● Чтение WAL из pg_xlog/ или WAL архива; ● Установка соединения с upstream.

Slide 12

Slide 12 text

WAL Receiver процесс 01 dataegret.com WAL receiver: ● Определение с какого места начать прием WAL; ● Подключение к мастеру и отправка LSN отметки; ● Принимает WAL и записывает на диск; ● Обновляет особую переменную в shared memory; ● Отправляет статистику на мастер. Startup процесс использует особую переменную чтобы воспроизвести WAL до этого места.

Slide 13

Slide 13 text

WAL Sender процесс 01 dataegret.com Для каждого клиента, создается отдельный backend-процесс. WAL sender это тоже backend. WAL sender запускает репликацию. Отправляет WAL журнал клиенту. Или спит если нет новых журналов.

Slide 14

Slide 14 text

Упрощенный порядок работы 01 dataegret.com Мастер Реплика Запуск WAL sender и получение позиции Проверка наличия журнала Отправка журнала Обновление статистики Проверка источника XLOG Запуск WAL receiver Вычисление стартовой позиции Подключение к мастеру, отправка позиции Запись журнала на диск Обновление «отметки» Отправка статистики Воспроизведение журнала Начальная фаза Цикл репликации

Slide 15

Slide 15 text

Настройка 02

Slide 16

Slide 16 text

План 02 dataegret.com Варианты настройки. Подготовка мастера. Запуск репликации. Проверка результата. Особенности эксплуатации.

Slide 17

Slide 17 text

Варианты настройки 02 dataegret.com Синхронная или асинхронная репликация. Каскадная конфигурация.

Slide 18

Slide 18 text

Стандартный алгоритм 02 dataegret.com Подготовка мастера (настройка конфигурации). Копирование каталога DATADIR. Подготовка реплики (настройка конфигурации). Запуск реплики. Проверка результата.

Slide 19

Slide 19 text

Настройка мастера 02 dataegret.com Создание отдельного пользователя для репликации. Правка postgresql.conf. Правка pg_hba.conf. Создание слота репликации (необязательно).

Slide 20

Slide 20 text

Настройка мастера 02 dataegret.com Отдельный пользователь для репликации (psql или createuser). ● CREATE ROLE replica WITH LOGIN REPLICATION PASSWORD '123'; Правка postgresql.conf. Правка pg_hba.conf. Создание слота репликации (необязательно).

Slide 21

Slide 21 text

Настройка мастера 02 dataegret.com Выделенный пользователь для репликации. Правка postgresql.conf. ● wal_level = replica (or logical) ● max_wal_senders = 8 ● wal_keep_segments = 200 ● Рестарт обязателен. Правка pg_hba.conf. Создание слота репликации (необязательно).

Slide 22

Slide 22 text

Настройка мастера 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. Создание слота репликации (необязательно).

Slide 23

Slide 23 text

Настройка мастера 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'.

Slide 24

Slide 24 text

Копирование DATADIR 02 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

Slide 25

Slide 25 text

Копирование DATADIR 02 dataegret.com Утилиты файлового копирования - cp, scp, tar, rsync... Снимки: ● ZFS send/receive; ● LVM + dd. pg_start_backup() + pg_stop_backup().

Slide 26

Slide 26 text

Настройка реплики 02 dataegret.com Файлы конфигурации: ● Должны быть одинаковыми (желательно); ● postgresql.conf; ● recovery.conf.

Slide 27

Slide 27 text

Настройка реплики 02 dataegret.com Файлы конфигурации (postgresql.conf): ● hot_standby = on;

Slide 28

Slide 28 text

Настройка реплики 02 dataegret.com Файлы конфигурации (recovery.conf): ● primary_conninfo = 'host=… port=…' – обязателен ● standby_mode = on – обязателен ● primary_slot_name = 'slotname' - слоты? ● trigger_file = '…' – рекомендуется ● recovery_min_apply_delay. - отложенная реплика

Slide 29

Slide 29 text

Запуск реплики 02 dataegret.com pg_ctl – штатная утилита PostgreSQL. pg_ctlcluster – perl обертка над pg_ctl в Debian/Ubuntu Linux. sysvinit, upstart, openrc, systemd…

Slide 30

Slide 30 text

Проверка результата 02 dataegret.com Наличие процессов WAL sender и WAL receiver. Проверка системного журнала. Простое подключение через psql. Системное представление pg_stat_replication.

Slide 31

Slide 31 text

Проверка результата 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

Slide 32

Slide 32 text

Проверка результата 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

Slide 33

Slide 33 text

Проверка результата 02 dataegret.com Подключение через psql. $ psql -h replica -U postgres psql (9.6.2) Type "help" for help. postgres=# select pg_is_in_recovery(); true

Slide 34

Slide 34 text

Проверка результата 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

Slide 35

Slide 35 text

Особенности эксплуатации 02 dataegret.com Поставил и забыл.

Slide 36

Slide 36 text

Особенности эксплуатации 02 dataegret.com Мониторинг и поиск проблем: ● pg_stat_replication — лаг репликации. ● pg_current_xlog_location(), pg_xlog_location_diff(). ● pg_stat_activity — запросы на реплике.

Slide 37

Slide 37 text

Особенности эксплуатации 02 dataegret.com Использование слотов: ● wal_keep_segments не нужен. ● pg_replication_slots – мониторинг слотов. ● мониторинг дискового пространства.

Slide 38

Slide 38 text

Особенности эксплуатации 02 dataegret.com Долгие запросы на реплике могут быть причиной лага: ● Неизбежное зло. ● Переписывать запросы или отстреливать их. ● Или вообще забить.

Slide 39

Slide 39 text

Особенности эксплуатации 02 dataegret.com DDL и autovacuum может аффектить запросы на реплике: ● Конфликты репликации. ● pg_stat_database_conflicts. ● hot_standby_feedback = on. ● max_standby_streaming_delay = ...

Slide 40

Slide 40 text

Особенности эксплуатации 02 dataegret.com Нет встроенных средств автофайловера. ● trigger_file (recovery.conf). ● Скрипты на Shell/Python/Ansible/whatever. ● Repmgr, Patroni, Stolon.

Slide 41

Slide 41 text

Особенности эксплуатации 02 dataegret.com Бэкап: ● Реплика != Бэкап. ● pg_basebackup + WAL архив. ● pgBarman, pgBackRest.

Slide 42

Slide 42 text

Резюме 02 dataegret.com Репликация это нужно и полезно. Настроить репликацию легко. Репликация проста в обслуживании.

Slide 43

Slide 43 text

Спасибо за внимание! dataegret.com [email protected]