Для реализации потоковой репликации требуется наличие, как минимума 2-х серверов:
- Имя мастера: master-db / IP 192.168.0.1
- Имя слейва: slave-db / IP 192.168.0.2
Устанавливаем на каждый сервер postgresql:
sudo apt-get update sudo apt-get install postgresql postgresql-contrib
Устанавливаем дополнения:
sudo apt-get install postgis sudo apt install postgresql-10-postgis-scripts sudo apt install postgresql-plv8 sudo apt install nodejs npm
Настраиваем мастер
Создаем пользователя для репликации:
sudo su postgres #В этот момент мы авторизовываемся под пользователем postgres psql postgres=# CREATE USER replica REPLICATION LOGIN CONNECTION LIMIT 2 PASSWORD 'qwe-123'; \q
Создан пользователь replica с паролем qwe-123
Переходим в каталог:
cd /etc/postgresql/10/main/pg_hba.conf
Чтобы не было проблем с доступом в IP адресах указывал 0.0.0.0/32 — доступ разрешен со всех IP
Проверяем наличие следующей строки:
Добавляем пользователя для репликации:
Здесь мы указали, что репликация разрешена пользователя с именем replica, подключающемуся с адреса 192.168.0.2
Далее переходим к изменению файла postgresql.conf
Требуется проверить наличие следующих параметров и значений:
listen_addresses = '*' wal_level = replica max_wal_senders = 2 wal_keep_segments = 100
- listen_addresses — разрешаем подключение с любых клиентских приложений.
- wal_level — Отвечает за количество информации записываемой в WAL
- max_wal_senders — Отвечает за количество одновременно подключенных слейвов у мастера.
- wal_keep_segments — 1 сегмент = 16 метров. Сколько сегментов будет указано хранить здесь, столько postgres сохранит прежде чем при добавлении следующего удалить самый старый сегмент.
Перезапускаем postgres
sudo systemctl restart postgresql
Настройка слейва
Останавливаем postgresql
sudo su postgres service postgresql stop #система попросит ввести пароль вашей админской учетки
Удаляем данные. Внимание!!! Главное не перепутать с мастером.
#будучи всё еще авторизованными под пользователем postgres rm -R /var/lib/postgresql/10/main/
Для того чтобы инициализировать репликацию, необходимо скачать с сервера свежую копию данных. Иначе если разрыв данных будет слишком велик (больше чем доступно данных согласно wal_keep_segments), репликация попросту не запустится.
Закачиваем данные с мастер:
#будучи всё еще авторизованными под пользователем postgres pg_basebackup -P -R -X stream -c fast -h 192.168.0.1 -U replica -D /var/lib/postgresql/10/main/ service postgresql start #система попросит ввести пароль вашей админской учетки
Примечание: Некоторые параметры после выполнения вышеуказанной команды можно отредактировать в файле /var/lib/postgresql/10/main/recovery.conf
- standby_mode = ‘on’ — значит что сервер является резервным и после скачивания последнего WAL файла продолжит пытаться скачивать их используя данные из primary_conninfo
- primary_conninfo — строка подключения слейва к мастеру
Редактируем файл pg_hba.conf
Редактируем posgtgresql.conf
- listen_address = ‘*’
- hot_standby = on # режим только для чтения
Запускаем слайев:
#будучи всё еще авторизованными под пользователем postgres service postgresql start
Ссылки:
Дополнительные команды:
select pg_is_in_recovery(); - в каком режиме работает БД select * from pg_stat_replication; - системное представление