PostgreSQL · 8 min read · Nov 30, 2025

Как настроить репликацию Master-Slave для PostgreSQL 9.6 на Ubuntu 16.04

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

Репликация баз данных master/slave — это процесс копирования (синхронизации) данных из базы данных на одном сервере (мастере) в базу данных на другом сервере (слейве). Основное преимущество этого процесса заключается в распределении баз данных на несколько машин, чтобы, когда на основном сервере возникает проблема, была резервная машина с теми же данными, доступная для обработки запросов без перерыва.

PostgreSQL предоставляет несколько способов репликации базы данных. Он может использоваться для резервного копирования и для обеспечения высокой доступности сервера баз данных. В этом руководстве мы покажем вам, как установить и настроить репликацию Master-Slave PostgreSQL 9.6 на сервере Ubuntu 16.04. Мы будем использовать режим горячего резервирования, и это очень хорошая отправная точка для глубокого изучения PostgreSQL.

Что мы будем делать:

  1. Установить PostgreSQL 9.6.
  2. Настроить брандмауэр UFW.
  3. Настроить сервер MASTER.
  4. Настроить сервер SLAVE.
  5. Скопировать данные PostgreSQL с MASTER на SLAVE.
  6. Тестирование.

Предварительные требования:

  • 1 сервер Ubuntu 16.04 - MASTER - Разрешение на чтение и запись - IP: 10.0.15.10
  • 1 сервер Ubuntu 16.04 - SLAVE - Только чтение - IP: 10.0.15.11
  • Привилегии root

Шаг 1 - Установка PostgreSQL 9.6

В этом руководстве мы установим последнюю версию PostgreSQL 9.6. В официальном репозитории Ubuntu доступна только версия PostgreSQL 9.5, поэтому нам нужно установить последнюю версию напрямую из репозитория PostgreSQL.

Добавьте репозиторий postgreSQL 9.6 в директорию sources.list.d.

echo 'deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main' | tee /etc/apt/sources.list.d/postgresql.list

И импортируйте ключ подписи PostgreSQL в систему.

wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add -

Теперь обновите репозиторий системы с помощью команды apt.

apt-get update

Затем установите пакет PosgreSQL 9.6 с помощью команды apt ниже.

apt-get install -y postgresql-9.6 postgresql-contrib-9.6

Если установка завершена, добавьте его для автоматического запуска при загрузке.

systemctl enable postgresql

По умолчанию PostgreSQL работает на локальном IP-адресе (127.0.0.1) с портом 5432 на Ubuntu, проверьте это с помощью команды netstat.

netstat -plntu

Проверьте, работает ли postgres

PostgreSQL 9.6 работает в системе. На следующем шаге мы должны настроить пароль для пользователя postgres.

Из учетной записи root войдите в пользователя postgres с помощью команды su, затем получите доступ к терминалу psql.

su - postgres  
psql

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

\password postgres  
\conninfo

Изменить пароль postgres

PostgreSQL 9.6 был установлен в системе, работает без ошибок, и пароль для пользователя postgres был обновлен.

Шаг 2 - Настройка брандмауэра UFW

UFW или Uncomplicated Firewall — это приложение для управления брандмауэром на основе iptables в Ubuntu. UFW является инструментом настройки брандмауэра по умолчанию для Ubuntu Linux и предоставляет удобный способ настройки брандмауэра.

Мы можем установить ufw из основного репозитория Ubuntu с помощью команды apt.

apt-get install -y ufw

Добавьте новые службы в брандмауэр UFW: добавьте службы SSH и PostgreSQL с помощью команд ниже.

ufw allow ssh  
ufw allow postgresql

Включите брандмауэр UFW и проверьте статус.

ufw enable  
ufw status

Установите и проверьте брандмауэр UFW

Брандмауэр UFW был установлен, и служба PostgreSQL была добавлена.

ПРИМЕЧАНИЕ:

Выполните шаг 1 и шаг 2 на сервере MASTER и SLAVE.

Шаг 3 - Настройка сервера PostgreSQL MASTER

Сервер master имеет IP-адрес 10.0.15.10, и служба postgres будет работать под этим IP с портом по умолчанию. Сервер master будет иметь разрешение на ЧТЕНИЕ и ЗАПИСЬ в базу данных и выполнять потоковую репликацию на сервер slave.

Перейдите в директорию конфигурации postgres ‘/etc/postgresql/9.6/main‘ и отредактируйте файл postgresql.conf с помощью vim.

cd /etc/postgresql/9.6/main/  
vim postgresql.conf

Уберите комментарий с строки ‘listen_addresses’ и измените значение на IP-адрес сервера master ‘10.0.15.10‘.

listen_addresses = '10.0.15.10'

Уберите комментарий с строки ‘wal_level’ и измените значение на ‘hot_standby‘.

wal_level = hot_standby

Для уровня синхронизации мы будем использовать локальную синхронизацию. Уберите комментарий и измените значение строки следующим образом.

synchronous_commit = local

Включите режим архивирования и измените параметр archive_command на команду ‘cp %p /var/lib/postgresql/9.6/main/archive/%f’.

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

Для параметров ‘Replication’ в этом руководстве мы используем только 2 сервера, master и slave, уберите комментарий с строки ‘wal_sender‘ и измените значение на 2, а для значения ‘wal_keep_segments‘ установите 10.

max_wal_senders = 2  
wal_keep_segments = 10

Для имени приложения уберите комментарий с строки ‘synchronous_standby_names’ и измените значение на имя ‘pgslave001‘.

synchronous_standby_names = 'pgslave001'

Сохраните файл и выйдите из редактора.

В файле postgresql.conf режим архивирования включен, поэтому нам нужно создать новую директорию для архива. Создайте новую директорию архива, измените разрешение и измените владельца на пользователя postgres.

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

Затем отредактируйте файл pg_hba.conf для настройки аутентификации.

vim pg_hba.conf

Вставьте конфигурацию ниже в конец строки.

# Localhost  
host    replication     replica          127.0.0.1/32            md5  
   
# IP-адрес PostgreSQL Master  
host    replication     replica          10.0.15.10/32            md5  
   
# IP-адрес PostgreSQL SLave  
host    replication     replica          10.0.15.11/32            md5

Сохраните и выйдите, затем перезапустите PostgreSQL.

systemctl restart postgresql

PostgreSQL работает под IP-адресом 10.0.15.10, проверьте это с помощью команды netstat.

netstat -plntu

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

Затем создайте нового пользователя для репликации. Мы создадим нового пользователя с именем ‘replica‘ с паролем ‘aqwe123@‘. Пожалуйста, выберите надежный пароль для вашей настройки! Войдите в пользователя postgres и получите доступ к терминалу psql.

su - postgres  
psql

Создайте нового пользователя ‘replica‘ с паролем ‘aqwe123@‘ с помощью запроса postgres ниже.

CREATE USER replica REPLICATION LOGIN ENCRYPTED PASSWORD 'aqwe123@';

Теперь проверьте нового пользователя с помощью запроса ‘du‘ ниже, и вы увидите пользователя replica с правами на репликацию.

\du

Создать пользователя репликации postgres

Конфигурация сервера MASTER завершена.

Шаг 4 - Настройка сервера SLAVE

Сервер SLAVE имеет IP-адрес 10.0.15.11. И этот сервер будет иметь только разрешение на ЧТЕНИЕ к базе данных. Сервер баз данных Postgres будет работать под IP-адресом сервера, а не под локальным IP.

Остановите службу postgres на сервере slave с помощью команды systemctl ниже.

systemctl stop postgresql

Перейдите в директорию конфигурации Postgres ‘/etc/postgresql/9.6/main‘, затем отредактируйте файл конфигурации ‘postgresql.conf‘.

cd /etc/postgresql/9.6/main/  
vim postgresql.conf

Уберите комментарий с строки listen_addresses и замените значение на IP-адрес слейва 10.0.15.11.

listen_addresses = '10.0.15.11'

Уберите комментарий с строки ‘wal_level’ и измените значение на ‘hot_standby‘.

wal_level = hot_standby

Для уровня синхронизации уберите комментарий с строки synchronous_commit и измените значение, как показано ниже.

synchronous_commit = local

Для настройки репликации уберите комментарий с строки max_wal_senders и замените значение на ‘2‘, так как используется только 2 сервера. А для wal_keep_segments измените значение на ‘10‘.

max_wal_senders = 2  
wal_keep_segments = 10

Уберите комментарий с строки ‘synchronous_standby_names’ для имени приложения и измените значение на имя ‘pgslave001‘.

synchronous_standby_names = 'pgslave001'

Включите hot_standby для сервера слейва, убрав комментарий с следующей строки и изменив значение на ‘on‘.

hot_standby = on

Сохраните файл и выйдите из редактора.

Шаг 5 - Копирование данных PostgreSQL с MASTER на SLAVE

Далее мы хотим заменить основную директорию postgres на сервере ‘SLAVE‘ на основную директорию данных с сервера ‘MASTER‘.

Войдите на сервер SLAVE и получите доступ к пользователю postgres.

su - postgres

Перейдите в директорию данных postgres ‘main‘ и создайте резервную копию, переименовав директорию.

cd 9.6/  
mv main main-bekup

Создайте новую директорию ‘main‘ как пользователь ‘postgres‘ и убедитесь, что у нее такие же разрешения, как у директории main-bekup.

mkdir main/  
chmod 700 main/

Далее скопируйте основную директорию с сервера MASTER на сервер SLAVE с помощью команды pg_basebackup, мы будем использовать пользователя replica для выполнения этого копирования данных.

pg_basebackup -h 10.0.15.10 -U replica -D /var/lib/postgresql/9.6/main -P --xlog  
Пароль:

Когда передача данных завершится, перейдите в основную директорию данных и создайте новый файл recovery.conf.

cd /var/lib/postgresql/9.6/main/  
vim recovery.conf

Вставьте конфигурацию ниже:

standby_mode = 'on'  
primary_conninfo = 'host=10.0.15.10 port=5432 user=replica password=aqwe123@ application_name=pgslave001'  
restore_command = 'cp /var/lib/postgresql/9.6/main/archive/%f %p'  
trigger_file = '/tmp/postgresql.trigger.5432'

Сохраните и выйдите, затем измените разрешения файла на 600 с помощью chmod.

chmod 600 recovery.conf

настройка сервера слейва postgres

Теперь запустите PostgreSQL 9.6 на сервере SLAVE и убедитесь, что служба postgres работает на IP-адресе 10.0.15.11 с помощью netstat.

systemctl start postgresql  
netstat -plntu

Передача данных и конфигурация для сервера SLAVE завершены.

Шаг 6 - Тестирование

Для тестирования мы проверим статус репликации PostgreSQL 9.6 и попробуем создать новую таблицу на сервере MASTER, а затем проверить репликацию, проверив все данные с сервера SLAVE.

Войдите на сервер MASTER и войдите в пользователя postgres.

su - postgres

Запустите команды psql ниже, чтобы увидеть статус репликации.

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

Вы получите результаты, как показано ниже.

Проверить статус репликации postgres

Затем попробуйте создать новую таблицу на сервере MASTER. Войдите в пользователя postgres на сервере master.

su - postgres  
psql

И создайте новую таблицу с именем ‘replica_test‘ и вставьте данные в таблицу, выполнив запросы postgres ниже.

CREATE TABLE replica_test (hakase varchar(100));  
INSERT INTO replica_test VALUES ('howtoforge.com');  
INSERT INTO replica_test VALUES ('Это с Master');  
INSERT INTO replica_test VALUES ('pg репликация от hakase-labs');

Добавить некоторые тестовые данные

Затем войдите в пользователя postgres на сервере SLAVE и получите доступ к терминалу psql.

su - postgres  
psql

Проверьте данные в таблице ‘replica_test‘ с помощью запроса postgres ниже.

select * from replica_test;

И вы получите те же данные, что и на MASTER, они были реплицированы с сервера MASTER на сервер SLAVE.

Проверить репликацию данных

Дополнительное тестирование:

Попробуйте записать на сервере SLAVE с помощью запроса ниже.

INSERT INTO replica_test VALUES ('это SLAVE');

И вы получите сообщение об ошибке о ‘ Невозможно выполнить INSERT ‘ запрос на сервере SLAVE.

Установка и настройка PostgreSQL 9.6 с репликацией Master-Slave на Ubuntu 16.04 Xenial Xerus прошла успешно.

Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.