Используемые термины: Patroni , Consul .
Кластер Postgresql, созданный штатными средствами не совсем удобен в эксплуатации — у него сложные механизмы отслеживания проблем с репликацией, нет возможности автоматического переключения с основной ноды на резервную и обратно, сложный процесс восстановления после падения. Приложение Patroni позволяет сделать процесс управления кластером PostgreSQL проще. Оно хранит данные кластера в базе типа key-value и ориентируется на работоспособность системы с помощью DCS (Distributed Control Service). В качестве таких систем для Patroni могут выступать:
В данной инструкции мы рассмотрим процесс установки и настройки Patroni с Consul на операционной системе CentOS. Также мы рассмотрим установку consul в режиме агента. Все необходимое программное обеспечение мы будем ставить из репозиториев.
Предполагается, что у нас уже есть кластер consul, а также серверы с установленным PostgreSQL (чистыми без полезных данных). Ссылки на необходимые материалы будут приведены в конце данной инструкции . В целом, инструкция также подойдет для Postgres Pro.
Подготовка системы
Регистрация агента consul
Установка и настройка Patroni
Политика для ACL на consul
Решение возможных проблем
Дополнительная информация
Прежде чем перейти к настройке patroni и кластера, подготовим наши серверы баз данных.
Нам нужно открыть следующие порты в брандмауэре:
Вводим команды:
firewall-cmd —permanent —add-port={8300,8500}/tcp
firewall-cmd —permanent —add-port={8301,8302}/{udp,tcp}
firewall-cmd —permanent —add-port=5432/tcp
firewall-cmd —permanent —add-port=8008/tcp
Для сохранения правил вводим:
firewall-cmd —reload
Patroni самостоятельно инициализирует базу и настройки, поэтому наш каталог с данными Postgresql должен быть чист, а сервис postgresql находиться в выключенном состоянии.
Если на вашем сервере баз данных есть ценная информация, действия ниже приведут к ее потере. В этом случае стоит развернуть кластер на других серверах и перенести данные.
На наших серверах СУБД смотрим путь до каталога с данными:
su — postgres -c «psql -c ‘SHOW data_directory;'»
Если мы получим ошибку:
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket «/var/run/postgresql/.s.PGSQL.5432»?… значит, наш сервер уже находится в выключенном состоянии.
Посмотреть каталог с данными можно из профиля postgresql:
su — postgres
echo ${PGDATA}
exit
В моем случае для обоих серверов путь был /var/lib/pgsql/11/data — сохраняем его.
Останавливаем сервис postgres и запрещаем его автозапуск:
systemctl disable postgresql-11 —now
* имя службы может зависеть от версии. Например, у меня 11-я.
Удаляем содержимое каталога с данными, путь до которого нам вернула команда SHOW data_directory:
rm -rf /var/lib/pgsql/11/data/*
* где /var/lib/pgsql/11/data — путь, который мы получили командой SHOW data_directory .
Наша система готова к дальнейшей настройке.
Как говорилось выше, мы будем использовать репозиторий для установки нужных нам пакетов. Данные действия выполняем на всех серверах нашего кластера.
Установим утилиту для работы с yum репозиториями:
yum install yum-utils
Добавляем репозиторий hashicorp:
yum-config-manager —add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
Устанавливаем консул:
yum install consul
Создаем конфигурационный файл. Для каждого сервера кластера будет свой конфигурационный файл.
а) на первом сервере:
vi /etc/consul.d/config.json
{
«server»: false,
«datacenter»: «dc1»,
«node_name»: «postgresql1»,
«data_dir»: «/var/lib/consul»,
«bind_addr»: «192.168.1.10»,
«client_addr»: «127.0.0.1»,
«retry_join»: [«consul01», «consul02», «consul03»],
«encrypt»: «BE2FFVPwyxGhF/tnlfO4dckMoDoU1UOW/AdJ/7QkTNI=»,
«log_level»: «warn»,
«enable_syslog»: true,
«enable_local_script_checks»: true,
«enable_script_checks»: true,
«leave_on_terminate»: true
}
б) на втором сервере:
vi /etc/consul.d/config.json
{
«server»: false,
«datacenter»: «dc1»,
«node_name»: «postgresql2»,
«data_dir»: «/var/lib/consul»,
«bind_addr»: «192.168.1.20»,
«client_addr»: «127.0.0.1»,
«retry_join»: [«consul01», «consul02», «consul03»],
«encrypt»: «BE2FFVPwyxGhF/tnlfO4dckMoDoU1UOW/AdJ/7QkTNI=»,
«log_level»: «warn»,
«enable_syslog»: true,
«enable_local_script_checks»: true,
«enable_script_checks»: true,
«leave_on_terminate»: true
}
* обратите внимание, что наши конфигурации различаются только директивами node_name (имя, под которым нода зарегистрируется в консуле) и bind_addr (на каком адресе должен слушать агент). Предполагается, что наши серверы работают на адресах 192.168.1.10 и 192.168.1.20 .
** также для нас имеют значение следующие настройки:
Подробнее о регистрации агента в консуле читайте в инструкции Установка агента Consul и примеры регистрации сервисов .
Если наш сервер consul настроен на разграничение прав с помощью ACL, необходимо также добавить опцию acl:
…
«acl»: {
«enabled»: true,
«tokens»: {
«default»: «6e57aef4-95e5-47cb-944f-8efa04d6d2fa»
}
}
…* где значение default — токен для acl с правами регистрации в качестве агента.
Настройка консула закончена. Можно его запускать.
Для разрешения автозапуска и старта сервиса выполним команду на всех серверах кластера PostgreSQL:
systemctl enable consul —now
Проверяем, что наши серверы стали частью кластера:
consul members
Среди всего списка мы должны увидеть:
postgresql1 192.168.1.10:8301 alive client …
postgresql2 192.168.1.20:8301 alive client …
* где postgresql1 и postgresql2 — имена нод, под которыми мы их зарегистрировали.
Мы готовы переходить к настройке и настройке patroni.
Нужный нам пакет для установки есть в репозитории PostgreSQL. Скорее всего, он есть в нашей системе, так как мы устанавливали последний, но мы все-равно, приведем пример команды для настройки postgres repo:
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-`rpm -E %{rhel}`-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Если мы увидим ошибку:
…
Error: Nothing to do
… то значит репозиторий уже настроен. Идем дальше.
Теперь ставим сам patroni:
yum install patroni-consul
* обратите внимание, что мы ставим пакет patroni-consul (патрони, заточенный для консула).
Установка завершена. Переходим к настройке.
Создадим каталог для хранения конфигурации:
mkdir /etc/patroni
И сам конфигурационный файл:
vi /etc/patroni/patroni.yml
name: postgresql1
scope: pgdb
watchdog:
mode: off
consul:
host: «localhost:8500»
register_service: true
#token: <consul-acl-token>
restapi:
listen: 0.0.0.0:8008
connect_address: » 192.168.1.10:8008 »
auth: ‘patrest:password’
bootstrap:
dcs:
ttl: 30
loop_wait: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
archive_mode: «on»
wal_level: hot_standby
max_wal_senders: 10
wal_keep_segments: 8
archive_timeout: 1800s
max_replication_slots: 5
hot_standby: «on»
wal_log_hints: «on»
initdb:
— encoding: UTF8
— data-checksums
pg_hba:
— local all postgres peer
— host replication replicator 192.168.1.0/24 md5
— host replication replicator 127.0.0.1/32 trust
— host all all 0.0.0.0/0 md5
postgresql:
pgpass: /var/lib/pgsql/11/.pgpass
listen: 0.0.0.0:5432
connect_address: » 192.168.1.10:5432 »
data_dir: /var/lib/pgsql/11/data/
bin_dir: /usr/pgsql-11/bin/
pg_rewind:
username: postgres
password: password
pg_hba:
— local all postgres peer
— host replication replicator 192.168.1.0/24 md5
— host replication replicator 127.0.0.1/32 trust
— host all all 0.0.0.0/0 md5
replication:
username: replicator
password: password
superuser:
username: postgres
password: password
* особое внимание стоит уделить данным, которые отмечены желтым.
** данные конфигурационные файлы на разных серверах будут немного различаться. Опишем подробнее опции наиболее критичные для работы кластера:
На втором сервере будет такой же конфигурационный файл, за исключением следующих опций:
name: postgresql2
…
connect_address: «192.168.1.20:8008»
…
connect_address: «192.168.1.20:5432»
…
Разрешаем автозапуск и стартуем сервис patroni:
systemctl enable patroni —now
Проверяем статусы сервиса на обоих серверах:
systemctl status patroni
Посмотреть список нод
patronictl -c /etc/patroni/patroni.yml list
Мы должны увидеть что-то на подобие:
+ Cluster: pgdb (7126124696482454785) -+———+—-+————+
+————-+—————+———+———+—-+————+
| Member | Host | Role | State | TL | Lag in MB |
| postgresql1 | 192.168.1.10 | Leader | running | 1 | |
| postgresql2 | 192.168.1.20 | Replica | running | 1 | 0 |
+————-+—————+———+———+—-+————+
Можно проверить, что сервер консул разрешает имена кластера:
nslookup -port=8600 master.pgdb.service.consul 127.0.0.1
nslookup -port=8600 replica.pgdb.service.consul 127.0.0.1
* где consul — настроенный в consul домен.
Команды нам должны вернуть адреса соответствующих серверов — лидера и реплики.
Наш кластер в рабочем состоянии.
Как было сказано выше, если сервер консула использует проверку доступа на основе ACL, необходимо прописать token. Рассмотрим процесс подробнее.
Сначала на сервере консул создаем файл для политики:
cd /var/lib/consul
vi patroni-policy.json
service_prefix «» {
policy = «write»
}
session_prefix «» {
policy = «write»
}
key_prefix «» {
policy = «write»
}
node_prefix «» {
policy = «read»
}
agent_prefix «» {
policy = «read»
}
Для ее применения вводим команду:
consul acl policy create -name «patroni-policy» -rules @patroni-policy.json
Теперь создаем токен с привязкой к созданной политике:
consul acl token create -description «Token for Patroni» -policy-name patroni-policy
Мы должны увидеть что-то на подобие:
…
SecretID: 5adb466f-b6ee-9048-6458-e8edbffc42a3
…
Это и есть токен, который нужно прописать в конфигурационном файле patroni:
vi /etc/patroni/patroni.yml
…
consul:
…
token: 5adb466f-b6ee-9048-6458-e8edbffc42a3
После чего сервис нужно перезапустить:
systemctl restart patroni
Увидеть подробный лог работы patroni можно с помощью команды:
journalctl -u patroni -e
Рассмотрим некоторые проблемы, с которыми удалось столкнуться мне.
Команда:
patronictl -c /etc/patroni/patroni.yml list
… показывает, что все участники кластера работают в режиме Replica, а лидера нет. В логах мы видим строку:
… waiting for leader to bootstrap
Причина: patroni не может инициализировать кластер и выбрать лидера. Как правило, из-за уже наличия соответствующей настройки в consul, например, если мы ранее уже запускали кластер patroni с таким же названием.
Решение: проблему можно решить двумя способамы. Решение зависит от ситуации.
а) Если в сети работает кластер patroni с таким же именем, то мы должны задать новое имя в файле:
vi /etc/patroni/patroni.yml
…
scope: pgdb
…
После перезапускаем patroni:
systemctl restart patroni
б) Если имя нашего кластера совпало с ранее использовавшемся кластером, то такую запись можно смело удалить из consul. Это можно сделать в веб-интерфейсе, разделе Key / Values — Service или из командной строки на сервере консула:
consul kv delete -recurse service/pgdb
При запуске службы на вторичном сервере (slave) не выполняется репликация и мы можем увидеть в логе сообщение:
pg_basebackup: error: FATAL: password authentication failed for user «replicator»
Причина: не создана учетная запись replicator на сервере postgresql.
Решение: переходим на master сервер. Заходим под пользователем postgres:
su — postgres
Создаем учетную запись для репликации:
createuser —replication -P replicator
Система потребует ввести пароль, который будет использоваться для учетной записи. В нашем примере в конфигурационном файле мы используем password , поэтому нужно ввести именно его.
Другие инструкции, имеющие отношение к кластеризации Postgres:
1. Установка и запуск PostgreSQL на CentOS .
2. Установка и настройка кластера Consul Hashicorp на CentOS .
3. Настройка потоковой репликации PostgreSQL .
Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…
Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…
Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…
Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…
YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…
Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…