Потоковую репликацию часто используют для горизонтального масштабирования реляционных баз данных. В данном методе задействованы одна или две копии одного и того же кластера баз данных, функционирующие на разных устройствах. Один кластер баз данных называется первичным и используется как для операций чтения, так и для записи, а остальные называются копиями – они выполняют только операции чтения. Потоковую репликацию также можно применять для предоставления высокой степени доступности системы. Если первичный кластер баз данных или сервер внезапно перестанет работать, копии продолжат обслуживать операции чтения или же одна из них станет новым первичным кластером.
PostgreSQL — это популярная реляционная база данных, которая поддерживает и логическую, и физическую репликацию. Логическая репликация направляет высокоуровневые изменения из первичного кластера баз данных к копиям баз. С помощью логической репликации можно направить изменения только на одну базу данных или таблицу в ней. Однако при физической репликации изменения в файле WAL (упреждающей журнализации) направляются и копируются в копиях кластеров. В результате копируются не отдельные области первичного кластера баз данных, а все изменения в нем.
Эта инструкция поможет вам настроить физическую потоковую репликацию с PostgreSQL на Ubuntu 20.04 на двух отдельных устройствах, где функционируют отдельные кластеры PostgreSQL 12. На одном устройстве будет первичный кластер, а на втором – копия.
Для прохождения урока вам понадобится следующее:
На первом этапе вы должны настроить первичную базу данных так, чтобы она позволяла реплике (или репликам) к ней подключаться. По умолчанию 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-адресе. Далее нужно создать права с соответствующими разрешениями, которые будут использоваться копией при подключении к первичной базе данных.
cloud
Теперь в первичной базе данных необходимо создать права с разрешениями на репликацию базы данных. Ваша копия будет использовать эти права при подключении к первичной базе данных. Создание отдельных прав только для репликации также важно для безопасности. Копия не сможет производить никаких действий с данными на первичном устройстве, кроме копирования.
Для начала подключитесь к кластеру базы данных как пользователь postgres, используя следующую команду:
sudo -u postgres psql
Чтобы создать права, нужно запустить на кластере команду CREATE ROLE
следующим образом:
CREATE ROLE test WITH REPLICATION PASSWORD 'testpassword' LOGIN;
На выходе должно получиться следующее:
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
Если первичный кластер успешно перезапустился, значит, он правильно настроен и готов осуществлять потоковую передачу, как только подключится реплика. Далее переходим к настройке копии кластера.
Во время настройки физической репликации с 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
подключится к первичной базе данных, вам предложат ввести пароль для прав, созданных на предыдущем этапе. Время копирования всех файлов зависит от размера вашего первичного кластера базы данных.
Теперь у вашей реплики есть все файлы данных из первичного устройства, которые понадобятся для запуска репликации. Далее необходимо перевести реплику в резервный режим и приступить к репликации.
После того как на реплике будет успешно создана резервная копия файлов данных первичного кластера, необходимо перезапустить копию кластера базы данных и перевести ее в резервный режим. Для перезапуска реплики базы данных запустите следующую команду:
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
Если вы увидели похожий результат, значит, потоковая передача с первичного устройства на реплику настроена верно.
Выгодные тарифы на облако в Timeweb Cloud
Теперь у вас есть два сервера Ubuntu 20.04 с кластером базы данных PostgreSQL 12, а между серверами настроена потоковая передача. Любые изменения, внесенные в кластер первичной базы данных, отобразятся в копии кластера.
Вы можете добавить еще несколько копий, если вашим базам данных нужно справляться с большим объемом трафика.
Если вы хотите узнать больше о физической потоковой репликации, в том числе как настроить синхронную репликацию, чтобы не потерять особо важные данные, ознакомьтесь с официальным руководством по PostgreSQL.