ELMA365 On-Premises > Подготовка инфраструктуры > Базы данных > Отказоустойчивая инфраструктура / Кластер PostgreSQL

Кластер PostgreSQL

Для корректной работы системы требуется PostgreSQL версии 1115. В статье описана установка PostgreSQL 13 для ОС Ubuntu Linux 20.04 и 22.04. Также вы можете ознакомиться с руководством в официальной документации PostgreSQL.

Установка состоит из 10 этапов:

  1. Подготовка нод (серверов).
  2. Подготовка кластера etcd.
  3. Установка PostgreSQL.
  4. Настройка PostgreSQL.
  5. Установка Patroni.
  6. Настройка Patroni.
  7. Подготовка кластера PostgreSQL+Patroni.
  8. Подготовка PGBouncer (опционально).
  9. Конфигурация HAProxy (блок postgres).
  10. Подключение к PostgreSQL.

Шаг 1: Подготовка нод (серверов)

Создайте три ноды (сервера) с последовательно пронумерованными именами хостов.

начало внимание

Минимальное количество серверов для организации кластера три.

конец внимание

В этом примере используется три узла со следующими hostname и IP-адресами:

  • postgres-server1.your_domain, 192.168.1.1;
  • postgres-server2.your_domain, 192.168.1.2;
  • postgres-server3.your_domain, 192.168.1.3.

Создайте необходимые сопоставления имён хостов в DNS. Если такой возможности нет, внесите нужные записи в /etc/hosts.

Шаг 2: Подготовка кластера etcd

  1. Установите etcd на все узлы:

sudo apt-get install etcd -y

  1. Остановите etcd на всех узлах:

sudo systemctl stop etcd

  1. Удалите каталог данных:

sudo rm -rf /var/lib/etcd/*

  1. Переместите конфигурационный файл по умолчанию:

sudo mv /etc/default/etcd{,.original}

  1. Создайте и откройте для редактирования новый конфигурационный файл:

sudo nano /etc/default/etcd

  1. Добавьте пример конфигураций в файл для узла postgres-server1.your_domain:

ETCD_NAME="postgres-server1"
ETCD_DATA_DIR="/var/lib/etcd/default"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="5000"
ETCD_LISTEN_PEER_URLS="http://192.168.1.1:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.1:2379,http://localhost:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.1:2380"
ETCD_INITIAL_CLUSTER="postgres-server1=http://192.168.1.1:2380,postgres-server2=http://192.168.1.2:2380,postgres-server3=http://192.168.1.3:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.1:2379"
ETCD_ENABLE_V2="true"
ETCD_INITIAL_ELECTION_TICK_ADVANCE="false"

Пример конфигураций с включением TLS/SSL для узла postgres-server1.your_domain:

  1. Добавьте пример конфигураций в файл для узла postgres-server2.your_domain:

ETCD_NAME="postgres-server2"
ETCD_DATA_DIR="/var/lib/etcd/default"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="5000"
ETCD_LISTEN_PEER_URLS="http://192.168.1.2:12380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.2:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.2:12380"
ETCD_INITIAL_CLUSTER="postgres-server1=http://192.168.1.1:12380,postgres-server2=http://192.168.1.2:12380,postgres-server3=http://192.168.1.3:12380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.2:2379"
ETCD_ENABLE_V2="true"
ETCD_INITIAL_ELECTION_TICK_ADVANCE="false"

Пример конфигураций с включением TLS/SSL для узла postgres-server2.your_domain:

  1. Добавьте пример конфигураций в файл для узла postgres-server3.your_domain:

ETCD_NAME="postgres-server3"
ETCD_DATA_DIR="/var/lib/etcd/default"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="5000"
ETCD_LISTEN_PEER_URLS="http://192.168.1.3:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.3:2379,http://localhost:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.3:2380"
ETCD_INITIAL_CLUSTER="postgres-server1=http://192.168.1.1:2380,postgres-server2=http://192.168.1.2:2380,postgres-server3=http://192.168.1.3:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.3:2379"
ETCD_ENABLE_V2="true"
ETCD_INITIAL_ELECTION_TICK_ADVANCE="false"

Пример конфигураций с включением TLS/SSL для узла postgres-server3.your_domain:

Рассмотрим введённые параметры:

  • ETCD_NAME — имя этого узла кластера. Должно быть уникально в кластере;
  • ETCD_LISTEN_CLIENT_URLS — точка подключения для клиентов кластера;
  • ETCD_ADVERTISE_CLIENT_URLS — список URL-адресов, по которым его могут найти остальные узлы кластера;
  • ETCD_LISTEN_PEER_URLS — точка подключения для остальных узлов кластера;
  • ETCD_INITIAL_ADVERTISE_PEER_URLS — начальный список URL-адресов, по которым его могут найти остальные узлы кластера;
  • ETCD_INITIAL_CLUSTER_TOKEN — токен кластера, должен совпадать на всех узлах кластера;
  • ETCD_INITIAL_CLUSTER — список узлов кластера на момент запуска;
  • ETCD_INITIAL_CLUSTER_STATE — может принимать два значения: new и existing;
  • ETCD_DATA_DIR — расположение каталога данных кластера;
  • ETCD_ELECTION_TIMEOUT — время в миллисекундах, которое проходит между последним принятым оповещением от лидера кластера, до попытки захватить роль лидера на ведомом узле;
  • ETCD_HEARTBEAT_INTERVAL — время в миллисекундах, между рассылками лидером оповещений о том, что он всё ещё лидер.
  • ETCD_CERT_FILE — путь до файла сертификата сервера;
  • ETCD_KEY_FILE — путь до файла закрытого ключа;
  • ETCD_TRUSTED_CA_FILE — путь до файла корневого CA;
  • ETCD_CLIENT_CERT_AUTH — может принимать два значения: true и false;
  • ETCD_PEER_CERT_FILE — путь до файла сертификата сервера;
  • ETCD_PEER_KEY_FILE — путь до файла закрытого ключа;
  • ETCD_PEER_TRUSTED_CA_FILE — путь до файла корневого CA;
  • ETCD_PEER_CLIENT_CERT_AUTH — может принимать два значения: true и false;
  1. Перезапустите etcd на всех узлах:

sudo systemctl restart etcd

  1. Проверьте состояние кластера.

Для кластера без TLS:

sudo etcdctl cluster-health

Для кластера c TLS:

sudo etcdctl -C https://postgres-server1.your_domain:2379 --key-file /path/to/private.key --cert-file /path/to/public.crt --ca-file /path/to/certCA.pem cluster-health

Шаг 3: Установка PostgreSQL

начало внимание

С аппаратными требованиями, необходимыми для корректной работы ELMA365 на PostgreSQL, можно ознакомиться в статье «Системные требования ELMA365 On-Premises Enterprise».

конец внимание

  1. Для установки PostgreSQL добавьте официальный репозиторий postgresql:

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

  1. Обновите кэш пакетов, выполнив команду:

sudo apt update

  1. Установите PostgreSQL на все узлы:

sudo apt install postgresql-13 -y

Шаг 4: Настройка PostgreSQL

начало внимание

Для пароля разрешается применять следующие символы:

  • Заглавные латинские буквы: от A до Z;
  • Строчные латинские буквы: от a до z;
  • Цифры от 0 до 9;
  • Символы:  -_.

Зарезервированные (недопустимые) символы:

! * ' ( ) ; : @ & = + $ , / ? % # [ ]

конец внимание

Действия для узла postgres-server1.your_domain:

  1. Создайте новую роль elma365 с паролем SecretPassword:

sudo -u postgres psql -c \
"CREATE ROLE elma365 WITH login password 'SecretPassword';"

  1. Создайте базу данных elma365 с владельцем elma365:

sudo -u postgres psql -c \
"CREATE DATABASE elma365 WITH OWNER elma365;"

  1. Добавьте необходимые расширения для базы данных elma365:

sudo -u postgres psql -d elma365 -c \
"CREATE EXTENSION \"uuid-ossp\"; CREATE EXTENSION pg_trgm;"

  1. Создайте новую роль replicator с паролем ReplicatorPassword для работы с репликами. Должно совпадать с настройками Patroni из блока postgresql - authentication - replication и списком разрешённых хостов postgresql в файле pg_hba.conf:

sudo -u postgres psql -c \
"CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'ReplicatorPassword';"

  1. Установите пароль для пользователя postgres:

sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'PostgresPassword';"

  1. Остановите PostgreSQL:

systemctl stop postgresql

Действия для узла postgres-server2.your_domain и postgres-server3.your_domain:

  1. Остановите PostgreSQL:

systemctl stop postgresql

  1. Удалите каталог данных на нодах postgres-server2.your_domain и postgres-server3.your_domain:

rm -rf /var/lib/postgresql/13/main

Шаг 5: Установка Patroni

  1. Установите Patroni и PIP на все узлы:

sudo apt-get install python3-pip python3-dev libpq-dev -y
sudo apt-get install patroni -y

  1. Установите зависимости для работы Patroni на все узлы:

pip3 install psycopg2-binary
pip3 install wheel
pip3 install python-etcd

Шаг 6: Настройка Patroni

  1. Создайте файл настроек:

sudo nano /etc/patroni/config.yml

  1. В созданный файл /etc/patroni/config.yml нужно поместить пример начальной конфигурации, изменив ip-адреса на свои на каждом узле кластера. Обратите внимание на комментарии в данном файле.

Пример начальной конфигурации:

Пример начальной конфигурации для включения поддержки TLS/SSL в Patroni.

  1. Сделайте пользователя postgres владельцем каталога настроек:

sudo chown postgres:postgres -R /etc/patroni
sudo chmod 700 /etc/patroni

Шаг 7: Подготовка кластера PostgreSQL+Patroni

  1. Запустите службу Patroni на узле postgres-server1.your_domain, а затем на узлах postgres-server2.your_domain и postgres-server3.your_domain:

sudo systemctl enable --now patroni.service

  1. Проверьте состояние кластера:

patronictl -c /etc/patroni/config.yml list

Шаг 8: Подготовка PGBouncer (опционально)

PGBouncer предназначен для управления пулом соединений к PostgreSQL и позволяет минимизировать издержки, связанные с установлением новых подключений к PostgreSQL.

Про установку и настройку PGBouncer читайте в статье «Установка PGBouncer».

Шаг 9: Конфигурация HAProxy (блок postgres)

Настройте «Отказоустойчивый HAProxy» для приёма запросов к PostgreSQL и балансировку нагрузки между нодами кластера PostgreSQL. Подробнее об этом читайте в статье «Конфигурация HAProxy для PostgreSQL».

Шаг 10: Подключение к PostgreSQL

Строка для подключения к кластеру PostgreSQL:

psqlUrl: postgresql://elma365:SecretPassword@haproxy-server.your_domain:5000/elma365?sslmode=disable

Строка для подключения к кластеру Postgres только для чтения:

psqlUrl: postgresql://elma365:SecretPassword@haproxy-server.your_domain:5001/elma365?sslmode=disable

Подключение к кластеру PostgreSQL с TLS/SSL