Тематические термины: PostgreSQL.
Репликация PostgreSQL представляет из себя способ реализации отказоустойчивого кластера. Инструкция написана на примере PostgreSQL 9.6, также она будет работать для PostgreSQL 9.2 и 10. Команды
В данном примере мы настроим потоковую (streaming) репликацию. Другой тип репликации (логическая) добавлена в PostgreSQL 10. Она позволяет реплицировать разные базы данных и таблицы на разные реплики.
Также, мы будем применять асинхронную репликацию — это вид репликации, при котором запросы выполняются сначала на мастере, затем попадают в журнал операций (WAL) и только после этого — на slave. При синхронной репликации запросы сначала попадают в WAL — после в мастер и слейв.
Используемые в данном руководстве команды, применимы для операционных систем Linux. Если Postgre работает под Windows, данную инструкцию можно использовать как шпаргалку для настройки конфигурационных файлов СУБД.
Для начала, готовим наши серверы к настройке кластера.
На всех серверах баз данных должна быть установлена одна и та же версия 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 (по умолчанию в системах Red Hat / CentOS / Fedora), отключаем ее:
setenforce 0
sed -i ‘s/^SELINUX=.*/SELINUX=disabled/g’ /etc/selinux/config
Если необходимо, чтобы SELinux работал, настраиваем его.
В данной статье мы будем настраивать серверы с IP-адресами 192.168.1.10 (первичный или master) и 192.168.1.11 (вторичный или slave).
Переходим на сервер, с которого будем реплицировать данные (мастер) и выполняем следующие действия.
Входим в систему под пользователем postgres:
su – postgres
Создаем нового пользователя для репликации:
createuser –replication -P repluser
* система запросит пароль — его нужно придумать и ввести дважды. В данном примере мы создаем пользователя repluser.
Выходим из оболочки пользователя postgres:
Открываем конфигурационный файл postgresql.conf.
а) если используем Red Hat / CentOS:
vi /var/lib/pgsql/9.6/data/postgresql.conf
б) если используем Debian / Ubuntu:
vi /etc/postgresql/9.6/main/postgresql.conf
* для postgresql версии 9.2 путь может быть другой — без 9.6 (/var/lib/pgsql/data/postgresql.conf или /etc/postgresql/main/postgresql.conf).
Редактируем следующие параметры:
listen_addresses = ‘localhost, 192.168.1.10’wal_level = hot_standbymax_wal_senders = 2max_replication_slots = 2hot_standby = onhot_standby_feedback = on
* где
Открываем конфигурационный файл pg_hba.conf.
vi /var/lib/pgsql/9.6/data/pg_hba.conf
vi /etc/postgresql/9.6/main/pg_hba.conf
Добавляем следующие строки:
host replication repluser 127.0.0.1/32 md5host replication repluser 192.168.1.10/32 md5host 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.
Останавливаем сервис postgresql:
systemctl stop postgresql-9.6
На всякий случай, создаем архив данных базы, удаляем содержимое каталога с данными и копируем данные с master сервера.
tar -czvf /tmp/data_pgsql.tar.gz /var/lib/pgsql/9.6/data
rm -rf /var/lib/pgsql/9.6/data/*
… если у нас postgresql 9.2:
sudo -u postgres pg_basebackup -h 192.168.1.10 -U repluser -D /var/lib/pgsql/9.6/data –xlog-method=stream
… если у нас postgresql 9.6:
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”
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
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.
listen_addresses = ‘localhost, 192.168.1.11’
* где 192.168.1.11 — IP-адрес нашего вторичного сервера.
Снова запускаем сервис postgresql:
systemctl start postgresql-9.6
Статус работы репликации можно посмотреть следующими командами.
На мастере:
=# select * from pg_stat_replication;
На слейве:
=# select * from pg_stat_wal_receiver;
На мастере заходим в командную оболочку Postgre:
sudo -u postgres psql
Создаем новую базу данных:
=# CREATE DATABASE repltest ENCODING=’UTF8′;
Теперь на вторичном сервере смотрим список баз:
Мы должны увидеть среди баз ту, которую создали на первичном сервере:
Name | Owner | Encoding | Collate | Ctype | Access———–+———-+———-+————-+————-+—————– … repltest | postgres | UTF8 | ru_RU.UTF-8 | ru_RU.UTF-8 | …
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies