PostgreSQL
При установке Визион.Сервер СУБД PostgreSQL развёртывается на одном узле. Такая конфигурация не требует дополнительных настроек, но не обеспечивает отказоустойчивости. При выходе узла из строя работа СУБД будет нарушена.
В производственных средах рекомендуется развернуть и использовать отказоустойчивый кластер PostgreSQL из трёх узлов.
|
Визион может использовать для хранения служебной БД внешний сервер PostgreSQL. Подробнее в инструкции Смена сервера PostgreSQL |
Развёртывание кластера выполняется с помощью плейбука Ansible. Далее узел, на котором запускается плейбук, называется управляющим (control node).
Доступ к мастеру кластера выполняется через виртуальный IP-адрес (Virtual IP Address, VIP). Для автоматического переназначения VIP на узлах кластера развёртываются службы vip-manager и etcd.
Для отслеживания состояния узлов кластера и автоматического выбора нового мастера используется Patroni.
| В Patroni мастер PostgreSQL называется лидером. |
Системные требования
Отказоустойчивая конфигурация предъявляет свои требования к узлам кластера PostgreSQL в дополнение к основным:
-
ОС ALT Linux c10f1 или ALT Linux c10f2.
-
Подключены актуальные репозитории пакетов.
-
Настроена синхронизация времени.
-
Настроен доступ по SSH.
К управляющему узлу предъявляются те же требования, что и к узлам кластера, однако, работать он должен под управлением ОС ALT Linux c10f2.
Кроме этого, для корректной работы кластера необходимо обеспечить сетевую связность узлов и служб.
etcd
Все соединения etcd используют TLS/HTTPS с взаимной аутентификацией по сертификатам.
| Локальный адрес | Порт | Протокол | Описание | Клиенты сервиса |
|---|---|---|---|---|
127.0.0.1 |
2379 |
TCP/HTTPS |
Клиентский API etcd (локальный). Используется для локальных подключений и мониторинга |
Patroni (локальные подключения) |
vip-manager (локальные подключения) |
||||
IP-адрес узла |
2379 |
TCP/HTTPS |
Клиентский API etcd (внешний). Используется для подключений от других узлов кластера |
Patroni (с других узлов) |
vip-manager (с других узлов) |
||||
etcdctl (с других узлов) |
||||
127.0.0.1 |
2380 |
TCP/HTTPS |
Peer API etcd (локальный). Используется для коммуникации между узлами кластера etcd |
Другие узлы etcd (локальные подключения) |
IP-адрес узла |
2380 |
TCP/HTTPS |
Peer API etcd (внешний). Используется для коммуникации между узлами кластера etcd |
Другие узлы кластера etcd для репликации и выборов лидера |
Patroni
REST API Patroni использует HTTPS с опциональной проверкой клиентских сертификатов.
| Локальный адрес | Порт | Протокол | Описание | Клиенты сервиса |
|---|---|---|---|---|
0.0.0.0 |
8008 |
TCP/HTTPS |
REST API Patroni. Используется для управления кластером PostgreSQL, мониторинга состояния, получения информации о лидере |
Patroni |
Системы мониторинга |
PostgreSQL
PostgreSQL использует протокол TCP с аутентификацией через SCRAM-SHA-256.
Параметры аутентификации задаются в конфигурационном файле pg_hba.conf.
| Локальный адрес | Порт | Протокол | Описание | Клиенты сервиса |
|---|---|---|---|---|
0.0.0.0 |
5432 |
TCP |
Сервер PostgreSQL. Основной сервис СУБД, управляемый через Patroni |
Приложения, использующие базу данных |
Репликация между узлами (пользователь |
Подготовка управляющего узла
Подготовьте управляющий узел к работе:
-
Распакуйте архив с плейбуками в произвольную директорию.
-
Создайте пару ключей SSH.
-
Разместите публичный ключ SSH на узлах кластера, например, с помощью команды:
ssh-copy-id -i /path/to/key.pub <user>@<host>
Подготовка узлов кластера
Чтобы подготовить узлы кластера:
-
Убедитесь, что время на всех трёх узлах синхронизировано.
-
Измените настройки сервера OpenSSH таким образом, чтобы он разрешал вход в систему с использованием ключей.
-
Убедитесь, что настройки
sudoразрешают группеwheelвыполнение любых команд.Как правило, достаточно выполнить команду
visudoи в конце файла раскомментировать строку:WHEEL_USERS ALL=(ALL:ALL) ALL -
Убедитесь, что пользователь
rootсостоит в группеwheel. -
Убедитесь, что необходимые репозитории подключены и актуальны.
Установка
После подготовительных работ переходите к установке:
-
Перейдите в директорию с плейбуком
cluster.ymlи инвентарёмinventory.yml. -
Внесите изменения в конфигурационный файл
inventory.yml:-
Укажите параметры подключения к узлам кластера, в том числе путь к приватному ключу SSH.
Используйте адреса сети, по которой узлы кластера будут взаимодействовать друг с другом.
-
Укажите VIP, который будет назначаться мастеру PostgreSQL.
-
Если узлы кластера работают под управлением ОС ALT Linux c10f1, добавьте в блок
varsдополнительную переменнуюpackages_to_install:--- # ... vars: # ... packages_to_install: - postgresql15-server - postgresql15-contrib - etcd - patroni - python3-module-psycopg2 -
В значении переменной
service_usersукажите учётные данные администратора СУБД:--- # ... vars: # ... service_users: - name: <admin> password: <password> flags: SUPERUSER
-
-
Активируйте виртуальное окружение Python:
source /opt/skala-r/vision/server/vision_venv/bin/activate -
Запустите развёртывание:
ansible-playbook -i inventory.yml cluster.yml
Проверка корректности
Для проверки корректности развёртывания кластера выполните следующие действия:
-
На любом узле кластера выполните команду:
patronictl -c /etc/patroni/config.yml topologyОжидаемый результат выполнения команды:
-
Один узел находится в статусе Leader.
-
Остальные узлы находятся в статусе Replica.
-
-
На лидере выполните команду:
ip -br aОжидаемый результат выполнения команды: VIP привязан к одному из сетевых интерфейсов.
-
Убедитесь в возможности подключения к кластеру с не входящих в него узлов:
psql -h <vip> -U <admin> -p 5432 -d postgresЗдесь:
-
<vip>— VIP лидера. -
<admin>— название учётной записи администратора СУБД.
Подключение должно быть успешным.
-
-
Выполните дополнительные проверки:
-
Убедитесь, что на лидере запрос возвращает значение
f:SELECT pg_is_in_recovery(); -
Получите список БД:
\l+ -
Убедитесь, что на лидере выводится информация о репликах:
SELECT * FROM pg_stat_replication \gx -
Проверьте значение настройки
archive_mode. По умолчанию её значение равноoff.SHOW archive_mode
-