Материал подготовлен командой 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.