ELMA365 On-premises > ELMA365 Enterprise > Высокодоступный кластер ELMA365 / Установка PostgreSQL

Установка PostgreSQL

Сервера объединяются в кластер Master-Replica(s). Один сервер становится главным и отправляет свои данные на остальные сервера. Более подробно о настройке и особенностях работы кластера можно почитать в официальной документации https://www.postgresql.org/docs/10/high-availability.html.

high-avail-kluster-1Исходные данные

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

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

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

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

  • postgres-server-1, 192.168.1.1
  • postgres-server-2, 192.168.1.2
  • postgres-server-3, 192.168.1.3

Шаг 1: Установка кластера etcd

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

sudo apt-get install etcd -y

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

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

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

sudo nano /etc/default/etcd

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

ETCD_NAME="postgres-server1"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.1:2379,http://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.1:2379"
ETCD_LISTEN_PEER_URLS="http://192.168.1.1:12380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.1:12380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster"
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_DATA_DIR="/var/lib/etcd"
ETCD_ELECTION_TIMEOUT="5000"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_INITIAL_ELECTION_TICK_ADVANCE="false"
ETCD_ENABLE_V2="true"

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

ETCD_NAME="postgres-server2"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.2:2379,http://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.2:2379"
ETCD_LISTEN_PEER_URLS="http://192.168.1.2:12380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.2:12380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster"
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_DATA_DIR="/var/lib/etcd"
ETCD_ELECTION_TIMEOUT="5000"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_INITIAL_ELECTION_TICK_ADVANCE="false"
ETCD_ENABLE_V2="true"

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

ETCD_NAME="postgres-server3"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.3:2379,http://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.3:2379"
ETCD_LISTEN_PEER_URLS="http://192.168.1.3:12380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.3:12380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster"
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_DATA_DIR="/var/lib/etcd"
ETCD_ELECTION_TIMEOUT="5000"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_INITIAL_ELECTION_TICK_ADVANCE="false"
ETCD_ENABLE_V2="true"

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

  • 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 — время в миллисекудах, между рассылками лидером оповещений о том, что он всё ещё лидер.
  1. Перезапустите etcd на всех узлах:

sudo systemctl restart etcd

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

sudo etcdctl cluster-health

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

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

Для корректной работы системы требуется PostgreSQL версии 10.

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

  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-10 -y

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

Следующие действия выполняются на первичном узле:

  1. Создайте новую роль elma365 с паролем SecretPassword (логин и пароль должны присутствовать в списке пользователей pgbouncer):

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. Файл pg_hba.conf должен быть настроен на всех серверах базы данных, чтобы разрешить соединения с разных серверов.

Добавьте в конфигурационный файл pg_hba.conf информацию о всех узлах, например:

#Patroni
host all all 0.0.0.0/0 md5
host replication replicator 192.168.1.1/32 md5
host replication replicator 192.168.1.2/32 md5
host replication replicator 192.168.1.3/32 md5

  1. Перезапускаем PostgreSQL на всех узлах:

systemctl restart postgresql

Шаг 4: Установка PgBouncer

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

sudo apt-get install pgbouncer -y

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

sudo mv /etc/pgbouncer/pgbouncer.ini{,.original}

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

sudo nano /etc/pgbouncer/pgbouncer.ini

  1. Добавьте пример конфигураций в файл, на каждом узле:

[databases]
postgres = host=127.0.0.1 port=5432 dbname=postgres
* = host=127.0.0.1 port=5432
 
[pgbouncer]
logfile = /var/log/postgresql/pgbouncer.log
pidfile = /var/run/postgresql/pgbouncer.pid
listen_addr = *
listen_port = 6432
unix_socket_dir = /var/run/postgresql
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
admin_users = postgres
ignore_startup_parameters = extra_float_digits,geqo
pool_mode = session
server_reset_query = DISCARD ALL
max_client_conn = 10000
default_pool_size = 20
reserve_pool_size = 1
reserve_pool_timeout = 1
max_db_connections = 1000
pkt_buf = 8192
listen_backlog = 4096
log_connections = 0
log_disconnections = 0

  1. Добавьте в файл /etc/pgbouncer/userlist.txt имена пользователей и пароли, с которыми PgBouncer подключается к базе.

sudo nano /etc/pgbouncer/userlist.txt

Например, суперпользователя postgres и пользователя для работы с базой elma365:

"elma365" "SecretPassword"
"postgres" "PostgresPassword"

  1. Перезапустите PgBouncer на всех узлах:

sudo systemctl restart pgbouncer

Шаг 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

Действия сначала выполняются на первичном узле:

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

sudo nano /etc/patroni/config.yml

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

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

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

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

  1. Запустите службу Patroni:

sudo systemctl enable --now patroni.service

Добавление нового узла Patroni:

Для добавления нового узла в кластер Patroni, выполняются действия как для первичного узла.

  1. Необходимо внести изменения в файле /etc/patroni/config.yml на значения текущего сервера.
  2. Если служба была запущена раньше, удалите каталог данных, чтобы заработала реплика:

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

  1. Запустите службу Patroni:

sudo systemctl enable --now patroni.service

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

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

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

Пример конфигурации для настройки балансировки нагрузки с помощью HAproxy:

listen postgres_master
    bind haproxy-server.your_domain:5000
    option tcplog
    option httpchk OPTIONS /master
    http-check expect status 200
    default-server inter 3s fastinter 1s fall 3 rise 4 on-marked-down shutdown-sessions
    server postgres-server1 postgres-server1.your_domain:6432 check port 8008
    server postgres-server2 postgres-server2.your_domain:6432 check port 8008
    server postgres-server3 postgres-server3.your_domain:6432 check port 8008
 
listen postgres_replicas
    bind haproxy-server.your_domain:5001
    option tcplog
    option httpchk OPTIONS /replica
    balance roundrobin
    http-check expect status 200
    default-server inter 3s fastinter 1s fall 3 rise 2 on-marked-down shutdown-sessions
    server postgres-server1 postgres-server1.your_domain:6432 check port 8008
    server postgres-server2 postgres-server2.your_domain:6432 check port 8008
    server postgres-server3 postgres-server3.your_domain:6432 check port 8008
 
listen postgres_replicas_sync
    bind haproxy-server.your_domain:5002
    option tcplog
    option httpchk OPTIONS /sync
    balance roundrobin
    http-check expect status 200
    default-server inter 3s fastinter 1s fall 3 rise 2 on-marked-down shutdown-sessions
    server postgres-server1 postgres-server1.your_domain:6432 check port 8008
    server postgres-server2 postgres-server2.your_domain:6432 check port 8008
    server postgres-server3 postgres-server3.your_domain:6432 check port 8008
 
listen postgres_replicas_async
    bind haproxy-server.your_domain:5003
    option tcplog
    option httpchk OPTIONS /async
    balance roundrobin
    http-check expect status 200
    default-server inter 3s fastinter 1s fall 3 rise 2 on-marked-down shutdown-sessions
    server postgres-server1 postgres-server1.your_domain:6432 check port 8008
    server postgres-server2 postgres-server2.your_domain:6432 check port 8008
    server postgres-server3 postgres-server3.your_domain:6432 check port 8008

Шаг 7: Подключение к ELMA365

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

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

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

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

Нашли опечатку? Выделите текст, нажмите ctrl + enter и оповестите нас