Создание кластера Postgres на CentOS с помощью Patroni + Consul

Обновлено и опубликовано Опубликовано:

Используемые термины: PatroniConsul.

Кластер Postgresql, созданный штатными средствами не совсем удобен в эксплуатации — у него сложные механизмы отслеживания проблем с репликацией, нет возможности автоматического переключения с основной ноды на резервную и обратно, сложный процесс восстановления после падения. Приложение Patroni позволяет сделать процесс управления кластером Postgresql проще. Оно хранит данные кластера в базе типа key-value и ориентируется на работоспособность системы с помощью DCS (Distributed Control Service). В качестве таких систем для Patroni могут выступать:

В данной инструкции мы рассмотрим процесс установки и настройки Patroni с Consul на операционной системе CentOS. Также мы рассмотрим установку consul в режиме агента. Все необходимое программное обеспечение мы будем ставить из репозиториев.

Предполагается, что у нас уже есть кластер consul, а также серверы с установленным Postgresql (чистыми без полезных данных). Ссылки на необходимые материалы будут приведены в конце данной инструкции.

Предварительная настройка

Прежде чем перейти к настройке patroni и кластера, подготовим наши серверы баз данных.

Настройка брандмауэра

Нам нужно открыть следующие порты в брандмауэре:

  • 8300,8301,8302,8500 — для работы консул агента.
  • 5432 — порт postgresql.
  • 8008 — порт для 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;'"

В моем случае для обоих серверов путь был /var/lib/pgsql/11/data — сохраняем его.

Останавливаем сервис postgres и запрещаем его автозапуск:

systemctl disable postgresql-11 --now

* имя службы может зависеть от версии. Например, у меня 11-я.

Удаляем содержимое каталога с данными, путь до которого нам вернула команда SHOW data_directory:

rm -rf /var/lib/pgsql/11/data/*

Наша система готова к дальнейшей настройке.

Установка и регистрация агента Consul

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

Установим утилиту для работы с 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,
  "telemetry": {
    "disable_compat_1.9": 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,
  "telemetry": {
    "disable_compat_1.9": true
  },
  "enable_local_script_checks": true,
  "enable_script_checks": true,
  "leave_on_terminate": true
}

* обратите внимание, что наши конфигурации различаются только директивами node_name (имя, под которым нода зарегистрируется в консуле) и bind_addr (на каком адресе должен слушать агент).

** также для нас имеют значение следующие настройки:

  • datacenter — датацентр, к которому будет присоединяться участник кластера. dc1 — датацентр по умолчанию.
  • retry_join — список серверов консула, к которым должен присоединиться агент.
  • encrypt — ключ, который был сформирован для серверов консул и используется в качестве значения параметра encrypt (его можно посмотреть в конфигурационном файле на сервере consul).

Подробнее о регистрации агента в консуле читайте в инструкции Установка агента 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.

Установка и настройка 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 — имя узла, на котором настраивается данный конфиг.
  • scope — имя кластера. Его мы будем использовать при обращении к ресурсу, а также под этим именем будет зарегистрирован сервис в consul.
  • consul - token — если наш кластер consul использует ACL, необходимо указать токен.
  • restapi - connect_address — адрес на настраиваемом сервере, на который будут приходить подключения к patroni. 
  • restapi - auth — логин и пароль для аутентификации на интерфейсе API.
  • pg_hba — блок конфигурации pg_hba для разрешения подключения к СУБД и ее базам. Необходимо обратить внимание на подсеть для строки host replication replicator. Она должна соответствовать той, которая используется в вашей инфраструктуре.
  • postgresql - pgpass — путь до файла, который создаст патрони. В нем будет храниться пароль для подключения к postgresql.
  • postgresql - connect_address — адрес и порт, которые будут использоваться для подключения к СУДБ.
  • postgresql - data_dir — путь до файлов с данными базы.
  • postgresql - bin_dir — путь до бинарников postgresql.
  • pg_rewind, replication, superuser — логины и пароли, которые будут созданы для базы.

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

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 на сервере 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

Читайте также

Другие инструкции, имеющие отношение к кластеризации Postgres:

1. Установка и запуск PostgreSQL на CentOS.

2. Установка и настройка кластера Consul Hashicorp на CentOS.

3. Настройка потоковой репликации PostgreSQL.

4. Мониторинг репликации PostgreSQL в Zabbix.

# Серверы # CentOS # Базы данных
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет