﻿# Конфигурация HAProxy для PostgreSQL

> [HTML Version](haproxy-postgresql.html)

Архитектура высокодоступного кластера ELMA365 подразумевает взаимодействие микросервисов приложения ELMA365 с кластером базы данных PostgreSQL. Чтобы обеспечить надёжную балансировку нагрузки в системе, создайте конфигурацию HAProxy для PostgreSQL. Так, в случае сбоя весь трафик будет перенаправлен в кластер Master-Replica(s), что гарантирует непрерывную работу системы.

Примеры настройки HAProxy:

1. [Пример конфигураци HAProxy для подключения к PostgreSQL](#haproxypostgresql).

2. [Пример конфигураци HAProxy для подключения к PGBouncer](#haproxypgbouncer).

## Пример конфигурации HAProxy для подключения к PostgreSQL

В этой статье конфигурация подготовлена для балансировки трафика в кластер PostgreSQL, развёрнутый согласно описанию из статьи [«Кластер PostgreSQL»](configure-postgresql.md). Для балансировки используется HAProxy. С его помощью автоматически проверяется порт \[OBJECT\] сервиса Patroni на серверах PostgreSQL с ролью \[OBJECT\].

Трафик операций в кластер распределяется следующим образом:

- операции записи, приходящие на \[OBJECT\], направляются на сервер с ролью \[OBJECT\];

- операции чтения, приходящие на \[OBJECT\], направляются на сервера с ролью \[OBJECT\].

В случае сбоя весь трафик будет перенаправлен в кластер Master-Replica(s), т. е. операции записи и чтения начнут поступать именно сюда.

Чтобы создать конфигурацию HAProxy для PostgreSQL выполните следующие действия:

1. Откройте для редактирования конфигурационный файл \[OBJECT\] с помощью команды:

````
sudo nano /etc/haproxy/haproxy.cfg

2. ````
Внесите изменения в конфигурационный файл \[OBJECT\]:

Пример конфигурации

````
\### PostgreSQL ###  
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:5432 check port 8008  
    server postgres-server2 postgres-server2.your\_domain:5432 check port 8008  
    server postgres-server3 postgres-server3.your\_domain:5432 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:5432 check port 8008  
    server postgres-server2 postgres-server2.your\_domain:5432 check port 8008  
    server postgres-server3 postgres-server3.your\_domain:5432 check port 8008  
\### PostgreSQL ###
````

````
Пример конфигурации HAProxy с использованием TLS

  
Включение TLS возможно, если встроена поддержка OpenSSL. В параметре \[OBJECT\] укажите путь до файла PEM, содержащего требуемые сертификаты и связанные закрытые ключи ([fullchain-сертификат](fullchain-sertificate.md)). Eсли файл не содержит закрытого ключа, HAProxy попытается загрузить ключ по тому же пути с суффиксом **.key**.

  
Если вместо файла PEM используется имя каталога, то все файлы, найденные в этом каталоге, будут загружены в алфавитном порядке, кроме файлов, заканчивающихся на **.issuer**, **.ocsp** или **.sctl **(зарезервированные решения). Подробнее читайте в **Configuration Manual** для используемой версии HAProxy. Пример для [HAProxy 2.5](https://cbonte.github.io/haproxy-dconv/2.5/configuration.html#5.1-crt):   


````
\### PostgreSQL ###  
listen postgres\_master  
    bind haproxy-server.your\_domain:5000 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem  
    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:5432 check port 8008 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA\_your\_domain.pem  
    server postgres-server2 postgres-server2.your\_domain:5432 check port 8008 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA\_your\_domain.pem  
    server postgres-server3 postgres-server3.your\_domain:5432 check port 8008 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA\_your\_domain.pem  
  
listen postgres\_replicas  
    bind haproxy-server.your\_domain:5001 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem  
    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:5432 check port 8008 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA\_your\_domain.pem  
    server postgres-server2 postgres-server2.your\_domain:5432 check port 8008 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA\_your\_domain.pem  
    server postgres-server3 postgres-server3.your\_domain:5432 check port 8008 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA\_your\_domain.pem  
\### PostgreSQL ###
````

3. ````
Перезапустите HAProxy для применения изменений:

````
sudo systemctl restart haproxy

## ````
Пример конфигураци HAProxy для подключения к PGBouncer

В этой статье представлена конфигурация для балансировки трафика в кластер PostgreSQL, развёрнутый согласно описанию из статьи [«Кластер PostgreSQL»](configure-postgresql.md), через программу [PGBouncer](pgbouncer-installation.md). Для балансировки используется HAProxy. С его помощью автоматически проверяется порт \[OBJECT\] сервиса Patroni на серверах PostgreSQL с ролью \[OBJECT\].

Трафик операций в кластер распределяется следующим образом:

- операции записи, приходящие на \[OBJECT\], направляются на сервер с ролью \[OBJECT\];

- операции чтения, приходящие на \[OBJECT\], направляются на сервера с ролью \[OBJECT\].

В случае сбоя весь трафик будет перенаправлен в кластер Master-Replica(s), т. е. операции записи и чтения начнут поступать именно сюда.

Чтобы создать конфигурацию HAProxy для PostgreSQL через программу PGBouncer выполните следующие действия:

1. Откройте для редактирования конфигурационный файл \[OBJECT\] с помощью команды:

````
sudo nano /etc/haproxy/haproxy.cfg

2. ````
Внесите изменения в конфигурационный файл \[OBJECT\]:

Пример конфигурации

````
\### PostgreSQL ###  
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  
\### PostgreSQL ###
````

````
Пример конфигурации HAProxy с использованием TLS

  
Включение TLS возможно, если встроена поддержка OpenSSL. В параметре \[OBJECT\]  укажите путь до файла PEM, содержащего требуемые сертификаты и связанные закрытые ключи ([fullchain-сертификат](fullchain-sertificate.md)). Eсли файл не содержит закрытого ключа, HAProxy попытается загрузить ключ по тому же пути с суффиксом **.key**.

  
Если вместо файла PEM используется имя каталога, то все файлы, найденные в этом каталоге будут загружены в алфавитном порядке, кроме файлов, заканчивающихся на **.issuer**, **.ocsp** или **.sctl** (зарезервированные решения).

  
В параметре \[OBJECT\] укажите путь до файла PEM, содержащего корневой сертификат**. **Подробнее читайте в **Configuration Manual** для используемой версии HAProxy. Пример для [HAProxy 2.5](https://cbonte.github.io/haproxy-dconv/2.5/configuration.html#5.1-crt):  


````
\### PostgreSQL ###  
listen postgres\_master  
    bind haproxy-server.your\_domain:5000 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem  
    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 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA\_your\_domain.pem  
    server postgres-server2 postgres-server2.your\_domain:6432 check port 8008 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA\_your\_domain.pem  
    server postgres-server3 postgres-server3.your\_domain:6432 check port 8008 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA\_your\_domain.pem  
  
listen postgres\_replicas  
    bind haproxy-server.your\_domain:5001 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem  
    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 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA.your\_domain.pem  
    server postgres-server2 postgres-server2.your\_domain:6432 check port 8008 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA.your\_domain.pem  
    server postgres-server3 postgres-server3.your\_domain:6432 check port 8008 ssl crt /etc/haproxy/ssl/haproxy-server.your\_domain.pem ca-file /etc/haproxy/ssl/rootCA\_your\_domain.pem  
\### PostgreSQL ###
````

3. ````
Перезапустите HAProxy для применения изменений:

````
sudo systemctl restart haproxy
````