Репликация PostgreSQL

PostgreSQL или Postgres — это объектно-реляционная система управления базами данных с открытым исходным кодом, которая активно разрабатывается уже более чем 15 лет. Сервер баз данных может использоваться для работы высоко нагруженных систем и решения сложных промышленных задач. PostgreSQL может использоваться в Linux, Unix, BSD и Windows.

Репликация баз данных методом Master-Salve — это процесс копирования (синхронизации) данных из базы данных на одном сервере (Master), в базу данных на другом сервере (Salve). В этой статье мы рассмотрим как настраивается репликация PostgreSQL в Ubuntu.

ПРЕИМУЩЕСТВА РЕПЛИКАЦИИ

Основное преимущество — распределение базы данных между несколькими машинами. Если с основным сервером что-то происходит и он перестает работать, то данные все еще доступны на резервном сервере и могут быть без труда получены или восстановлены. Работа проекта продолжится без каких-либо трудностей.

В PostgreSQL доступно несколько способов репликации базы данных в зависимости от цели репликации. Можно настраивать репликацию только для резервного копирования или для организации отказоустойчивого сервера баз данных. Мы будем использовать репликацию типа Master-Salve. Она более подходит для резервного копирования. Для реализации будет использоваться модуль standby.

УСТАНОВКА И НАСТРОЙКА POSTGRESQL

Мы уже подробно рассматривали как установить Postgresql в Ubuntu в одной из предыдущих статей. Но в этой статье повторим эти команды более кратко. Установить и выполнить первоначальную настройку сервера нужно на обоих машинах. Если вы используете последние версии Ubuntu — 17.04 или 17.10, то версия PostgreSQL 9.6 уже есть в официальных репозиториях. Для более старых систем можно использовать PPA:

sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main"
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
sudo apt install postgresql-9.6

В более новых версиях просто установите программу из репозиториев:

sudo apt install postgresql-9.6

Затем запустите службу и добавьте ее в автозагрузку:

systemctl start postgresql-9.6
systemctl enable postgresql-9.6

По умолчанию PostgreSQL запускается на порту 5432. Вы можете убедиться, что этот порт имеет состояние LISTEN выполнив команду netstat:

netstat -plntu

После того как Postgresql запущен, нам нужно настроить пароль для пользователя Postgres. Но для этого вам нужно авторизоваться под этим пользователем в системе:

sudo su - postgres

Затем, войдите в консоль управления:

psql

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

\password postgres

Осталось разрешить общение компьютеров между собой по сети на порту 5432 в брандмауэре:

sudo ufw allow postgresql/tcp
sudo ufw allow 5432/tcp
sudo ufw allow 5433/tcp

Напоминаю, что эти действия нужно проделать на обоих машинах.

НАСТОЙКА РЕПЛИКАЦИИ POSTGRESQL

Сначала настроем мастер-сервер. Это основной сервер, который будет выполнять основные действия записи и рассылать данные на сервера Salve. Приложения могут не только читать, но и записывать данные взаимодействуя с этим сервером. Для его настройки нам нужно изменить содержимое файла postgresql.conf в папке /etc/postgresql/9.6/main/:

Сначала расскоментируйте строчку listen_address и пропишите в ней ip адрес вашего сервера. Порт должен быть 5433 иначе не заработает:

listen_address = '192.168.56.101'
port=5433

Расскоментируйте строчку wal_level и установите значение standby, она отвечает за способ репликации:

wal_level = hot_standby

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

synchronous_commit = local

Включите режим архивирования и укажите команду для создания архива:

archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/9.6/archive/%f'

Теперь настроем куда именно будет выполняться синхронизация. В нашей инструкции мы будем использовать только два сервера — Master и Salve. Поэтому в строке max_wal_senders поставьте значение 2:

max_wal_senders = 2
wal_keep_segments = 10

Установите имя нашего сервера синхронизации:

synchronous_standby_names = 'pgslave01'

Теперь конфигурационный файл можно закрыть. Поскольку мы включили режим архивирования, нужно создать папку для архивов и отдать ее пользователю postgres:

mkdir -p /var/lib/postgresql/9.6/archive/
chmod 700 /var/lib/postgresql/9.6/archive/
chown -R postgres:postgres /var/lib/postgresql/9.6/archive/

Дальше нам нужно отредактировать файл pg_hba.conf, он отвечает за аутентификацию пользователей. Здесь нужно прописать каждый сервер, базу данных, адрес и метод аутентификации. Синтаксис файла такой:

host база_данных пользователь ip_адрес метод опции

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

# Localhost
host replication replica 127.0.0.1/32 md5
# PostgreSQL Master IP address
host replication replica 192.168.56.101/32 md5
# PostgreSQL SLave IP address
host replication replica 192.168.56.102/32 md5

После всех настроек нужно перезапустить службу:

systemctl restart postgresql-9.6

Дальше нам нужно создать нового пользователя, у которого будут права на репликацию. Назовите его replica:

su - postgres
createuser --replication -P replica

После всех этих действий настройка репликации postgresql на сервере Master завершена и он готов к работе. Дальше настроем сервер Salve. Тут все проще. Мы собираемся заменить директорию data этого сервера, на эту же директорию из сервера master и поддерживать их синхронизацию. Сначала остановите службу:

systemctl stop postgresql-9.6

Затем сделайте резервную копию текущей директории, если там есть важные данные и вы боитесь их потерять. Удалите текущую папку с данными:

sudo rm /var/lib/postgresql/9.6/main

Затем авторизуйтесь от имени пользователя postgres и скопируйте все данные из сервера Master:

su - postgres
pg_basebackup -h 192.168.56.101 -U replica -D /var/lib/postgresql/9.6/main -P --xlog -p 5433

Вам нужно будет ввести пароль и дождаться пока будут загружены данные. Дальше нужно исправить настройки /etc/postgresql/9.6/main/postgresql.conf:

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

Включите hot_standby:

hot_standby = on

И укажите ip адрес этого сервера в строке listen_address:

listen_addresses = '192.168.56.102'

Это все, можете сохранить изменения и закрыть файл. Затем создайте файл /etc/postgresql/9.6/main/recovery.conf:

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

standby_mode = 'on'
primary_conninfo = 'host=192.168.56.101 port=5432 user=replica password=password application_name=pgslave01'
trigger_file = '/tmp/postgresql.trigger.5433'

Эти настройки нужны для восстановления базы данных в случае возникновения проблем. Осталось запустить службу postgresql на другой машине:

systemctl start postgresql-9.6

Дальше осталось только протестировать как работает потоковая репликация postgresql.

ТЕСТИРОВАНИЕ РЕПЛИКАЦИИ

Чтобы посмотреть как работает репликация вы можете проверить состояния потока репликации, а также просто проверить передаются ли данные от Master на Salve. Сначала посмотрим параметры соединения:

su - postgres

psql -c "select application_name, state, sync_priority, sync_state from pg_stat_replication;"
psql -x -c "select * from pg_stat_replication;"

Затем авторизуйтесь на сервере Master и войдите в консоль управления:

sudo su postgres
psql

Создайте новую таблицу replica_test и вставьте в нее некоторые данные:

CREATE TABLE replica_test (test varchar(100));
INSERT INTO replica_test VALUES ('losst.ru');
INSERT INTO replica_test VALUES ('This is from Master');

Затем перейдите на сервер Salve и проверьте действительно есть ли там эта табилца:

su - postgres

select * from replica_test;

Дальше вы можете попытаться выполнить запись на сервере Salve:

INSERT INTO replica_test VALUES ('this is SLAVE');

Но получите ошибку, так как из этого сервера можно только читать данные.

ВЫВОДЫ

В этой статье мы рассмотрели как работает репликация PostgreSQL типа Master — Salve. Как видите, все это немного сложнее, чем репликация MySQL, но тоже можно быстро разобраться и настроить. Если у вас остались вопросы, спрашивайте в комментариях!

Один комментарий

  1. Keln Июль 16, 2018 Ответить

Ответить

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: