Необходимо было построить отказоустойчивую систему для банка. О проекте внедрения можно прочитать в заявке на конкурс Directum Awards Самостоятельное внедрение DirectumRX в ЗАО "Агропромбанк". В статье приведен опыт от настройки до запуска и тестирования.
Сервера фермы делятся на 4 группы:
Начнем разворачивать эту инфраструктуру.
Различных вариантов обеспечения непрерывности работы для серверов баз достаточно много как для MSSQL, так и для PostgreSQL. Примеры можно найти в официальной документации к Diretum RX, например «Настройка отказоустойчивой архитектуры для PostgreSQL». Выбор и установка базы остается за вами, я же в дальнейшем буду считать, что база данных установлена и готова для установки Directum RX.
Процесс настройки серверов rx_arr1 и rx_arr2 хорошо описан в официальной документации: «DirectumRX 3.2: Настройка фермы серверов и NLB-кластера».
Чтобы настроить балансировщик нагрузки нужно последовательно выполнить инструкции из глав:
- Установка Internet Information Services (IIS)
- Настройка фермы серверов
- Настройка NLB-кластера
Т.к. мы используем сервера Core, то все настройки удобнее выполнять при помощи инструментов RSAT - Remote Server Administration Tools.
Подготовим сервера таким образом:
- Кластер RabbitMQ в режиме active-active
- Кластер Redis в режиме active-active
- Настроим keeplived для поддержки виртуальных IP адресов rx_rmq-vip1 для сервера rx_rmq1 и rx_rmq-vip2 для сервера rx_rmq2. Если один из серверов становится недоступен, то его виртуальный IP поднимается на другом сервере
RabbitMQ написан на языке Erlang, поэтому для запуска самого RabbitMQ требуется среда выполнения Erlang. Для простоты установки и поддержки лучше всего использовать подготовленные пакеты для вашего дистрибутива с сайта самого RabbitMQ: https://www.rabbitmq.com/download.html
Устанавливаем Erlang и RabbitMQ на оба узла: rx_rmq1 и rx_rmq2. Команды установки зависят от дистрибутива, потому нет смысла их приводить.
После установки обеспечьте запуск RabbitMQ при старте системы и запустите его, например в дистрибутивах использующих systemd:
systemctl enable rabbitmq-server
systemctl start rabbitmq-server
Оба сервера должны иметь одинаковые .erlang.cookie. Чтобы их синхронизировать, остановите RabbitMQ на втором сервере и скопируйте файл /var/lib/rabbitmq/.erlang.cookie с первого сервера на второй. После этого можно снова запустить RabbitMQ на втором сервере.
Включим управление, на обоих узлах выполним:
rabbitmq-plugins enable rabbitmq_management
На обоих узлах создадим пользователя с правами администратора:
rabbitmqctl add_user admin Пароль_для_админа
rabbitmqctl set_user_tags admin administrator
Пароль_для_админа замените на любой выбранный вами.
На втором узле останавливаем RabbitMQ и последовательно выполняем следующие команды:
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster "rabbit@rx_rmq1"
rabbitmqctl start_app
После проверяем на обоих узлах статус кластера:
rabbitmqctl cluster_status
Если все в порядке, то заканчиваем на втором узле:
rabbitmqctl stop
systemctl start rabbitmq-server
Последним шагом будет создание учетной записи для DirectumRx. Для чего откройте в браузере ссылку: http://rx_rmq1:15672/ ; введите пользователя admin и пароль который вы выбрали на этапе подготовки.
Дальше создайте виртуальный хост и пользователя как это указано в «DirectumRX 3.2: Инструкция по установке», Раздел «Установка RabbitMQ», пункты с 6 по 13.
На этом подготовка кластера RabbitMQ закончена.
Redis – очень гибкий инструмент, который позволяет создавать отказоустойчивые конфигурации и существуют отличные примеры как настраивать его для работы с DirectumRX, например:
https://habr.com/ru/company/directum/blog/469543/
Однако для двухузлового кластера это одновременно и слишком сложно и выходит за рамки рекомендуемого, т.к. вышеприведенный пример рассчитан минимум на 3 узла.
Поэтому мы воспользуемся альтернативными возможностями, а именно установим Redis-совместимую БД KeyDB в режиме «Active Replication».
Режим «Active Replication» предназначен разработчиками KeyDB как раз для нашего сценария использования: двухузловой кластер с обеими активными узлами.
Разработчиками KeyDB предоставляются пакеты установки только для Debian-based дистрибутивов, и если у вас такой, то проще всего следовать инструкции с сайта:
https://docs.keydb.dev/docs/ppa-deb/
Для всех остальных придется собрать KeyDB самостоятельно, что очень просто, к примеру для RHEL8 (Centos 8, Oracle Linux 8) порядок будет такой (делаем на обоих узлах):
- качаем последний стабильный релиз
wget https://download.keydb.dev/keydb-stable.tar.gz
- распаковываем архив
tar -xvf ./keydb-stable.tar.gz
- устанавливаем необходимые программы и библиотеки:
dnf -y install gcc libxcrypt-devel isl libmpc binutils glibc-devel kernel-headers glibc-headers cpp gcc-c++ libstdc++-devel tcl libuuid-devel libcurl-devel
- компилируем
cd KeyDB/
make
make test
- устанавливаем
./install_server.sh
В результате установки в каталоге /etc/redis создается файл 6379.conf. Все настройки делаются редактированием этого файла. Делаем это сразу на обоих узлах
- Отключаем защищенный режим. Это связано с тем, что DirectumRX настраивается без аутентификации в Redis. Будем защищать наш KeyDB другими средствами, например фаерволом (что выходит за рамки статьи).
protected-mode no
- Включаем Active-Active репликацию:
active-replica yes
replicaof соседний_узел 6379
соседний_узел – заменить на IP или имя соседнего узла в кластере, для rx_rmq1 это rx_rmq2 и наоборот.
- Запускаем кластер сначала на одном, затем на другом узле:
systemctl start redis_6379
systemctl ут redis_6379
Следим что кластер запущен успешно по логам в файле /var/log/redis_6379.log
На этом установка Redis закончена.
На текущий момент готовые пакеты установки keepalived есть практически во всех дистрибутивах, поэтому устанавливаем его штатными средствами.
Настройка keepalived производится редактированием файла /etc/keepalived/keepalived.conf
Приведу примеры этого файла для обоих узлов кластера. Выделенное подчеркиванием надо заменить на собственные значения
Прикреплен файл: keepalived.conf
Запускаем keepalived на обоих узлах, например:
systemctl enable keepalived
systemctl start keepalived
Проверяем работу keepalived, проверив что на узлах появились VIP адреса. Попробуем остановить keepalived на любом из узлов и проверяя что на нем VIP пропал, а на другом появился.
На этом конфигурирование keepalived и кластера поддержки в целом закончено.
Для службы хранения файлов требуются 3 папки хранения: временная, исходных документов и папка хранения файлов. На обоих серверах, на отдельном томе, например на диске D:,
создаем три папки для этих целей. Для папки хранения файлов настраиваем репликацию файлов при помощи DFS.
Процесс настройки серверов rx_app1 и rx_app2 делаем так как описано в официальной документации: «DirectumRX 3.2: Настройка фермы серверов и NLB-кластера», выполнив инструкции из главы «Установка DirectumRX в отказоустойчивой архитектуре».
Выполнять инструкцию нужно только с одним уточнением: при указании подключения к RabbitMQ и к Redis нужно указывать адрес rx_rmq-vip1 при установке на rx_app1, и соответственно, нужно указывать адрес rx_rmq-vip2 при установке на rx_app2
Авторизуйтесь, чтобы написать комментарий