Балансировка нагрузки Indeed CM при использовании HAProxy + Keepalived
Автор Mikhail Yakovlev, Last modified by Mikhail Yakovlev на 18 ноября 2019 03:52 PM

Для серверов Indeed CM возможно использовать балансировщик нагрузок HAProxy. Для обеспечения отказоустойчивости самого сервера с HAProxy рекомендуется развернуть второй сервер и использовать конфигурацию HAProxy + Keepalived.

Для установки и настройки HAProxy + Keepalived выполните следующие действия:

1. Разверните два сервера с Ubuntu (LTS).

2. Введите их в сеть. Добавьте соответствия IP и DNS имени в файле /etc/hosts для серверов Indeed CM и серверов Ubuntu c HAProxy + Keepalived.

3. Выполните установку HAProxy на первом сервере:

  • Запустите терминал
  • Установите HAProxy: sudo apt-get install haproxy
  • Для дальнейшего удобства установите Midnight Commander: sudo apt-get install mc
  • Откройте Midnight Commander: sudo mc
  • Откройте файл /etc/default/haproxy и добавьте строку ENABLED=1 (Эта настройка позволяет автоматически запускать HAProxy при загрузке системы)
  • Отредактируйте  файл конфигурации HAProxy: /etc/haproxy/haproxy.cfg используя пример:
global

log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
maxconn 4096
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon

# Default SSL material locations

# ca-base /etc/ssl/certs
# crt-base /etc/ssl/private

ca-base /etc/ssl/cm  # Путь к сертификатам
crt-base /etc/ssl/cm  # Путь к сертификатам

# TODO:....

# ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
# ssl-default-bind-options no-sslv3

defaults

log global
mode http
option httplog
option dontlognull
option abortonclose
option splice-auto
retries 3  # Кол-во попыток до того, как понизить статус сервера
option redispatch  # Позволит пользователям пройти к другому серверу если сервер, на который ссылаются их куки, не работает

# Тайм ауты  

timeout connect 30s

timeout client 5400s
timeout server 5400s
timeout check 10s
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http

# Модуль статистики. Доступен по http://<IP адрес сервера>:9000/haproxy_stats Login:admin Pass:admin

listen stats

bind *:9000
mode http
stats enable  # Enable stats page
stats refresh 30s  # Refresh page
stats realm Haproxy\ Statistics  # Title text for popup window
stats uri /haproxy_stats  # Stats URI
stats auth admin:admin  # Authentication credentials

#############################################
########### CM SSL Pass-Through #############
#############################################

frontend frontend_cm_80

maxconn 10000
bind *:80
redirect scheme https if !{ ssl_fc }  # redirect to https
option tcplog

frontend frontend_cm_443

maxconn 12000
bind *:443
mode tcp  # full-duplex connection will be established between clients and servers, and no layer 7 examination will be performed
option tcplog
default_backend backend_cm_443

backend backend_cm_443

mode tcp  # full-duplex connection will be established between clients and servers, and no layer 7 examination will be performed
fullconn 12000
balance roundrobin  # Алгоритм выбора сервера (наименее загруженный по порядку)
default-server weight 100 maxconn 800 port 443
server indeed1 IndeedCM1.demo.local:443 check  # DNS имя сервера Indeed CM1
server indeed2 IndeedCM2.demo.local:443 check  # DNS имя сервера Indeed CM2

  • Проверить файл конфигурации можно командой: haproxy -c -f /etc/haproxy/haproxy.cfg
  • Запустите HAProxy sudo /etc/init.d/haproxy start. Перезапуск сервиса выполняется командами: sudo systemctl restart haproxy или sudo service haproxy restart
  • Проверьте работу сервиса перейдя по ссылке: http://<IP адрес сервера Ubuntu c haproxy>:9000/haproxy_stats Login: admin Pass: admin (для конфигурации из примера). Ниже на скриншоте продемонстрирована работа сервиса HAProxy с двумя серверами Indeed CM.  

Полезные ссылки для настройки файла конфигурации:

4. Установите Keepalived на первом сервере:

https://www.leaseweb.com/labs/2011/09/setting-up-keepalived-on-ubuntu-load-balancing-using-haproxy-on-ubuntu-part-2/

  • Для этого выполните команду sudo apt-get install keepalived
  • Отредактируйте файл /etc/sysctl.conf добавив строки:

net.ipv4.ip_forward=1

net.ipv4.ip_nonlocal_bind=1

  • Выполните команду sudo sysctl -p для проверки добавленных изменений
  • Создайте файл конфигурации /etc/keepalived/keepalived.conf
  • Настройте файл конфигурации согласно примеру:
# Keepalived process identifier

lvs_id haproxy_DH
}

# Script used to check if HAProxy is running

vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}

# Virtual interface
# The priority specifies the order in which the assigned interface to take over in a failover

vrrp_instance VI_01 {
state MASTER # MASTER для основного сервера, BACKUP для резевного
interface ens33 # Имя интерфейса можно узнать с помощью команды ifconfig
virtual_router_id 51
priority 101 # Для основного сервера с haproxy 101, для резевного 100

# The virtual ip address shared between the two loadbalancers

virtual_ipaddress {
192.168.43.101 # Виртуальный IP, по которому будет доступен keepalived
}

track_script {
check_haproxy
}
}

  • Сохраните и закройте файл конфигурации
  • Для виртуального адреса из примера: 192.168.43.101 создайте A-запись в DNS (например, на имя cm.demo.local). DNS Manager>Forward Lookup Zones>New Host (A or AAAA)… По этому адресу в дальнейшем будут доступны сервера Ubuntu c балансировщиком нагрузок HAProxy
  • Запустите keepalived командой /etc/init.d/keepalived start. Проверить работоспособность сервиса можно командой: ip addr show ens33 (имя сетевого интерфейса). Для перезагрузки службы используйте команду: sudo service keepalived restart

5. По аналогии с п. 3 выполните настройку HAProxy на втором сервере с Ubuntu. Файлы конфигурации haproxy.cfg должны совпадать на обоих серверах.

6. Повторите действия из п. 4 на втором сервере. Конфигурационный файл keepalived.conf на втором сервере будет отличаться следующим образом:

        state BACKUP  # set this to BACKUP on the other machine
priority 100 # set this to 100 on the other machine

Настройка Агента Indeed CM

1. Выпустите SSL сертификат на DNS имя присвоенное для keepalived (например на cm.demo.local). Для создания SSL сертификата дополнительного сервера воспользуйтесь утилитой IndeedCM.Agent.Cert.Generator.exe с файлом ключа корневого сертификата Indeed CM Agent CA.key  и выполните команду:

IndeedCM.Agent.Cert.Generator.exe /ssl /sn <DNS имя> /rootKey <путь к каталогу с ключом корневого сертификата>
Пример: IndeedCM.Agent.Cert.Generator.exe /ssl /sn cm.demo.local /rootKey "C:\AgentCertGenerator\Indeed CM Agent CA.key"
 

2. Полученный файл cm.demo.local_ssl_cert.pfx необходимо скопировать на сервер Ubuntu и переконвертировать в .pem, выполнив команду в терминале:

openssl pkcs12 -in cm.demo.local_ssl_cert.pfx -out cm.demo.local_ssl_cert.pem -nodes

А также Indeed CM Agent CA.cer переконвертировать в .crt:

openssl x509 -inform DER -in "Indeed CM Agent CA.cer" -out Indeed_CM_Agent_CA.crt

3. Переместите эти сертификаты в /etc/ssl/certs (путь по умолчанию). Если используете файл конфигурации из примера, то в /etc/ssl/cm.

sudo cp Indeed_CM_Agent_CA.crt /etc/ssl/certs

sudo cp cm.demo.local_ssl_cert.pem /etc/ssl/certs

4. Отредактируйте файл конфигурации haproxy.cfg, добавив секцию и изменив её под вашу конфигурацию. Пример секции файла конфигурации:

############################################
############### AGENT SSL ##################
############################################

frontend frontend_agent_https

bind *:3003 ssl crt /etc/ssl/cm/cm.demo.local_ssl_cert.pem ca-file /etc/ssl/cm/Indeed_CM_Agent_CA.crt verify required # Привязываем сертификат агента
option forwardfor # Передать оригинальный ip адрес клиента серверу
http-request set-header X-IndeedCM-ClientCert %{+Q}[ssl_c_der,base64]
default_backend backend_agent_https # Указываем какой сервер обрабатывает запросы

backend backend_agent_https

balance roundrobin # Алгоритм выбора сервера (наименее загруженный по порядку)
option prefer-last-server # Попытка повторно использовать тоже соединение к серверу
option forwardfor # Передать оригинальный ip адрес клиента серверу
option httpchk GET /agentserviceapi/api/healthcheck/isHealthy
cookie IndeedCMAgentProxy insert indirect nocache # Указываем, что мы используем cookie для выбора сервера, а indirect - что куки не будут передаваться дальше на сервера, а останутся на прокси сервере. nocache - чтобы proxy не кэшил страницы, иначе есть шансы что он всем отдаст одни и те же страницы с одинаковым cookie (и будет загружен лишь один сервер)
server indeed1 IndeedCM1.demo.local:3003 check inter 5000ms cookie CM1 ssl verify none
server indeed2 IndeedCM2.demo.local:3003 check inter 5000ms cookie CM2 ssl verify none

frontend frontend_agent_reg_https

bind *:3004 ssl crt /etc/ssl/cm/cm.demo.local_ssl_cert.pem ca-file /etc/ssl/cm/Indeed_CM_Agent_CA.crt verify none # Привязываем сертификат агента
option forwardfor # Передать оригинальный ip адрес клиента серверу
default_backend backend_agent_reg_https # Указываем какой сервер обрабатывает запросы

backend backend_agent_reg_https

option httpchk GET /agentregistrationapi/api/healthcheck/isHealthy
option forwardfor # Передать оригинальный ip адрес клиента серверу
balance roundrobin # Алгоритм выбора сервера (наименее загруженный по порядку)
server indeed1 IndeedCM1.demo.local:3003 check inter 5000ms ssl verify none
server indeed2 IndeedCM2.demo.local:3003 check inter 5000ms ssl verify none

5. На сервере Indeed CM перейдите в Диспетчер служб IIS>IndeedCM Agent Site>agentserviceapi и для Параметры SSL выставьте Требовать SSL и Принимать. Для сохранения нажмите Применить.

6. Для настройки Агентов на рабочих станций необходимо создать файл реестра (.reg) со следующим содержанием:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\IndeedCM\Agent]

"AgentRegistrationServiceUrl"=""
"AgentServiceUrl"=""

Для 32-разрядных ОС параметры настраиваются в ветке:

[HKEY_LOCAL_MACHINE\SOFTWARE\IndeedCM\Agent]

Ниже приведен пример содержимого заполненного .reg-файла для подключения к серверу HAProxy + Keepalived согласно файлу конфигурации haproxy.cfg и выданному DNS имени для сервиса Keepalived (cm.demo.local):

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\IndeedCM\Agent]

"AgentRegistrationServiceUrl"="https://cm.demo.local:3004/agentregistrationapi/"
"AgentServiceUrl"="https://cm.demo.local:3003/agentserviceapi/"

7. Распространите файл реестра и внесите изменения на рабочие станции пользователей. Для применения внесенных изменений перезагрузите рабочую станцию с установленным Агентом Indeed CM или перезапустите службу Indeed CM Agent Service.



Вложения 
 
 haproxy.cfg (5.51 кБ)
 keepalived.conf (0.52 кБ)
(0 голос(а))
Эта статья полезна
Эта статья бесполезна

Комментарии (0)
Добавить новый комментарий
 
 
Полное имя:
Email:
Комментарии: