PostgreSQL или Postgres — это объектно-реляционная система управления базами данных с открытым исходным кодом, которая активно разрабатывается уже более чем 15 лет. Сервер баз данных может использоваться для работы высоко нагруженных систем и решения сложных промышленных задач. PostgreSQL может использоваться в Linux, Unix, BSD и Windows.
Репликация баз данных методом Master-Salve — это процесс копирования (синхронизации) данных из базы данных на одном сервере (Master), в базу данных на другом сервере (Salve). В этой статье мы рассмотрим как настраивается репликация PostgreSQL в Ubuntu.
Содержание статьи
- ПРЕИМУЩЕСТВА РЕПЛИКАЦИИ
- УСТАНОВКА И НАСТРОЙКА POSTGRESQL
- НАСТОЙКА РЕПЛИКАЦИИ POSTGRESQL
- ТЕСТИРОВАНИЕ РЕПЛИКАЦИИ
- ВЫВОДЫ
ПРЕИМУЩЕСТВА РЕПЛИКАЦИИ
Основное преимущество — распределение базы данных между несколькими машинами. Если с основным сервером что-то происходит и он перестает работать, то данные все еще доступны на резервном сервере и могут быть без труда получены или восстановлены. Работа проекта продолжится без каких-либо трудностей.
В 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
Включите режим архивирования и укажите команду для создания архива:
Теперь настроем куда именно будет выполняться синхронизация. В нашей инструкции мы будем использовать только два сервера — Master и Salve. Поэтому в строке max_wal_senders поставьте значение 2:
Установите имя нашего сервера синхронизации:
Теперь конфигурационный файл можно закрыть. Поскольку мы включили режим архивирования, нужно создать папку для архивов и отдать ее пользователю 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
После всех настроек нужно перезапустить службу:
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:
Это все, можете сохранить изменения и закрыть файл. Затем создайте файл /etc/postgresql/9.6/main/recovery.conf:
sudo vi /etc/postgresql/9.6/main/recovery.conf
Эти настройки нужны для восстановления базы данных в случае возникновения проблем. Осталось запустить службу 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 и вставьте в нее некоторые данные:
Затем перейдите на сервер Salve и проверьте действительно есть ли там эта табилца:
Дальше вы можете попытаться выполнить запись на сервере Salve:
Но получите ошибку, так как из этого сервера можно только читать данные.
ВЫВОДЫ
В этой статье мы рассмотрели как работает репликация PostgreSQL типа Master — Salve. Как видите, все это немного сложнее, чем репликация MySQL, но тоже можно быстро разобраться и настроить. Если у вас остались вопросы, спрашивайте в комментариях!
А что делать в случае если упадет мастер?
Реплику промоутить до мастера
А немного подробнее есть возможность вкратце объяснить?
Полезная статья очень!
Как настроить отложенную репликацию со сдвигом на 30 минут?
Все ответы на вопросы выше есть в курсе "Резервное копирование и репликация": https://postgrespro.ru/education/courses/DBA3
Все материалы курса абсолютно бесплатны (слайды презентации, код демонстраций, рекомендованные ответы на практические задания и видеозаписи лекций на ютубе).
В /etc/postgresql/9.6/main/recovery.conf можно дописать:
recovery_min_apply_delay = 30min
И будет отставание от мастера на 30 мин