Содержание
HAProxy — это программное обеспечение балансировки нагрузки и прокси-сервер, который часто используется в кластерах для распределения запросов по различным серверам баз данных. HAProxy принимает запросы от клиентов и направляет их к соответствующим серверам в кластере, чтобы достичь балансировки нагрузки и повысить производительность кластера. Адресация на кластера будет производится согласно портам сервисов.
1. Установка и запуск сервиса
dnf install haproxy systemctl enable haproxy --now
2. Настройка
В файле /etc/haproxy/haproxy.cfg укажите адреса нод кластеров PostgreSQL, RabbitMQ, Redis:
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
log /dev/log local0
log /dev/log local1 notice
#chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
maxconn 4000
user haproxy
group haproxy
daemon
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode tcp
log global
retries 3
timeout queue 5s
timeout connect 10s
timeout client 30m
timeout server 30m
timeout check 10s
listen stats
mode http
bind :7000
stats enable
stats uri /
### PostgreSQL ###
listen postgres_master
bind :5000
option tcplog
option tcpka
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 psql1 192.168.27.239:5432 check port 8008 #адрес первой ноды БД
server psql2 192.168.27.219:5432 check port 8008 #адрес второй ноды БД
server psql3 192.168.27.108:5432 check port 8008 #адрес третьей ноды БД
listen postgres_replicas
bind :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 psql1 192.168.27.239:5432 check port 8008 #адрес первой ноды БД
server psql2 192.168.27.219:5432 check port 8008 #адрес второй ноды БД
server psql3 192.168.27.108:5432 check port 8008 #адрес третьей ноды БД
### PostgreSQL ###
### RabbitMQ ###
listen rabbitmq
bind :5672
mode tcp
balance roundrobin
server rabmq1 rabmq1.localdomain:5672 check inter 2s rise 2 fall 3 #адрес первой ноды брокера сообщений
server rabmq2 rabmq2.localdomain:5672 check inter 2s rise 2 fall 3 #адрес второй ноды брокера сообщений
server rabmq3 rabmq3.localdomain:5672 check inter 2s rise 2 fall 3 #адрес третьей ноды брокера сообщений
listen rabbitmq_management
bind :15672
balance source
server rabmq1 rabmq1.localdomain:15672 check inter 2s #адрес первой ноды брокера сообщений
server rabmq2 rabmq2.localdomain:15672 check inter 2s #адрес второй ноды брокера сообщений
server rabmq3 rabmq3.localdomain:15672 check inter 2s #адрес третьей ноды брокера сообщений
### RabbitMQ ###
### Redis ###
frontend redis_master
bind :6379
mode tcp
option tcplog
option clitcpka
timeout client 24h
default_backend redis_master
backend redis_master
balance first
mode tcp
timeout queue 2s
timeout connect 2s
timeout check 1s
option srvtcpka
timeout server 24h
option tcp-check
tcp-check connect
tcp-check send AUTH\ SecretPassword\r\n #укажите пароль для мастера из пункта 3.2
tcp-check send PING\r\n
tcp-check expect string +PONG
tcp-check send info\ replication\r\n
tcp-check expect string role:master
tcp-check send QUIT\r\n
tcp-check expect string +OK
server redis1 192.168.27.208:6379 check inter 5s
server redis2 192.168.27.133:6379 check inter 5s
server redis3 192.168.27.185:6379 check inter 5s
### Redis ###2.1. Команды для проверки работы
haproxy -f /etc/haproxy/haproxy.cfg -d — для проверки конфигурации systemctl status haproxy — для проверки статуса сервиса
3. Дополнительные ноды для отказоустойчивости (опционально)
Для минимизации времени простоя сервера с внутренним балансером возможно реализовать отказоустойчивый кластер с использованием нескольких экземпляров HAProxy.
Для реализации потребуется дополнительный IP адрес в сети, рекомендуется использовать внутренний для обеспечения безопасности доступа к кластерами других нод. Ноды будут использовать один виртуальный IP адрес при обращении к сервисам PostgreSQL, RabbitMQ, Redis.
В статье используется внутренний IP адрес 192.168.26.27 как VRRP (Virtual Router Redundancy Protocol) — это сетевой протокол, предназначенный для обеспечения отказоустойчивости маршрутизаторов или шлюзов в локальной сети. При настройке использовался на сервере с одним портом с внутренним IP. В дальнейшем к этому интерфейсу будет привязан виртуальный адрес 192.168.26.27 Это один общий IP-адрес, который является точкой входа для всех клиентов, обращающихся к балансировщику. Этот адрес не привязан постоянно к одному серверу. Вместо этого, служба Keepalived настраивается на обоих узлах кластера и определяет, какой из серверов в данный момент является «основным» (MASTER). Только на этом основном сервере в данный момент активен Виртуальный IP-адрес.
Если основной сервер или служба HAProxy на нем выходит из строя, Keepalived автоматически обнаружит это и переключит статус MASTER на второй сервер, который затем «поднимет» Виртуальный IP-адрес уже у себя. Клиенты при этом продолжают обращаться к тому же Виртуальному IP, не замечая переключения.
3.1. Установка
На основной ноде потребуется дополнительно установить сервис:
dnf install keepalived -y
На всех дополнительных нодах потребуется установка сервисов:
dnf install haproxy keepalived -y
Далее, добавьте в автозагрузку:
systemctl enable keepalived haproxy
3.2. Настройка
3.2.1. На основной ноде
3.2.1.1. Создайте каталог
mkdir -p /usr/libexec/keepalived
Далее, создайте файл /usr/libexec/keepalived/haproxy_check.sh с содержимым:
#!/bin/bash /bin/kill -0 $(cat /var/run/haproxy.pid)
Скрипт проверяет, запущен ли процесс HAProxy, используя его PID для мониторинга состояния службы.
3.2.1.2. Измените конфигурацию /etc/keepalived/keepalived.conf
global_defs {
router_id haproxy-server1
enable_script_security
script_user root
}
vrrp_script haproxy_check {
script "/usr/libexec/keepalived/haproxy_check.sh"
interval 1
weight -20
fall 2
rise 2
}
vrrp_instance VI_1 {
interface ens3
virtual_router_id 101
priority 100
advert_int 1
state MASTER
virtual_ipaddress {
192.168.26.27
}
track_script {
haproxy_check weight 20
}
authentication {
auth_type PASS
auth_pass SecretPassword
}
}Где введённые параметры:
router_id— ID роутера, уникальное значение на каждом узле;script_user— пользователь, от имени которого будут запускаться скрипты VRRP;interface— наименование интерфейса, к которому будет привязан keepalived;virtual_router_id— ID виртуального роутера, общее значение на всех узлах;priority— приоритет нод внутри виртуального роутера;state— тип роли ноды в виртуальном роутере;virtual_ipaddress— виртуальный IP;auth_type— тип аутентификации в виртуальном роутере;auth_pass— указывается пароль.
3.2.2. На дополнительных нодах
3.2.2.1. Скопируйте ранее установленные значения из /etc/hosts и укажите значения на новых нодах
3.2.2.2. Скопируйте конфигурацию /etc/haproxy/haproxy.cfg и укажите конфигурацию на новых нодах
3.2.2.3. Создайте каталог
mkdir -p /usr/libexec/keepalived
Создайте файл /usr/libexec/keepalived/haproxy_check.sh с содержимым:
#!/bin/bash /bin/kill -0 $(cat /var/run/haproxy.pid)
3.2.2.4. Измените конфигурацию /etc/keepalived/keepalived.conf
global_defs {
router_id haproxy-server2
enable_script_security
script_user root
}
vrrp_script haproxy_check {
script "/usr/libexec/keepalived/haproxy_check.sh"
interval 1
weight -20
fall 2
rise 2
}
vrrp_instance VI_1 {
interface ens3
virtual_router_id 101
priority 90
advert_int 1
state BACKUP
virtual_ipaddress {
192.168.26.27
}
track_script {
haproxy_check weight 20
}
authentication {
auth_type PASS
auth_pass SecretPassword
}
}За основу взята конфигурация с основной ноды и внесены правки в параметры:
router_id— укажите уникальные названия для каждой ноды;priority— приоритет нод внутри виртуального роутера;state— тип роли ноды в виртуальном роутере.
3.2.2.5. Перезапустите на всех нодах сервисы
systemctl restart keepalived haproxy
4. Настройка Корпоративного сервера
4.1. Внесите правки в конфигурации на всех нодах api
В файле /opt/r7-office/Api/appsettings.json:
"ConnectionStrings": {
"R7StorageServerUserActions": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;",
"R7StorageServer": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;",
"CommunityRepository": "Server=localhost;UserID=root;Password=test;Database=r7-office",
"Payments": "Database=Payments;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;",
"GeoNames": "Database=GeoNames;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;"
},
"rabbitMq": {
"host": "192.168.26.27",
"username": "r7office",
"password": "r7office",
"timeout": 10
},В файле /opt/r7-office/Sso.Api/appsettings.json:
"ConnectionStrings": {
"R7StorageServerUserActions": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;",
"R7StorageServer": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;",
"CommunityRepository": "Server=localhost;UserID=root;Password=p@ssw0rd;Database=r7-office",
"Payments": "Database=Payments;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;",
"GeoNames": "Database=GeoNames;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;"
},
"rabbitMq": {
"host": "192.168.26.27",
"username": "r7office",
"password": "r7office",
"timeout": 10
},А ткже processing нодах /opt/r7-office/Processing/appsettings.json:
"ConnectionStrings": {
"R7StorageServerUserActions": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;",
"R7StorageServer": "Database=cddisk;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;",
"CommunityRepository": "Server=localhost;UserID=root;Password=test;Database=r7-office",
"Payments": "Database=Payments;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;",
"GeoNames": "Database=GeoNames;Username=cddisk;Password=cddisk;Host=192.168.26.27;Port=5000;"
},
"DbType": "postgre",
"rabbitMq": {
"host": "192.168.26.27",
"username": "r7office",
"password": "r7office",
"timeout": 10
}Также необходимо указать параметры подключения к виртуальному IP адресу 192.168.26.27.
4.2. Перезапустите на нодах api и processing службы
supervisorctl restart all
5. Настройка Сервера документов
5.1. Выполните повторную конфигурацию
Выполните скрипт documentserver-configure.sh по пункту 3.3.1 документации и укажите параметры с виртуальным IP адресом 192.168.26.27.
5.2. Далее внесите правки
В следующих файлах укажите параметры с виртуальным IP адресом 192.168.26.27:
/etc/r7-office/documentserver/local.json/etc/r7-office/documentserver/default.json
5.3. Выполните перезапуск служб сервера документов
systemctl restart ds-*
