Возникла необходимость быстро и как можно проще организовать репликацию данных с сервера БД на резервный сервер. Простой и понятный способ на просторах Сети так и не нашелся, по этому пришлось по частям собрать информацию, которая и стала этой статьёй.
Решаемая задача. Исходные данные
Итак, имеем сервер БД, с которым работают клиенты, и резервный сервер, на который надо настроить репликацию с основной базы данных.
В моём случае используется PostgreSQL 9.2.1, который установлен на обоих серверах и поддерживает потоковую репликацию. Предположим что база данных на основном сервере развернута и работает, на резервном только установлен, но не настроен PostgreSQL. Для примера возьмем IP-адрес 192.168.1.1 за адрес основного сервера, IP-адрес 192.168.1.2 — за адрес резервного.
Настраиваем основной сервер БД
В разделе «Роли входа», через PgAdmin создаем пользователя (роль) repl с правами «Может создавать потоковую репликацию и резервные копии». Дописываем в pg_hba или через «Конфигурацию сервера» в PgAdmin создаем строку, разрешающую пользователю repl подключение к БД.
host replication repl 192.168.1.2/32 trust
В файле postgresql.conf сделали следующие изменения:
Первоначальное значение | Сменили значение | Описание |
---|---|---|
#max_wal_senders = 1 | max_wal_senders = 2 | Число резервных серверов, которое может подключится к основному серверу |
#wal_keep_segments = 32 | wal_keep_segments = 32 (можно поставить 256) | Сколько хранить сегментов. Нужно количество надо выбрать такое, чтобы резервный сервер успевал все забирать и обрабатывать. Я поставил 256 чтобы за сутки wal-файлы не затирались |
#wal_level = hot_standby | wal_level = hot_standby | hot_standby добавляет информацию, необходимую для запуска только для чтения запросов на резервный сервер |
#checkpoint_segments = 3 | checkpoint_segments = 16 | Можно увеличить количество сегментов в WAL-логе |
Настраиваем резервный сервер
Останавливаем сервис Postgresql 9.2 на резервном сервере и очищаем папку с данными, которые создаются при установке PostgreSQL, например D:database. После этого запускаем бекап из командной строки:
"C:PostgreSQLbinpg_basebackup.exe" --host=192.168.1.1 --port=5432 --username=repl -D "D:database"
Настраиваем postgresql.conf в D:database
Первоначальное значение | Сменили значение | Описание |
---|---|---|
#hot_standby = off | hot_standby = on | Разрешит read-only запросы к СУБД во время процесса восстановления |
Настраиваем recovery.conf в D:database
Значение | Описание |
---|---|
standby_mode = 'on' | Включить режим восстановления и работать как резервный сервер (slave) |
primary_conninfo = 'host=192.168.1.1 port=5432 user=repl' | Параметры для соединения с основным сервером |
trigger_file = 'D:\database\end_trig' | Если создадим файл с именем end_trig в указанной папке, то сервер выйдет из режима репликации и станет обычным сервером |
Запускаем сервис Postgresql на резервном сервере. Должно стартовать без ошибок. Проверяем работу репликации: производим изменения в таблице на основном сервере, и проверяем — отразились ли они на резервном.
Настройка архивирования логов (если нужно)
В файле postgresql.conf на основном сервере включаем следующее:
archive_mode = on | archive_command = 'copy "%p" «e:\Backup\%f»' |
В папку e:Backup будут падать архивы логов. (Внимание, они могут забить все место на диске, нужно настроить очистку при переполнении)
Чтобы воспользоваться архивами логов, нужно cкопировать логи в папку из которой будем восстанавливаться и в recovery.conf дописать строчку
restore_command = 'copy "e:\Backup\%f" "%p"'
Действия при сбоях
Если вышел из строя резервный сервер, то останавливаем на нем службу Postgres и выполняем все действия как в пункте «Настраиваем резервный сервер».
Если вышел из строя основной сервер, то необходимо перевести резервный сервер в обычный режим работы: для этого необходимо создать файл end_trig в папке как указано в recovery.conf trigger_file = 'D:\database\end_trig' b сделать vacuum и reindex базы.
Примечания
Репликации можно настраивать как с Windows XP на Windows 7, так и наоборот.
Для Windows 7 и Wndows XP в pg_hba разные настройки, т.к. в XP нет протокола ip6, то строка с ним должна быть закомментирована.
Автор: RazdoR
Чувак, спасибо тебе – ты этой статьёй чуть ли не жизнь мне спас))
Можно обновить инструкцию до актуальной версии Postgresql 9.5
После запуска бэкапа сиз командной строки происходят ошибки при копировании лога и конфиг олд, копирую в ручную сервер не стартует!
Проверь права на файлы перед бэкапом.