Репликация PostgreSQL master slave

Содержание
Введение
setup
Для PostgreSQL 9.2
Настройка master
Настройка slave (stand by)
Похожие статьи

Введение

Цель - настроить автоматическое копирование (репликацию) баз данных с сервера.

Тот сервер, с которого копируется информация принято называть ведущим или первичным. В англоязычной литературе принято называть его master.

Сервер на который сохраняется копия (реплика) принято называть ведомым или вторичным. На английском это раньше называлось slave а сейчас внедряют более политкорректный термин standby.

[andrei@localhost ~]$ в начале строки означает, что команды выполняются от имени обычного пользователя CentOS 7, входящего в группу sudo

-bash-4.2$ в начале строки означает, что команды выполняются от пользователя postgres

-bash-4.2$ в начале строки означает, что команды выполняются от пользователя postgres

Это указано не всегда, но если указано - значит нужно обратить на это внимание.

Настройка сильно зависит от версии, даже от минорной.

Напомню, что политика PostgreSQL по присваиванию версий немного изменилась между 9.6 и 10.

То есть 9.6 отличается не только от 10 но и от 9.2. Некоторых параметров, доступных в 9.6 просто нет в 9.2

Подготовка рабочей среды

Нужно установить и настроить две базы данных PostgreSQL.

В этом примере вы узнаете как это сделать с помощью двух виртуальных CentOS Linux на VirtualBox

В этом примере:

у ведущего сервера (master) IP адрес 192.168.56.109 (master_ip)

у ведомого (slave/stand by) 192.168.56.110 (slave_ip)

Темы с которыми рекомендуется познакомиться для создания аналогичного сетапа:

На каждом хосте установите PostgreSQL

sudo yum install postgresql-server postgresql-contrib

Задайте пароль пользователю postgres

sudo passwd postgres

Залогиньтесь под этим пользователем

sudo su - postgres

Создайте ssh-ключ для этого пользователя.

ssh-keygen

На все появившиеся уведомления нажмите Enter.

Передайте ключ на другой сервер:

ssh-copy-id IP_адрес_другого_сервера

Инициализируйте базу данных и запустите сервер

cd /var/lib/pgsql
postgresql-setup initdb
/usr/bin/pg_ctl -D /var/lib/pgsql/data -l logfile start

На обоих хостах отройте порт 5432. Если вы не знаете как это сделать - инструкцию можно найти в статье

«CentOS Firewall - открыть порт»

PostgreSQL 9.2

PostgreSQL 9.2 уже не поддерживается .

На момент написания статьи самая близкая поддерживаемая версия это 9.6

Настройка master

Сперва нужно настроить ведущий сервер (master)

Расположение конфигурационного файла postgresql.conf можно получить выполнив

-bash-4.2$ su - postgres -c "psql -c 'SHOW config_file;'"

Password: config_file ------------------------------------- /var/lib/pgsql/data/postgresql.conf (1 row)

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

wal_level = hot_standby
max_wal_senders = 1
wal_keep_segments = 50

# - Connection Settings - listen_addresses = 'localhost, 192.168.56.109' # what IP address(es) to listen on;

wal_level = hot_standby # minimal, archive, or hot_standby

max_wal_senders = 1 # max number of walsender processes # (change requires restart) wal_keep_segments = 50 # in logfile segments, 16MB each; 0 disables

Перезапустить postgresql от обычного пользователя

[andrei@host ~]$ sudo systemctl restart postgresql

Снова залогиньтесь под postgres

sudo su - postgres

В файле pg_hba.conf добавьте slave_ip

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

host replication postgres 192.168.56.110/32 trust

Теперь нужно сделать копию данных с мастера и отправить на слейв

Если вы вышли из пользователя postgres - залогиньтесь снова

su - postgres

Бэкап (я делаю с пустой базы, сразу после установки)

psql -c "SELECT pg_start_backup('replbackup');"

pg_start_backup ----------------- 0/2000020 (1 row)

tar cfP /tmp/db_file_backup.tar /var/lib/pgsql/data
psql -c "SELECT pg_stop_backup();"

Скорее всего появится ошибка

NOTICE: WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup pg_stop_backup ---------------- 0/20000E0 (1 row)

Так как скопирована будет вся директория, можно сказать, что мы пользуемся other means

Отправьте на слейв

scp /tmp/db_file_backup.tar andrei@192.168.56.110:/tmp/

Настройка slave

Настройка slave или, как сейчас стало модно писать, stand by сервера начинается также с определения директории с настройками.

su - postgres -c "psql -c 'SHOW data_directory;'"

Password: data_directory --------------------- /var/lib/pgsql/data (1 row)

Или

echo $PGDATA

/var/lib/pgsql/data

-bash-4.2$ su - postgres -c "psql -c 'SHOW config_file;'"

Password: config_file ------------------------------------- /var/lib/pgsql/data/postgresql.conf (1 row)

Залогиньтесь под обычным пользователем (не postgres)

Остановите сервис postgresql:

sudo systemctl stop postgresql

==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units === Authentication is required to manage system services or units. Multiple identities can be used for authentication: 1. andrei 2. tester Choose identity to authenticate as (1-2): 1 Password: ==== AUTHENTICATION COMPLETE ===

Залогиньетсь под postgres и на всякий случай, создайте архив базы:

sudo su - postgres
tar -czvf /tmp/data_pgsql.tar.gz /var/lib/pgsql/data

В данном примере мы сохраним всё содержимое каталога /var/lib/pgsql/data в виде архива /tmp/data_pgsql.tar.gz.

ls /tmp | grep pgsql

data_pgsql.tar.gz

Либо просто скопируете в другую папку

sudo su - postgres
bash-4.2$ mv /var/lib/pgsql/data/ /var/lib/pgsql/data.old

Удаляем содержимое каталога с данными:

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

 

Теперь нужно распаковать архив, который получен с мастера

tar xvfP /tmp/db_file_backup.tar

Удалите postmaster.pid чтобы слейв не видел pid мастера как свой

rm -f /var/lib/pgsql/data/postmaster.pid

В файле postgresql.conf

Укажите listen_addresses и включите hot_standby

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

# - Connection Settings - listen_addresses = 'localhost, 192.168.56.110' # what IP address(es) to listen on;

# - Standby Servers - # These settings are ignored on a master server. hot_standby = on # "on" allows queries during recovery # (change requires restart) hot_standby_feedback = on # send info from standby to prevent

recovery.conf

Теперь на слейве нужно отредактировать файл recovery.conf

Возможно обазец лежит в директории share тогда его можно скопировать оттуда

cp /usr/pgsql/share/recovery.conf.sample /var/lib/pgsql/data/recovery.conf

Если его нет - нужно создать его в той же диретории где лежит postgresql.conf

В данном примере это

/var/lib/pgsql/data

Создать файл можно командой

touch recovery.conf

Мой пример файла можно посмотреть здесь

Пример, который я брал за основу - на сайте pgpool

vi /var/lib/pgsql/data/recovery.conf

standby_mode = on primary_conninfo = 'host=192.168.56.110 port=5432'

Обновите разрешения доступа и запустите сервер

chown postgres.postgres /var/lib/pgsql/data/recovery.conf
systemctl start postgresql

PostgreSQL 9.6

Для 9.6 инструкция в разработке

Создайте пользователя repluser

Это нужно делать из-под пользователя postgres

su - postgres

Password:
Last login: Wed Jun 9 16:33:50 EEST 2021 on pts/1
-bash-4.2$

createuser --replication -P repluser

Enter password for new role:
Enter it again:

-bash-4.2$ exit

logout

Если у вас PostgreSQL версии 9.6

# - Connection Settings - listen_addresses = 'localhost, 192.168.56.109' # what IP address(es) to listen on;

wal_level = replica

max_wal_senders = 1 # max number of walsender processes

hot_standby = on # "on" allows queries during recovery

hot_standby_feedback = on # send info from standby to prevent

Теперь нужно скопировать содержимое аналогичной директории с сервера

В PostgreSQL 9.6 можно добавить опцию --write-recovery-conf

pg_basebackup -h 192.168.56.109 -U repluser -D /var/lib/pgsql/data --xlog-method=stream --write-recovery-conf

Теперь нужно скопировать содержимое аналогичной директории с сервера

pg_basebackup -h 192.168.56.109 -U repluser -D /var/lib/pgsql/data --xlog-method=stream

Password:

ls /var/lib/pgsql/data

backup_label global pg_hba.conf pg_log pg_notify pg_snapshots pg_subtrans pg_twophase pg_xlog base pg_clog pg_ident.conf pg_multixact pg_serial pg_stat_tmp pg_tblspc PG_VERSION postgresql.conf

В файле postgresql.conf замените master_ip на slave_ip

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

Проверка репликации не отличается для 9.2 и 9.6

На слейве зайдите как postgres и выполните psql

su postgres
psql

Изучите список существующих баз данных

\l

List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (3 rows)

Теперь на мастере создайте новую базу данных

postgres=# CREATE DATABASE "repltest" WITH OWNER "postgres" ENCODING 'UTF8';

Подождите немного и проверьте появилась ли новая база данных на слейве

\l

List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | repltest | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows)

Похожие статьи
PostgreSQL
Основы
Установка
postgresql.conf: Конфигурационный файл
Таблицы
Пользователи
SELECT
WHERE
bash скрипты для Postgres
Репликация master slave
Write Ahead Log
recovery.conf
pg_hba.conf
Help
Ошибки
EnterpriseDB

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: