Как настроить физическую потоковую репликацию с PostgreSQL на Ubuntu

    Команда Simple-Server
    03.06.2026
    9 мин

    Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

    Кратко о задаче

    Для прохождения урока вам понадобится следующее:

    • Два отдельных устройства на Ubuntu 20.04; одно будет первичным, а второе – копией**.**
    • Файрволы необходимо настроить на разрешение HTTP/HTTPS и трафика на порт 5432 – в PostgreSQL 12 это порт по умолчанию.
    • PostgreSQL 12 должна функционировать на обоих серверах Ubuntu 20.04.

    Шаг 1 — Настройка первичной базы данных для принятия подключений

    На первом этапе вы должны настроить**** первичную базу данных так, чтобы она позволяла реплике****(или репликам) к ней подключаться. По умолчанию PostgreSQL воспринимает подключения только от localhost (127.0.0.1``). Чтобы это изменить, сначала нужно отредактировать параметр конфигурации listen_addresses в первичной базе данных.

    На первичном сервере откройте файл конфигурации PostgreSQL postgresql.conf, который находится в директории /etc/postgresql/12/main/:

    sudo nano /etc/postgresql/12/main/postgresql.conf

    Как только вы откроете файл, найдите переменную listen_addresses и измените ее значение с localhost на IP-адрес первичного сервера. Также понадобится удалить символ # из начала строки:

    /etc/postgresql/12/main/postgresql.conf ... listen_addresses = 'your_primary_IP_address' ...

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

    Теперь первичная база данных готова принимать подключения от других устройств на введенном вами IP-адресе. Далее нужно создать права с соответствующими разрешениями, которые будут использоваться копией при подключении к первичной базе данных.

    Шаг 2 – Создание специальных прав с разрешениями на репликацию

    Теперь в первичной базе данных необходимо создать права с разрешениями на репликацию базы данных. Ваша копия будет использовать эти права при подключении к первичной базе данных. Создание отдельных прав только для репликации также важно для безопасности. Копия не сможет производить никаких действий с данными на первичном устройстве, кроме копирования.

    Для начала подключитесь к кластеру базы данных как пользователь postgres, используя следующую команду:

    Чтобы создать права, нужно запустить на кластере команду CREATE ROLE следующим образом:

    CREATE ROLE test WITH REPLICATION PASSWORD 'testpassword' LOGIN;

    На выходе должно получиться следующее:

    Эта команда создает права под названием test с паролем testpassword, у которых есть разрешение на репликацию кластера базы данных.

    В PostgreSQL есть специальная репликационная псевдо-база данных, к которой подключается копия, но сначала необходимо отредактировать файл конфигурации /etc/postgresql/12/main/pg_hba.conf, чтобы реплика могла получить к нему доступ. Выйдите из командной строки PostgreSQL, запустив:

    Теперь, когда вы вернулись в командную строку терминала, откройте файл конфигурации /etc/postgresql/12/main/pg_hba.conf, используя nano:

    sudo nano /etc/postgresql/12/main/pg_hba.conf

    Добавьте следующую строку в конец файла pg_hba.conf:

    /etc/postgresql/12/main/pg_hba.conf ... host  replication   test  your-replica-IP/32  md5

    Первичное устройство позволит копии подключиться к репликационной псевдо-базе данных с использованием созданных вами прав __test . Значение host нужно для принятия нелокальных подключений через простые или зашифрованные с помощью SSL TCP/IP-сокеты. replication — это имя специальной псевдо-базы данных, которую PostgreSQL использует для репликации. И, наконец, значение md5 — это вид используемой аутентификации. Если вы хотите создать несколько копий, просто добавьте ту же самую строку в конце файла с IP-адресом другой реплики.

    Чтобы эти изменения оказались внесены в файл конфигурации, нужно перезапустить первичный кластер, используя:

    sudo systemctl restart postgresql@12-main

    Если первичный кластер успешно перезапустился, значит, он правильно настроен и готов осуществлять потоковую передачу, как только подключится реплика. Далее переходим к настройке копии кластера.

    Шаг 3 – Резервное копирование первичного кластера на реплику

    Во время настройки физической репликации с PostgreSQL вам необходимо произвести физическое резервное копирование массива данных первичного кластера в каталог данных реплики. Для этого сначала необходимо очистить каталог данных реплики от всех файлов. На Ubuntu каталог данных для PostgreSQL по умолчанию — это /var/lib/postgresql/12/main/.

    Каталог данных PostgreSQL также можно найти, запустив следующую команду в базе данных реплики:

    Как только вы обнаружите расположение каталога данных, запустите следующую команду, чтобы все стереть:

    sudo -u postgres rm -r /var/lib/postgresql/12/main/*

    Так как владельцем файлов в каталоге по умолчанию является пользователь****postgres, вам понадобится запустить команду как postgres, используя sudo -u postgres.

    Если файл в каталоге поврежден, а команда не работает (что случается крайне редко), удалите каталог main целиком и создайте его заново со следующими соответствующими разрешениями:

    sudo -u postgres rm -r /var/lib/postgresql/12/main sudo -u postgres mkdir /var/lib/postgresql/12/main sudo -u postgres chmod 700 /var/lib/postgresql/12/main

    Теперь, когда каталог данных реплики очищен, можно провести физическое резервное копирование файлов данных первичного устройства. Для упрощения процесса в PostgreSQL есть полезная утилита pg_basebackup. С ее помощью даже можно перевести сервер в резервный с помощью опции -R.

    Запустите на реплике команду pg_basebackup следующим образом:

    sudo -u postgres pg_basebackup -h primary-ip-addr -p 5432 -U test -D /var/lib/postgresql/12/main/ -Fp -Xs -R
    • Опция -h обозначает нелокальный хост. Здесь нужно ввести IP-адрес вашего сервера с первичным кластером.
    • Опция -p обозначает номер порта, к которому происходит подключение на первичном сервере. По умолчанию в PostgreSQL используется порт 5432.
    • Опция -U позволяет обозначить, в качестве какого пользователя вы подключаетесь к первичному кластеру. Это права, которые вы создали на предыдущем этапе.
    • Метка -D – это выходной каталог резервной копии. Это очищенный каталог данных вашей реплики.
    • -Fp обозначает данные для вывода в простом формате, а не в виде tar-файла.
    • -Xs передает потоком содержание файла WAL во время резервного копирования первичной**** базы данных.
    • Наконец, -R создает пустой файл с названием standby.signal в каталоге данных реплики. Благодаря этому файлу копия кластера понимает, что должна функционировать в качестве резервного сервера. Опция -R также добавляет информацию о подключении по первичному серверу в файл postgresql.auto.conf. Это специальный файл конфигурации, который прочитывается каждый раз, когда прочитывается обычный файл postgresql.conf, но значения в файле .auto`` замещают значения в обычном файле конфигурации.

    Когда команда pg_basebackup подключится к первичной базе данных, вам предложат ввести пароль для прав, созданных на предыдущем этапе. Время копирования всех файлов зависит от размера вашего первичного кластера базы данных.

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

    Шаг 4 – Перезапуск и тестирование кластеров

    После того как на реплике будет успешно создана резервная копия файлов данных первичного**** кластера, необходимо перезапустить копию кластера базы данных и перевести ее в резервный режим. Для перезапуска**** реплики базы данных запустите следующую команду:

    sudo systemctl restart postgresql@12-main

    Если копия кластера успешно перезапустилась в резервном режиме, она должна была уже подключиться к кластеру первичной базы данных на другом устройстве. Чтобы проверить, подключилась ли реплика к первичной базе данных и передается ли поток с первичного**** устройства, подключитесь к кластеру первичной базы данных, запустив:

    Теперь запросите таблицу pg_stat_replication на кластере первичной базы данных следующим образом:

    SELECT client_addr, state FROM pg_stat_replication;

    В результате запуска этого запроса на первичном кластере должно появиться что-то подобное:

    Output client_addr  | state ------------------+----------- your_replica_IP | streaming

    Если вы увидели похожий результат, значит, потоковая передача с первичного устройства на реплику настроена верно.


    Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны