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

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

Команда Timeweb Cloud
Команда Timeweb Cloud
Наши инженеры, технические писатели, редакторы и маркетологи
21 декабря 2021 г.
1839
8 минут чтения
Средний рейтинг статьи: 5

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

Как Настроить Физическую Потоковую Репликацию С Postgre SQL На Ubuntu

PostgreSQL – это популярная реляционная база данных, которая поддерживает и логическую, и физическую репликацию. Логическая репликация направляет высокоуровневые изменения из первичного кластера баз данных к копиям баз. С помощью логической репликации можно направить изменения только на одну базу данных или таблицу в ней. Однако при физической репликации изменения в файле WAL (упреждающей журнализации) направляются и копируются в копиях кластеров. В результате копируются не отдельные области первичного кластера баз данных, а все изменения в нем. 

Эта инструкция поможет вам настроить физическую потоковую репликацию с PostgreSQL на Ubuntu 20.04 на двух отдельных устройствах, где функционируют отдельные кластеры PostgreSQL 12. На одном устройстве будет первичный кластер, а на втором – копия. 

Что понадобится

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

  • Два отдельных устройства на 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, используя следующую команду: 

sudo -u postgres psql

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

CREATE ROLE test WITH REPLICATION PASSWORD 'testpassword' LOGIN;

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

Output
CREATE ROLE

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

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

\q

Теперь, когда вы вернулись в командную строку терминала, откройте файл конфигурации /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 также можно найти, запустив следующую команду в базе данных реплики:

SHOW data_directory;

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

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

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

-u postgres psql

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

SELECT client_addr, state FROM pg_stat_replication;

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

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

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

Заключение

Теперь у вас есть два сервера Ubuntu 20.04 с кластером базы данных PostgreSQL 12, а между серверами настроена потоковая передача. Любые изменения, внесенные в кластер первичной базы данных, отобразятся в копии кластера. 

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

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

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону