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.
Что мы будем делать:
- Установить PostgreSQL 9.6.
- Настроить брандмауэр UFW.
- Настроить сервер MASTER.
- Настроить сервер SLAVE.
- Скопировать данные PostgreSQL с MASTER на SLAVE.
- Тестирование.
Предварительные требования:
- 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
PostgreSQL 9.6 работает в системе. На следующем шаге мы должны настроить пароль для пользователя postgres.
Из учетной записи root войдите в пользователя postgres с помощью команды su, затем получите доступ к терминалу psql.
su - postgres
psqlПожалуйста, измените пароль для пользователя postgres и проверьте информацию о подключении с помощью запросов postgres ниже.
\password postgres
\conninfo
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 был установлен, и служба 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 postgresqlPostgreSQL работает под IP-адресом 10.0.15.10, проверьте это с помощью команды netstat.
netstat -plntu
Затем создайте нового пользователя для репликации. Мы создадим нового пользователя с именем ‘replica‘ с паролем ‘aqwe123@‘. Пожалуйста, выберите надежный пароль для вашей настройки! Войдите в пользователя postgres и получите доступ к терминалу psql.
su - postgres
psqlСоздайте нового пользователя ‘replica‘ с паролем ‘aqwe123@‘ с помощью запроса postgres ниже.
CREATE USER replica REPLICATION LOGIN ENCRYPTED PASSWORD 'aqwe123@';Теперь проверьте нового пользователя с помощью запроса ‘du‘ ниже, и вы увидите пользователя replica с правами на репликацию.
\du
Конфигурация сервера 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
Теперь запустите 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;"Вы получите результаты, как показано ниже.

Затем попробуйте создать новую таблицу на сервере 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 прошла успешно.
Ссылки
Get new posts in your inbox
No spam. Unsubscribe anytime.