КАК БЫЛО ПОДГОТОВЛЕНО ОКРУЖЕНИЕ ДЛЯ ДЕМОНСТРАЦИИ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Для демонстрации были настроены три виртуальные машины в Oracle VirtualBox: hosta, hostb и storage. На каждой из них два сетевых устройства: * eth0 - NAT Network (для доступа в интернет) * eth1 - Internal Network (для связи между ВМ) На ВМ установлена ОС Ubuntu 14.04, настроены статические IP-адреса. Для этого в /etc/hosts каждой ВМ прописано: 10.0.2.10 hosta 10.0.2.11 hostb 10.0.2.12 storage А в /etc/network/interfaces добавлено: auto eth1 iface eth1 inet static address 10.0.2.10 # разные IP для разных ВМ netmask 255.255.255.0 network 10.0.2.0 На ВМ storage настроен каталог backup, доступный другим ВМ по NFS: egor@storage:~$ sudo apt-get install nfs-kernel-server egor@storage:~$ mkdir backup egor@storage:~$ id -u egor 1000 egor@storage:~$ cat /etc/exports /home/egor/backup *(rw,async,all_squash,anonuid=1000,anonguid=1000,no_subtree_check,fsid=0) egor@storage:~$ sudo service nfs-kernel-server restart На ВМ hosta и hostb этот каталог примонтирован в /var/lib/postgresql/backup: egor@hosta:~$ sudo apt-get install nfs-kernel-server egor@hosta:~$ cat /etc/fstab storage:/home/egor/backup /var/lib/postgresql/backup nfs egor@hosta:~$ sudo -u postgres mkdir /var/lib/postgresql/backup egor@hosta:~$ sudo mount -a На hosta и hostb установлена сборка Postgres Pro Standard 9.6 и pg_probackup: egor@hosta:~$ sudo sh -c 'echo "deb http://repo.postgrespro.ru/pgpro-9.6/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/postgrespro.list' egor@hosta:~$ wget --quiet -O - http://repo.postgrespro.ru/pgpro-9.6/keys/GPG-KEY-POSTGRESPRO | sudo apt-key add - egor@hosta:~$ sudo apt-get update egor@hosta:~$ sudo apt-get install postgrespro-9.6 egor@hosta:~$ sudo apt-get install postgrespro-pg-probackup-9.6 На hosta загружена большая демонстрационная база данных: postgres@hosta:~$ wget https://edu.postgrespro.ru/demo_big.zip postgres@hosta:~$ zcat demo_big.zip | psql (Описание демо-базы: https://postgrespro.ru/education/demodb) Начало демонстрации. НАЧАЛЬНАЯ НАСТРОЙКА ~~~~~~~~~~~~~~~~~~~ Перед нами сервер, установленный из пакета, без каких-либо дополнительных настроек. Загружена демонстрационная база данных: psql -U postgres => \c demo You are now connected to database "demo" as user "postgres". => \dt bookings.* List of relations Schema | Name | Type | Owner ----------+-----------------+-------+---------- bookings | aircrafts | table | postgres bookings | airports | table | postgres bookings | boarding_passes | table | postgres bookings | bookings | table | postgres bookings | flights | table | postgres bookings | seats | table | postgres bookings | ticket_flights | table | postgres bookings | tickets | table | postgres (8 rows) ....................................................................... Переменные окружения: postgres@hosta$ echo $PGDATA /var/lib/postgresql/9.6/main postgres@hosta$ echo $BACKUP_PATH /var/lib/postgresql/backup ....................................................................... Инициализация каталога резервных копий: postgres@hosta$ ls -l $BACKUP_PATH total 0 postgres@hosta$ pg_probackup init postgres@hosta$ ls -l $BACKUP_PATH total 4 drwx------ 2 egor egor 40 марта 13 2017 backups -rw-r--r-- 1 egor egor 41 марта 13 2017 pg_probackup.conf drwx------ 2 egor egor 40 марта 13 2017 wal ....................................................................... postgres@hosta$ cat $BACKUP_PATH/pg_probackup.conf system-identifier = 6392923338532960935 * Защита от непреднамеренной записи резервных копий разных кластеров ....................................................................... Роль для резервного копирования: => CREATE ROLE backup WITH LOGIN REPLICATION; CREATE ROLE ....................................................................... Необходимые привилегии: => \c postgres You are now connected to database "postgres" as user "postgres". => GRANT USAGE ON SCHEMA pg_catalog TO backup; GRANT => GRANT EXECUTE ON FUNCTION current_setting(text) TO backup; GRANT => GRANT EXECUTE ON FUNCTION pg_is_in_recovery() TO backup; GRANT => GRANT EXECUTE ON FUNCTION pg_start_backup(text, boolean, boolean) TO backup; GRANT => GRANT EXECUTE ON FUNCTION pg_stop_backup() TO backup; GRANT => GRANT EXECUTE ON FUNCTION pg_stop_backup(boolean) TO backup; GRANT => GRANT EXECUTE ON FUNCTION pg_switch_xlog() TO backup; GRANT => GRANT EXECUTE ON FUNCTION txid_current() TO backup; GRANT => GRANT EXECUTE ON FUNCTION txid_current_snapshot() TO backup; GRANT => GRANT EXECUTE ON FUNCTION txid_snapshot_xmax(txid_snapshot) TO backup; GRANT ....................................................................... И еще для инкрементального копирования: => GRANT EXECUTE ON FUNCTION pg_ptrack_clear() TO backup; GRANT => GRANT EXECUTE ON FUNCTION pg_ptrack_get_and_clear(oid, oid) TO backup; GRANT * Только для Postgres Pro ....................................................................... Конфигурационные файлы для подключения (заготовлены заранее): postgres@hosta$ cat /etc/postgresql/9.6/main/pg_hba.conf | grep backup local all backup peer map=main local replication backup peer map=main postgres@hosta$ cat /etc/postgresql/9.6/main/pg_ident.conf | egrep backup main postgres backup ....................................................................... Отдельная роль для репликации: => CREATE ROLE replicator WITH LOGIN REPLICATION PASSWORD 'p@ssw0rd'; CREATE ROLE ....................................................................... Конфигурационный файл для подключения: postgres@hosta$ cat /etc/postgresql/9.6/main/pg_hba.conf | grep replicator host replication replicator hosta md5 host replication replicator hostb md5 ....................................................................... Настройки кластера для резервного копирования и репликации: => ALTER SYSTEM SET wal_level = replica; ALTER SYSTEM => ALTER SYSTEM SET max_wal_senders = 5; ALTER SYSTEM => ALTER SYSTEM SET max_replication_slots = 5; ALTER SYSTEM => ALTER SYSTEM SET archive_mode = on; ALTER SYSTEM => ALTER SYSTEM SET archive_command = 'test ! -f /var/lib/postgresql/backup/wal/%f && cp %p /var/lib/postgresql/backup/wal/%f'; ALTER SYSTEM ....................................................................... И для инкрементального копирования: => ALTER SYSTEM SET ptrack_enable = on; ALTER SYSTEM * Только Postgres Pro ....................................................................... Перезапускаем сервер, чтобы изменения вступили в силу: => \q pg_ctlcluster 9.6 main restart ....................................................................... Слот для репликации: psql -U postgres => SELECT pg_create_physical_replication_slot('replica'); pg_create_physical_replication_slot ------------------------------------- (replica,) (1 row) ....................................................................... ПОЛНАЯ КОПИЯ ~~~~~~~~~~~~ Файлы вне PGDATA не попадают в резервную копию, поэтому переносим вручную: postgres@hosta$ mkdir /var/lib/postgresql/backup/conf/ postgres@hosta$ cp /etc/postgresql/9.6/main/* /var/lib/postgresql/backup/conf/ Запускаем резервное копирование... * -j позволяет задать несколько параллельных потоков postgres@hosta$ time pg_probackup backup -U backup -b full -j 2 INFO: validate: OMRARS backup and archive log files by CRC real 0m26.459s user 0m4.669s sys 0m5.261s * Не просто копирование файлов, но и проверка корректности как исходных данных (контрольные суммы страниц), так и корректности записи копии на диск * В планах снабдить контрольными суммами все файлы базы данных ....................................................................... postgres@hosta$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRARS 2017-03-13 17:57:47 FULL 1 / 0 0m 2795MB OK postgres@hosta$ du $PGDATA --summarize -h --exclude=pg_xlog 2,7G /var/lib/postgresql/9.6/main * Сжатие в планах ....................................................................... Что внутри? postgres@hosta$ ls -l $BACKUP_PATH total 4 drwx------ 3 egor egor 60 марта 13 17:57 backups drwxr-xr-x 2 egor egor 160 марта 13 17:57 conf -rw-r--r-- 1 egor egor 41 марта 13 17:57 pg_probackup.conf drwx------ 2 egor egor 100 марта 13 17:57 wal postgres@hosta$ ls -l $BACKUP_PATH/backups total 0 drwx------ 3 egor egor 100 марта 13 17:57 OMRARS postgres@hosta$ ls -l $BACKUP_PATH/wal total 32772 -rw------- 1 egor egor 16777216 марта 13 17:57 000000010000000000000041 -rw------- 1 egor egor 16777216 марта 13 17:57 000000010000000000000042 -rw------- 1 egor egor 324 марта 13 17:57 000000010000000000000042.00000028.backup ....................................................................... АВТОНОМНАЯ КОПИЯ ~~~~~~~~~~~~~~~~ * --stream записывает файлы WAL в резерную копию (может использоваться и как автономная, и как обычная) postgres@hosta$ time pg_probackup backup -U backup -b full --stream INFO: validate: OMRASR backup and archive log files by CRC real 0m39.305s user 0m4.659s sys 0m5.039s ....................................................................... postgres@hosta$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRASR 2017-03-13 17:58:26 FULL+STREAM 1 / 0 0m 2829MB OK OMRARS 2017-03-13 17:57:47 FULL 1 / 0 0m 2795MB OK ....................................................................... ВОССТАНОВЛЕНИЕ ~~~~~~~~~~~~~~ --> HostB ВОССТАНОВЛЕНИЕ ~~~~~~~~~~~~~~ postgres@hostb$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRASR 2017-03-13 17:58:26 FULL+STREAM 1 / 0 0m 2829MB OK OMRARS 2017-03-13 17:57:47 FULL 1 / 0 0m 2795MB OK ....................................................................... Останавливаем сервер: pg_ctlcluster 9.6 main stop -m immediate --skip-systemctl-redirect Очищаем PGDATA - это необходимо сделать вручную: postgres@hostb$ rm -rf $PGDATA/* Копируем сохраненные ранее конфигурационные файлы: postgres@hostb$ cp $BACKUP_PATH/conf/*.conf /etc/postgresql/9.6/main/ ....................................................................... Восстановление... * Поиск подходящей резервной копии выполняется автоматически * При необходимости идентификатор копии можно явно указать postgres@hostb$ pg_probackup restore INFO: validate: OMRASR backup and archive log files by SIZE INFO: restore complete. Recovery starts automatically when the PostgreSQL server is started. ....................................................................... Файл, управляющий восстановлением: postgres@hostb$ cat $PGDATA/recovery.conf # recovery.conf generated by pg_probackup 1.0.2 restore_command = 'cp /var/lib/postgresql/backup/wal/%f %p' recovery_target_timeline = '1' * К резервной копии применятся все файлы WAL из архива ....................................................................... Чтобы безопасно запустить восстановленный сервер, надо отключить непрерывное архивирование - иначе новые файлы WAL попадут в тот же каталог. postgres@hostb$ sed -i "s/archive/#archive/" $PGDATA/postgresql.auto.conf Файл с настройками: postgres@hostb$ cat $PGDATA/postgresql.auto.conf # Do not edit this file manually! # It will be overwritten by ALTER SYSTEM command. wal_level = 'replica' max_wal_senders = '5' max_replication_slots = '5' #archive_mode = 'on' #archive_command = 'test ! -f /var/lib/postgresql/backup/wal/%f && cp %p /var/lib/postgresql/backup/wal/%f' ptrack_enable = 'on' ....................................................................... Запускаем сервер: pg_ctlcluster 9.6 main start psql -U postgres => \c demo You are now connected to database "demo" as user "postgres". => \dt bookings.* List of relations Schema | Name | Type | Owner ----------+-----------------+-------+---------- bookings | aircrafts | table | postgres bookings | airports | table | postgres bookings | boarding_passes | table | postgres bookings | bookings | table | postgres bookings | flights | table | postgres bookings | seats | table | postgres bookings | ticket_flights | table | postgres bookings | tickets | table | postgres (8 rows) * Система восстановлена ....................................................................... --> HostA ....................................................................... ИНКРЕМЕНТАЛЬНАЯ КОПИЯ PTRACK ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Чтобы быстро понять, в каком месте восстановлена система, создадим таблицу: => \c postgres You are now connected to database "postgres" as user "postgres". => CREATE TABLE whereami(s text); CREATE TABLE => INSERT INTO whereami VALUES ('ptrack'); INSERT 0 1 ....................................................................... Активность в базе данных создадим с помощью pgbench. Инициализация: postgres@hosta$ pgbench -i NOTICE: table "pgbench_history" does not exist, skipping NOTICE: table "pgbench_tellers" does not exist, skipping NOTICE: table "pgbench_accounts" does not exist, skipping NOTICE: table "pgbench_branches" does not exist, skipping creating tables... 100000 of 100000 tuples (100%) done (elapsed 0.09 s, remaining 0.00 s) vacuum... set primary keys... done. ....................................................................... Запускаем pgbench в фоновом режиме на 20 секунд, параллельно с этим выполняем инкрементальную копию: postgres@hosta$ pgbench -T 20 & starting vacuum...end. postgres@hosta$ sleep 5 postgres@hosta$ time pg_probackup backup -U backup -b ptrack INFO: validate: OMRAWI backup and archive log files by CRC real 0m2.168s user 0m0.115s sys 0m0.116s * Время зависит от числа измененных страниц * Только для Postgres Pro ....................................................................... transaction type: scaling factor: 1 query mode: simple number of clients: 1 number of threads: 1 duration: 20 s number of transactions actually processed: 14085 latency average = 1.420 ms tps = 704.216057 (including connections establishing) tps = 704.411134 (excluding connections establishing) postgres@hosta$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRAWI 2017-03-13 18:00:20 PTRACK 1 / 0 0m 16MB OK OMRASR 2017-03-13 17:58:26 FULL+STREAM 1 / 0 0m 2829MB OK OMRARS 2017-03-13 17:57:47 FULL 1 / 0 0m 2795MB OK * В копию вошли только измененные страницы * В планах улучшение механизма для дифференциальных копий ....................................................................... ИНКРЕМЕНТАЛЬНАЯ КОПИЯ PAGE ~~~~~~~~~~~~~~~~~~~~~~~~~~ Повторим то же самое, но в режиме page. => INSERT INTO whereami VALUES ('page'); INSERT 0 1 * Работает и с обычным PostgreSQL ....................................................................... Запускаем pgbench и резервную копию: postgres@hosta$ pgbench -T 20 & starting vacuum...end. postgres@hosta$ sleep 5 postgres@hosta$ time pg_probackup backup -U backup -b page INFO: validate: OMRAXM backup and archive log files by CRC real 0m3.409s user 0m0.807s sys 0m0.102s * Время зависит от объема WAL-файлов ....................................................................... transaction type: scaling factor: 1 query mode: simple number of clients: 1 number of threads: 1 duration: 20 s number of transactions actually processed: 14216 latency average = 1.407 ms tps = 710.758207 (including connections establishing) tps = 710.921745 (excluding connections establishing) postgres@hosta$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRAXM 2017-03-13 18:01:01 PAGE 1 / 0 0m 16MB OK OMRAWI 2017-03-13 18:00:20 PTRACK 1 / 0 0m 16MB OK OMRASR 2017-03-13 17:58:26 FULL+STREAM 1 / 0 0m 2829MB OK OMRARS 2017-03-13 17:57:47 FULL 1 / 0 0m 2795MB OK * Примерно тот же размер * Результат page и ptrack совпадают, отличаются только механизмы ....................................................................... ПРОВЕРКА РЕЗЕРВНЫХ КОПИЙ ~~~~~~~~~~~~~~~~~~~~~~~~ Можно проверить корректность копии, не прибегая к восстановлению. Команда validate принимает те же параметры, что и restore. * Проверяются контрольные суммы и наличие необходимых WAL-файлов postgres@hosta$ pg_probackup validate INFO: validate: OMRASR backup and archive log files by CRC INFO: validate: OMRAWI backup and archive log files by CRC INFO: validate: OMRAXM backup and archive log files by CRC INFO: backup validation completed successfully on time 2017-03-13 18:01:00 and xid 20773 ....................................................................... postgres@hosta$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRAXM 2017-03-13 18:01:01 PAGE 1 / 0 0m 16MB OK OMRAWI 2017-03-13 18:00:20 PTRACK 1 / 0 0m 16MB OK OMRASR 2017-03-13 17:58:26 FULL+STREAM 1 / 0 0m 2829MB OK OMRARS 2017-03-13 17:57:47 FULL 1 / 0 0m 2795MB OK Проверка возможности восстановления на указанную дату: postgres@hosta$ pg_probackup validate --time='2017-03-13 18:00:52' INFO: validate: OMRASR backup and archive log files by CRC INFO: validate: OMRAWI backup and archive log files by CRC INFO: backup validation completed successfully on time 2017-03-13 18:00:52 and xid 14847 ....................................................................... Спрячем один из WAL-файлов: postgres@hosta$ ls -t $BACKUP_PATH/wal/*[[:digit:]] /var/lib/postgresql/backup/wal/000000010000000000000049 /var/lib/postgresql/backup/wal/000000010000000000000048 /var/lib/postgresql/backup/wal/000000010000000000000047 /var/lib/postgresql/backup/wal/000000010000000000000046 /var/lib/postgresql/backup/wal/000000010000000000000045 /var/lib/postgresql/backup/wal/000000010000000000000044 /var/lib/postgresql/backup/wal/000000010000000000000043 /var/lib/postgresql/backup/wal/000000010000000000000042 /var/lib/postgresql/backup/wal/000000010000000000000041 postgres@hosta$ mv /var/lib/postgresql/backup/wal/000000010000000000000047 /var/lib/postgresql/backup/wal/000000010000000000000047.hidden ....................................................................... postgres@hosta$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRAXM 2017-03-13 18:01:01 PAGE 1 / 0 0m 16MB OK OMRAWI 2017-03-13 18:00:20 PTRACK 1 / 0 0m 16MB OK OMRASR 2017-03-13 17:58:26 FULL+STREAM 1 / 0 0m 2829MB OK OMRARS 2017-03-13 17:57:47 FULL 1 / 0 0m 2795MB OK postgres@hosta$ pg_probackup validate --time='2017-03-13 18:00:52' INFO: validate: OMRASR backup and archive log files by CRC INFO: validate: OMRAWI backup and archive log files by CRC WARNING: WAL segment "/var/lib/postgresql/backup/wal/000000010000000000000047" is absent WARNING: recovery can be done up to time 2017-03-13 18:00:19 and xid 5585 ERROR: not enough WAL records to time 2017-03-13 18:00:52 * Отсутствие файла обнаружено; сообщение дает понять, до какого момента возможно восстановление ....................................................................... Вернем файл обратно: postgres@hosta$ mv /var/lib/postgresql/backup/wal/000000010000000000000047.hidden /var/lib/postgresql/backup/wal/000000010000000000000047 ....................................................................... ВОССТАНОВЛЕНИЕ НА МОМЕНТ ВРЕМЕНИ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> HostB ....................................................................... ВОССТАНОВЛЕНИЕ НА МОМЕНТ ВРЕМЕНИ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ postgres@hostb$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRAXM 2017-03-13 18:01:01 PAGE 1 / 0 0m 16MB OK OMRAWI 2017-03-13 18:00:20 PTRACK 1 / 0 0m 16MB OK OMRASR 2017-03-13 17:58:26 FULL+STREAM 1 / 0 0m 2829MB OK OMRARS 2017-03-13 17:57:47 FULL 1 / 0 0m 2795MB OK ....................................................................... pg_ctlcluster 9.6 main stop -m immediate --skip-systemctl-redirect postgres@hostb$ rm -rf $PGDATA/* Чтобы восстановить систему на определенный момент времени, указываем его в ключе --time. Подходящая резервная копия будет выбрана автоматически. postgres@hostb$ pg_probackup restore --time='2017-03-13 18:00:20' INFO: validate: OMRASR backup and archive log files by SIZE INFO: validate: OMRAWI backup and archive log files by SIZE INFO: restore complete. Recovery starts automatically when the PostgreSQL server is started. * Можно также указать номер транзакции --xid, ветвь времени --timeline * Именованные точки восстановления не поддерживаются ....................................................................... Файл, управляющий восстановлением: postgres@hostb$ cat $PGDATA/recovery.conf # recovery.conf generated by pg_probackup 1.0.2 restore_command = 'cp /var/lib/postgresql/backup/wal/%f %p' recovery_target_time = '2017-03-13 18:00:20' recovery_target_timeline = '1' ....................................................................... postgres@hostb$ sed -i "s/archive/#archive/" $PGDATA/postgresql.auto.conf Файл с настройками: postgres@hostb$ cat $PGDATA/postgresql.auto.conf # Do not edit this file manually! # It will be overwritten by ALTER SYSTEM command. wal_level = 'replica' max_wal_senders = '5' max_replication_slots = '5' #archive_mode = 'on' #archive_command = 'test ! -f /var/lib/postgresql/backup/wal/%f && cp %p /var/lib/postgresql/backup/wal/%f' ptrack_enable = 'on' ....................................................................... Запускаем сервер: pg_ctlcluster 9.6 main start psql -U postgres => SELECT * FROM whereami; s -------- ptrack (1 row) ....................................................................... РАЗВЕРТЫВАНИЕ РЕПЛИКИ ~~~~~~~~~~~~~~~~~~~~~ Еще раз восстановим систему, на этот раз - на самый последний момент времени: pg_ctlcluster 9.6 main stop -m immediate --skip-systemctl-redirect postgres@hostb$ rm -rf $PGDATA/* postgres@hostb$ pg_probackup restore INFO: validate: OMRASR backup and archive log files by SIZE INFO: validate: OMRAWI backup and archive log files by SIZE INFO: validate: OMRAXM backup and archive log files by SIZE INFO: restore complete. Recovery starts automatically when the PostgreSQL server is started. ....................................................................... Файл с настройками: postgres@hostb$ cat $PGDATA/recovery.conf # recovery.conf generated by pg_probackup 1.0.2 restore_command = 'cp /var/lib/postgresql/backup/wal/%f %p' recovery_target_timeline = '1' Дополним его указанием режима резерва и параметров для подключения к мастеру: postgres@hostb$ echo standby_mode = 'on' >> $PGDATA/recovery.conf postgres@hostb$ echo "primary_conninfo = 'host=hosta user=replicator password=p@ssw0rd port=5432'" >> $PGDATA/recovery.conf postgres@hostb$ echo primary_slot_name = 'replica' >> $PGDATA/recovery.conf ....................................................................... Файл с настройками: postgres@hostb$ cat $PGDATA/postgresql.auto.conf # Do not edit this file manually! # It will be overwritten by ALTER SYSTEM command. wal_level = 'replica' max_wal_senders = '5' max_replication_slots = '5' archive_mode = 'on' archive_command = 'test ! -f /var/lib/postgresql/backup/wal/%f && cp %p /var/lib/postgresql/backup/wal/%f' ptrack_enable = 'on' Дополним параметрами для горячего резерва: postgres@hostb$ echo hot_standby = on >> $PGDATA/postgresql.auto.conf postgres@hostb$ echo hot_standby_feedback = on >> $PGDATA/postgresql.auto.conf ....................................................................... Запускаем сервер: pg_ctlcluster 9.6 main start psql -U postgres => SELECT * FROM whereami; s -------- ptrack page (2 rows) ....................................................................... Проверим работу репликации. --> HostA ....................................................................... РАЗВЕРТЫВАНИЕ РЕПЛИКИ ~~~~~~~~~~~~~~~~~~~~~ Состояние репликации можно посмотреть в системном представлении: => \x Expanded display is on. => SELECT * FROM pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 10716 usesysid | 16516 usename | replicator application_name | walreceiver client_addr | 10.0.2.11 client_hostname | hostb client_port | 53309 backend_start | 2017-03-13 18:04:03.118238+04 backend_xmin | state | streaming sent_location | 0/4B8EC530 write_location | 0/4B8EC530 flush_location | 0/4B8EC530 replay_location | 0/4B1FEF00 sync_priority | 0 sync_state | async => \x Expanded display is off. ....................................................................... Добавим еще строку в таблицу: => INSERT INTO whereami VALUES ('replication'); INSERT 0 1 ....................................................................... --> HostB ....................................................................... psql -U postgres Вот добавленная строка: => SELECT * FROM whereami; s ------------- ptrack page replication (3 rows) ....................................................................... РЕЗЕРВНАЯ КОПИЯ С РЕПЛИКИ (9.6) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ В 9.6 появилась возможность немонопольного резервного копирования, в том числе с реплики. Выполним на реплике полную копию: postgres@hostb$ pg_probackup backup -U backup -b full INFO: validate: OMRB3H backup and archive log files by CRC postgres@hostb$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRB3H 2017-03-13 18:04:55 FULL 1 / 0 0m 2812MB OK OMRAXM 2017-03-13 18:01:01 PAGE 1 / 0 0m 16MB OK OMRAWI 2017-03-13 18:00:20 PTRACK 1 / 0 0m 16MB OK OMRASR 2017-03-13 17:58:26 FULL+STREAM 1 / 0 0m 2829MB OK OMRARS 2017-03-13 17:57:47 FULL 1 / 0 0m 2795MB OK * В ближайших планах поддержать и инкрементальные копии с реплики ....................................................................... Все, реплика нам больше не понадобится. => \q pg_ctlcluster 9.6 main stop --> HostA ....................................................................... РЕЗЕРВНАЯ КОПИЯ С РЕПЛИКИ ~~~~~~~~~~~~~~~~~~~~~~~~~ Чтобы из резервной копии можно было восстановиться, нужно, чтобы все необходимые файлы WAL добрались до хранилища. Увы, в настоящее время на реплике нельзя скомандовать мастеру, чтобы он переключил сегменты журнала, так что выполним переключение вручную: => SELECT pg_switch_xlog(); pg_switch_xlog ---------------- 0/4B8EE670 (1 row) * При постоянной активности на сервере достаточно немного подождать ....................................................................... Убедимся, что основной сервер можно восстановить из резервной копии, сделанной на реплике: => \q pg_ctlcluster 9.6 main stop postgres@hosta$ rm -rf $PGDATA/* postgres@hosta$ pg_probackup restore INFO: validate: OMRB3H backup and archive log files by SIZE INFO: restore complete. Recovery starts automatically when the PostgreSQL server is started. ....................................................................... Файл, управляющий восстановлением: postgres@hosta$ cat $PGDATA/recovery.conf # recovery.conf generated by pg_probackup 1.0.2 restore_command = 'cp /var/lib/postgresql/backup/wal/%f %p' recovery_target_timeline = '1' ....................................................................... postgres@hosta$ sed -i "s/hot_standby/#hot_standby/" $PGDATA/postgresql.auto.conf Файл с настройками: postgres@hosta$ cat $PGDATA/postgresql.auto.conf # Do not edit this file manually! # It will be overwritten by ALTER SYSTEM command. wal_level = 'replica' max_wal_senders = '5' max_replication_slots = '5' archive_mode = 'on' archive_command = 'test ! -f /var/lib/postgresql/backup/wal/%f && cp %p /var/lib/postgresql/backup/wal/%f' ptrack_enable = 'on' #hot_standby = on #hot_standby_feedback = on ....................................................................... pg_ctlcluster 9.6 main start psql -U postgres => SELECT * FROM whereami; s ------------- ptrack page replication (3 rows) * Восстановились успешно ....................................................................... ПОЛИТИКИ ХРАНЕНИЯ ~~~~~~~~~~~~~~~~~ postgres@hosta$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRB3H 2017-03-13 18:04:55 FULL 1 / 0 0m 2812MB OK OMRAXM 2017-03-13 18:01:01 PAGE 1 / 0 0m 16MB OK OMRAWI 2017-03-13 18:00:20 PTRACK 1 / 0 0m 16MB OK OMRASR 2017-03-13 17:58:26 FULL+STREAM 1 / 0 0m 2829MB OK OMRARS 2017-03-13 17:57:47 FULL 1 / 0 0m 2795MB OK По умолчанию политика не установлена: postgres@hosta$ pg_probackup retention show No retention policy is set ....................................................................... Политика обычно задается в конфигурационном файле: postgres@hosta$ echo redundancy = 2 >> $BACKUP_PATH/pg_probackup.conf postgres@hosta$ pg_probackup retention show # retention policy REDUNDANCY=2 Но можно задать и ключами в командной строке. * Redundancy - число полных резервных копий * Window - время, на которое можно восстановиться назад ....................................................................... Отдельная команда удаляет резервные копии, не соответствующие политике: postgres@hosta$ pg_probackup retention purge INFO: delete: OMRARS 2017-03-13 17:57:47 INFO: removed min WAL segment "000000010000000000000041" INFO: removed max WAL segment "000000010000000000000043" INFO: purging is finished postgres@hosta$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRB3H 2017-03-13 18:04:55 FULL 1 / 0 0m 2812MB OK OMRAXM 2017-03-13 18:01:01 PAGE 1 / 0 0m 16MB OK OMRAWI 2017-03-13 18:00:20 PTRACK 1 / 0 0m 16MB OK OMRASR 2017-03-13 17:58:26 FULL+STREAM 1 / 0 0m 2829MB OK * Также автоматически удаляются ненужные WAL-файлы * Предполагается, что команда вызывается по расписанию ....................................................................... УДАЛЕНИЕ ВРУЧНУЮ ~~~~~~~~~~~~~~~~ Резервную копию можно удалить вручную, указав номер: postgres@hosta$ pg_probackup delete OMRAWI INFO: delete: OMRAWI 2017-03-13 18:00:20 INFO: delete: OMRAXM 2017-03-13 18:01:01 postgres@hosta$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRB3H 2017-03-13 18:04:55 FULL 1 / 0 0m 2812MB OK OMRASR 2017-03-13 17:58:26 FULL+STREAM 1 / 0 0m 2829MB OK * Удаляется указанная копия и все инкрементальные копии, сделанные поверх нее ....................................................................... postgres@hosta$ pg_probackup delete OMRASR INFO: delete: OMRASR 2017-03-13 17:58:26 postgres@hosta$ pg_probackup show ========================================================================================= ID Recovery time Mode Current/Parent TLI Time Data Status ========================================================================================= OMRB3H 2017-03-13 18:04:55 FULL 1 / 0 0m 2812MB OK ....................................................................... Ненужные уже WAL-файлы удаляются специальной командой: postgres@hosta$ pg_probackup delwal INFO: removed min WAL segment "000000010000000000000044" INFO: removed max WAL segment "000000010000000000000048" Или можно указать ключ --delwal в команде delete ....................................................................... Конец демонстрации.