Настройка потоковой репликации PostgreSQL

Обновлено и опубликовано Опубликовано:

Тематические термины: PostgreSQL.

Репликация PostgreSQL представляет из себя способ реализации отказоустойчивого кластера. Инструкция написана на примере PostgreSQL 9.6, также она будет работать для PostgreSQL 10. Команды 

В данном примере мы настроим потоковую (streaming) репликацию. Другой тип репликации (логическая) добавлена в PostgreSQL 10. Она позволяет реплицировать разные базы данных и таблицы на разные реплики.

Также, мы будем применять асинхронную репликацию — это вид репликации, при котором запросы выполняются сначала на мастере, затем попадают в журнал операций (WAL) и только после этого — на slave. При синхронной репликации запросы сначала попадают в WAL — после в мастер и слейв.

Используемые в данном руководстве команды, применимы для операционных систем Linux. Если Postgre работает под Windows, данную инструкцию можно использовать как шпаргалку для настройки конфигурационных файлов СУБД.

1. Подготовка серверов

Для начала, готовим наши серверы к настройке кластера.

PostgreSQL

На всех серверах баз данных должна быть установлена одна и та же версия PostgreSQL. Также, все серверы должны иметь одну и ту же архитектуру процессора.

Вот пример установки сервера PostgreSQL на CentOS 7.

Брандмауэр

При использовании брандмауэра, необходимо открыть TCP-порт 5432 — он используется сервером postgre.

а) Если управление выполняется с помощью Firewalld:

firewall-cmd --permanent --add-port=5432/tcp

firewall-cmd --reload

б) Если используем Iptables:

iptables -A INPUT -p tcp --dport 5432 -j ACCEPT

в) Если используем UFW:

ufw allow 5432/tcp

SELinux

Если активирована система безопасности SELinux (по умолчанию в системах Red Hat / CentOS / Fedora), отключаем ее:

setenforce 0

sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

Если необходимо, чтобы SELinux работал, настраиваем его.

2. Настройки на Master

Пошагово, выполняем следующие действия.

Создаем пользователя в PostgreSQL

Входим в систему под пользователем postgres:

su - postgres

Создаем нового пользователя для репликации:

createuser --replication -P repluser

* система запросит пароль — его нужно придумать и ввести дважды. В данном примере мы создаем пользователя repluser.

Выходим из оболочки пользователя postgres:

exit

Настраиваем postgresql

Открываем конфигурационный файл postgresql.conf.

а) если используем Red Hat / CentOS:

vi /var/lib/pgsql/9.6/data/postgresql.conf

б) если используем Debian / Ubuntu:

vi /etc/postgresql/9.6/main/postgresql.conf

Редактируем следующие параметры:

listen_addresses = 'localhost, 192.168.1.10'
wal_level = hot_standby
max_wal_senders = 2
max_replication_slots = 2
hot_standby = on
hot_standby_feedback = on

* где

  • 192.168.1.10 — IP-адрес сервера, на котором он будем слушать запросы Postgre; 
  • wal_level указывает, сколько информации записывается в WAL (журнал операций, который используется для репликации) — hot_standby указывает на хранение дополнительной информации, она нужна для выполнения запросов на резервном сервере в режиме только для чтения; 
  • max_wal_senders — количество планируемых слейвов; 
  • max_replication_slots — максимальное число слотов репликации; 
  • hot_standby — определяет, можно или нет подключаться к postgresql для выполнения запросов в процессе восстановления; 
  • hot_standby_feedback — определяет, будет или нет сервер slave сообщать мастеру о запросах, которые он выполняет.

Открываем конфигурационный файл pg_hba.conf.

а) если используем Red Hat / CentOS:

vi /var/lib/pgsql/9.6/data/pg_hba.conf

б) если используем Debian / Ubuntu:

vi /etc/postgresql/9.6/main/pg_hba.conf

Добавляем следующие строки:

host replication repluser 127.0.0.1/32 md5
host replication repluser 192.168.1.10/32 md5
host replication repluser 192.168.1.11/32 md5

* данной настройкой мы разрешаем подключение к базе данных replication пользователю repluser с локального сервера (localhost и 192.168.1.10) и сервера 192.168.1.11.

Перезапускаем службу postgresql:

systemctl restart postgresql-9.6

* в данном примере настройка выполняется для postgresql версии 9.6.

3. Настройки на Slave

Останавливаем сервис postgresql:

systemctl stop postgresql-9.6

На всякий случай, создаем архив данных базы, удаляем содержимое каталога с данными и копируем данные с master сервера.

а) если используем Red Hat / CentOS:

tar -czvf /tmp/data_pgsql.tar.gz /var/lib/pgsql/9.6/data

rm -rf /var/lib/pgsql/9.6/data/* 

... если у нас postgresql 9:

sudo -u postgres pg_basebackup -h 192.168.1.10 -U repluser -D /var/lib/pgsql/9.6/data --xlog-method=stream --write-recovery-conf

... если у нас postgresql 10:

su - postgres -c "pg_basebackup --host=192.168.1.10 --username=repluser --pgdata=/var/lib/pgsql/10/data --wal-method=stream"

б) если используем Debian / Ubuntu:

tar -czvf /tmp/data_pgsql.tar.gz /var/lib/postgresql/9.6/main

rm -rf /var/lib/postgresql/9.6/main/*

... если у нас postgresql 9:

sudo -u postgres pg_basebackup -h 192.168.1.10 -U replica -D /var/lib/postgresql/9.6/main --xlog-method=stream --write-recovery-conf

... если у нас postgresql 10:

su - postgres -c "pg_basebackup --host=192.168.1.10 --username=repluser --pgdata=/var/lib/postgresql/10/main --wal-method=stream"

* последняя команда сделаем реплику базы от мастера и создаст конфигурационный файл recovery.conf, в котором указаны параметры репликации.

Редактируем конфигурационный файл postgresql.conf.

а) если используем Red Hat / CentOS:

vi /var/lib/pgsql/9.6/data/postgresql.conf

б) если используем Debian / Ubuntu:

vi /etc/postgresql/9.6/main/postgresql.conf

Редактируем следующие параметры:

listen_addresses = 'localhost, 192.168.1.11'

* где 192.168.1.11 — IP-адрес нашего вторичного сервера.

Снова запускаем сервис postgresql:

systemctl start postgresql-9.6

4. Проверка репликации

Посмотреть статус

Статус работы репликации можно посмотреть следующими командами.

На мастере:

=# select * from pg_stat_replication;

На слейве:

=# select * from pg_stat_wal_receiver;

Создать тестовую базу

На мастере заходим в командную оболочку Postgre:

sudo -u postgres psql

Создаем новую базу данных:

=# CREATE DATABASE repltest ENCODING='UTF8';

Теперь на вторичном сервере смотрим список баз:

sudo -u postgres psql

=# \l

Мы должны увидеть среди баз ту, которую создали на первичном сервере:

   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access
-----------+----------+----------+-------------+-------------+-----------------
 ...
 repltest  | postgres | UTF8     | ru_RU.UTF-8 | ru_RU.UTF-8 | 
 ...

# Серверы # Базы данных
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет