Введение
Отказоустойчивая система ЕССМ выполняется реализуется по схеме резервирования Active-Active с использованием VIP -адреса — (Virtual IP) адреса, — что позволяет использовать единый адрес для доступа к каждому узлу системы и хранить и хранить на них актуальные данные. Для настройки отказоустойчивой схемы требуется выделить не менее трех серверовтрех серверов. В схеме резервирования также предусмотрено разделение ЕССМ на сервер с БД и сервер с ЕССМ, использующим данную базу — для таких случаев требуется выделить 5 серверов.
Стандартная схема отказоустойчивой системы
| draw.io Diagram |
|---|
| border | true |
|---|
| |
|---|
| diagramName | Copy of Диаграмма без названия-1772101019543 |
|---|
| simpleViewer | false |
|---|
| width | 600 |
|---|
| links | auto |
|---|
| tbstyle | top |
|---|
| diagramDisplayName | Общая схема отказоустойчивой системы ЕССМ |
|---|
| lbox | true |
|---|
| diagramWidth | 791 |
|---|
| revision | 5 |
|---|
|
Общая Стандартная схема отказоустойчивой системы представляет из себя кластер, состоящий из состоящий из трех узлов: master-, slave-, witness-ноды. Взаимодействие с WEBвеб-интерфейсом происходит при помощи VIP, находящего который находится на текущем мастере Keepalived. За состоянием баз данных PostgreSQL и Redis наблюдает узел witness и : он же переключает мастерство Repmgr и Redis Sentinel при необходимости.
| Подсказка |
|---|
| Подробнее о переключении Процесс переключения мастерства в отказоустойчивой системе представлено подробнее описан в статье разделе Переключение мастерства в отказоустойчивой системе. |
| Раскрыть |
|---|
| title | Схема отказоустойчивой системы при запуске БД на отдельном сервере |
|---|
|
Схема отказоустойчивой системы при запуске БД на отдельном сервереотдельных серверах| draw.io Diagram |
|---|
| border | true |
|---|
| |
|---|
| diagramName | Диаграмма без названия-1772101019543 |
|---|
| simpleViewer | false |
|---|
| width | 600 |
|---|
| links | auto |
|---|
| tbstyle | top |
|---|
| diagramDisplayName | Схема отказоустойчивой системы ЕССМ с разделением БД и приложения |
|---|
| lbox | true |
|---|
| diagramWidth | 1221 |
|---|
| revision | 11 |
|---|
|
Отказоустойчивая система Схема отказоустойчивой системы с запуском базы данных на отдельном сервере отдельных серверах представляет из себя совокупность двух кластеров: - Кластер приложений;
- Кластер баз данных.
Кластер баз данных включает в себя три сервера: - Master база данных PostgreSQL — база данных для всех операций;
- Slave база данных PostgreSQL — база данных для операций чтения и репликации с Master;
- Witness-нода — сервер для отслеживания состояния PostgreSQL и Redis с переключением мастерства Repmgr и Redis Sentinel по необходимости.
| Информация |
|---|
Сервис Redis находится в кластере приложений, поэтому доступ до Witness также должен быть обеспечен. |
Кластер приложений включается в себя запуск ЕССМ с использованием внешних баз данных. Для доступа к WEBвеб-интерфейсу необходимо использовать VIP, который находится на текущем мастере Keepalived. |
Подготовка серверов
Перед запуском ЕССМ в отказоустойчивой системе по любой из ранее представленных схем , необходимо подготовить конфигурационные и вспомогательные файлы.
Настройка файла .env.cluster
Перед запуском ЕССМ в отказоустойчивой системе , необходимо подготовить конфигурационный файл .env.cluster, находящийся который находится в корневой директории проектадиректории проекта.
| Подсказка |
|---|
Подробнее о назначении Назначение переменных в конфигурационном файле .env.cluster описано описано в статье разделе Инструкция по установку и запуску. |
Подготовка конфигурационного файла для запуска ЕССМ в стандартной схеме отказоустойчивой системы
Необходимо открыть файл .env.cluster на Master-ноде при помощи любого текстового редактора и для и для минимальной настройки заполнить назначить следующие переменные:
ALLOWED_HOSTS — переменная, указывающая - содержит разрешенные IP-адреса. Значение переменной должно соответствовать IP-адресам всех используемых нод;
MASTER_HOST — переменная, указывающая - содержит IP-адрес Master-ноды;
SLAVE_HOST — переменная, указывающая - — содержит IP-адрес Slave-ноды;
WITNESS_HOST — переменная, указывающая - — содержит IP-адрес Witness-ноды;
SENTINEL_MASTER_NAME — переменная, содержащая - содержит уникальное произвольное имя, присваиваемое кластеру баз данных для их мониторинга;
SENTINEL_PASSWORD — переменная, содержащая - содержит пароль, используемый службой мониторинга для подключения к кластеру баз данных и получения информации о состоянии серверов.
| Примечание |
|---|
Если не указывать указать данные переменные — база , запуск базы данных PostgreSQL на сервере не будет запущена и завершится с ошибкойзавершится с ошибкой. |
| Раскрыть |
|---|
| title | Подготовка конфигурационного файла для запуска ЕССМ при запуске БД на отдельном сервереотдельных серверах |
|---|
|
Подготовка конфигурационного файла для запуска ЕССМ при запуске БД на отдельном сервереотдельных серверахДля каждого кластера необходимо настроить конфигурационный файл по-разному. Для кластера приложений необходимо открыть файл .env.cluster на Master-ноде при помощи любого текстового редактора и для минимальной настройки заполнить назначить следующие переменные: ALLOWED_HOSTS — переменная, указывающая - содержит разрешенные IP-адреса. Значение переменной должно соответствовать IP-адресам
всем серверам- всех серверов,
участвующим - участвующих в работе отказоустойчивой системы;
MASTER_HOST — переменная, указывающая - содержит IP-адрес Master-ноды ECCM приложения;
SLAVE_HOST — переменная, указывающая - содержит IP-адрес Slave-ноды ECCM приложения;
WITNESS_HOST — переменная, указывающая - содержит IP-адрес Witness-ноды из кластера баз данных;
SENTINEL_MASTER_NAME — переменная, содержащая - содержит уникальное произвольное имя, присваиваемое кластеру баз данных для их мониторинга;
SENTINEL_PASSWORD — переменная, содержащая - содержит пароль, используемый службой мониторинга для подключения к кластеру баз данных и получения информации о состоянии серверов.
| Примечание |
|---|
Содержимое файла должно находиться на узлах кластера приложений, в ином случае система случае система не запуститься запустится в режиме резервирования. |
Для кластера баз данных необходимо открыть файл .env.cluster на Master-базе данных при помощи любого текстового редактора и для минимальной настройки заполнить назначить следующие переменные: ROLE — переменная, указывающая - содержит роль БД в кластере.
Допустимые - Допустимые значения переменной: master, slave;
ALLOWED_HOSTS — переменная, указывающая - содержит разрешенные IP-адреса. Значение переменной должно соответствовать IP-адресам всем серверам, участвующим в работе отказоустойчивой системы;
MASTER_HOST — переменная, указывающая - содержит IP-адрес Master-базы данных;
SLAVE_HOST — переменная, указывающая - содержит IP-адрес Slave-базы данных;
WITNESS_HOST — переменная, указывающая - содержит IP-адрес Witness-ноды кластера баз данных;
SENTINEL_MASTER_NAME — переменная, содержащая - содержит уникальное произвольное имя, присваиваемое кластеру баз данных для их мониторинга;
SENTINEL_PASSWORD — переменная, содержащая - содержит пароль, используемый службой мониторинга для подключения к кластеру баз данных и получения информации о состоянии серверов.
| Примечание |
|---|
Содержимое файла должно находиться на узлах кластера баз данных, в ином случае система не запуститься запустится в режиме резервирования. |
|
Синхронизация файлов конфигурации
Все конфигурационные файлы должны быть идентичные идентичны между всеми нодами кластера. Для синхронизации файлов конфигурации между серверами , можно воспользоваться утилитой утилитой rsync. Пример установки утилиты:
| Блок кода |
|---|
| language | bash |
|---|
| title | Установка rsync |
|---|
|
sudo apt install rsync |
Для передачи файлов конфигурации кластера используйте следующую команду:
| Блок кода |
|---|
| language | bash |
|---|
| title | Master-node |
|---|
|
sudo rsync -av --delete --rsync-path="sudo rsync" <полный_путь_до_директории_eccm>/.env.cluster <имя_пользователя_сервера>@<IP-адрес_сервера_назначения>:<полный_путь_до_директории_eccm> |
После выполнения команды для каждого сервера назначения , файл конфигурации будет соответствовать настроенному ранее.
| Примечание |
|---|
Для схемы с кластером БД на отдельных серверах после синхронизации проверьте ROLE на каждом узле базы данных. |
Настройка Настройка SSL/TLS для связи узлов кластера
Репликация между базами данных PostgreSQL и Redis происходит по умолчанию в безопасном режиме. Для настройки безопасности репликации необходимо настроить сертификаты шифрования. Предусмотрено как генерация Предусмотрена как генерация таких сертификатов, так и использование уже готовых.
Создание самоподписанного сертификата
В При отсутствии корпоративного сертификата , предусмотрен скрипт root-ca-generator/generate-cluster-cert.sh. Перед запуском предварительно отредактируйте файл root-ca-generator/cluster.cnf: пропишите IP-адреса всех узлов кластера в формате "IP.<№> = <IP-адрес узла>".
После этого запустите скрипт root-ca-generator/generate-cluster-cert.sh, который который сгенерирует все необходимые сертификаты и ключи в директорию cluster-cert/, а именно::
| Блок кода |
|---|
| language | bash |
|---|
| title | Master: eccm/2.6/ |
|---|
|
cd root-ca-generator && ./generate-cluster-cert.sh |
Состав директории cluster-cert/:
ca.crt — корневой CA-сертификат;cluster.crt - ca.crt — корневой CA-сертификат;
cluster.crt - — сертификат кластера, подписанный CA;
cluster.key — приватный ключ кластера.
При запуске ЕССМ будет также сгенерирован Java Truststore: Java-сервисы ECCM не читают ca.crt напрямую — они используют Java KeyStore в формате PKCS12. Сервис truststore-initer автоматически конвертирует ca.crt из cluster-cert/ в truststore.p12 и сохраняет его.
| Раскрыть |
|---|
| title | Использование корпоративного CA |
|---|
|
Использование корпоративного CAЕсли предусмотрен корпоративный CA, необходимо переместить все файлы |
...
безопасного соединения в директорию cluster-cert/ на Master-ноде, а именно: - ca.crt — корневой CA-сертификат;
- cluster.crt — сертификат кластера, подписанный CA;
- cluster.key — приватный ключ кластера.
| Информация |
|---|
При наличии файла Java Truststore | , в директорию в директорию cluster-cert/. |
| Подсказка |
|---|
Для изменения получения сертификатов и ключа измените переменные файла .env.cluster. | Подробнее о назначении |
Синхронизация сертификатов безопасности
Для синхронизации файлов из директории cluster-cert/ между узлами отказоустойчивой системы рекомендуем воспользоваться утилитой rsync. Пример установки утилиты был описан в пункте "Синхронизация файлов конфигурации".
Для передачи сертификатов кластера используйте следующую команду:
| Блок кода |
|---|
| language | bash |
|---|
| title | Master-node |
|---|
|
sudo rsync -av --delete --rsync-path="sudo rsync" <полный_путь_до_директории_eccm>/cluster-cert/* <имя_пользователя_сервера>@<IP-адрес_сервера_назначения>:<полный_путь_до_директории_eccm>/cluster-cert |
После выполнения команды для каждого сервера назначения , сертификаты на узлах будут соответствовать друг другу.
Настройка VIP
Для получения Для получения доступа к WEBвеб-интерфейсу необходимо установить утилиту Keepalived на каждой ноде с сервисами ЕССМ. Пример установки утилиты:
| Блок кода |
|---|
| language | bash |
|---|
| title | На каждой ноде приложений |
|---|
|
sudo apt install keepalived |
В директории keepalived подготовлены конфигурационные файлы для утилиты:
keepalived.conf — конфигурационный файл Keppalived- файл Keepalived, настраивающий VRRP для отказоустойчивой системы;
check_app.sh — скрипт, проверяющий состояние сервисов ЕССМ. При падении - сбое работы сервиса снижает приоритет сервера
для последующей - для последующей смены мастерства.
После установки скопируйте все конфигурационные файлы из директории keepalived/ в директорию /etc/keepalived/:
| Блок кода |
|---|
| language | bash |
|---|
| title | На каждой ноде приложений: eccm/2.6/ |
|---|
|
cp .cp <путь_до_директории_eccm>/keepalived/* /etc/keepalived/ |
Убедитесь, что у скрипта check_app.sh есть права на выполнение. Если данного права прав нет, используйте следующую команду:
| Блок кода |
|---|
| language | bash |
|---|
| title | На каждой ноде приложений |
|---|
|
chmod +x /etc/keepalived/check_app.sh |
При помощи любого текстового редактора откройте конфигурационный файл /etc/keepalived/keepalived.conf. На На сервере, где будет находиться приложение ЕССМ с ролью мастер, измените следующие параметры:
INTERFACE_NAME — сетевой интерфейс, на котором будет находится - находиться ЕССМ. Выставляется индивидуально для каждого сервера;
ROUTER_ID — идентификатор виртуального маршрутизатора, принимающий значения от 0 до 255. Одинаковый на всех серверах;PRIORITY — приоритет текущей ноды, принимающий значения от 0 до 255. Необходимо, чтобы данное значение было больше параметра weight (в стандартной
конфигурации weight = -10), - в ином случае мастерство переключаться не будет;
PASSWORD — пароль VRRP-аутентификации. Одинаковый на всех серверах;VIP_IP_ADDRESS — Виртуальный - виртуальный IP-адрес, через который будет
получаться - предоставляться доступ к
WEB- веб-интерфейсу. Одинаковый на
всех серверах- всех серверах.
Далее перейдите на сервер, где будет находится находиться приложение ЕССМ с ролью слейвSlave, и измените ранее описанные параметры.
Если необходимо, чтобы при переключении мастерства и восстановлении исходного мастера мастерство возвращалось исходному — на Master-узле выставьте приоритет на 1 больше, чем на Slave-узле. Если такая опция не нужна — установите одинаковое значение на каждом узле.
| Подсказка |
|---|
| Подробнее о переключении Процесс переключения мастерства в отказоустойчивой системе представлено описан в статье Переключение мастерства в отказоустойчивой системе. |
Рекомендуемые значения:
- Если необходимо, чтобы мастерство возвращалось исходному мастеру:
- Master-узел должен иметь приоритет 101;
- Slave-узел должен иметь приоритет 100;
- Если нет необходимости в возвращении мастерства исходному мастеру:
- На всех узлах выставить приоритет 100.
После этого запустите Keepalived на каждом узле. Пример запуска и добавления в автозагрузку:
| Блок кода |
|---|
| language | bash |
|---|
| title | На каждой ноде приложений |
|---|
|
sudo systemctl start keepalived
sudo systemctl enable keepalived |
Убедитесь, что роли между узлами были распределены, при помощи следующей помощи следующей команды:
| Блок кода |
|---|
| language | bash |
|---|
| title | На каждой ноде приложений |
|---|
|
sudo systemctl status keepalived |
В журнале вы должны увидеть Entering BACKUP STATE и Entering MASTER STATE.
Запуск ЕССМ в отказоустойчивой системе
...
при стандартной схеме
Для запуска ЕССМ в отказоустойчивой системе в стандартной схеме необходимо перейти при стандартной схеме перейдите на сервер будущего Master-узла. При помощи bashпомощи bash-скрипта произвести произведите запуск мастера с необходимыми параметрами, пример . Пример запуска:
| Блок кода |
|---|
| language | bash |
|---|
| title | Master: eccm/2.6/ |
|---|
|
./compose-tools.sh --install # установит docker, если он отсутствует в системе
./compose-tools.sh -s <MASTER_HOST> --cluster master |
После того , как мастер будет инициализирован и готов к работе, перейдите перейдите на сервер Slave-узла. При помощи bash-скрипта произвести запуск слейва произведите запуск Slave с необходимыми параметрами, пример . Пример запуска с обязательными параметрами:
| Блок кода |
|---|
| language | bash |
|---|
| title | Slave: eccm/2.6/ |
|---|
|
./compose-tools.sh --install # установит docker, если он отсутствует в системе
./compose-tools.sh -s <SLAVE_HOST> --cluster slave |
Параллельно с запуском Slave-ноды, допустим узла произведите запуск Witness-узла. Подключитесь к Witness-ноде. При помощи bash-скрипта произвести произведите запуск наблюдателя Witness с необходимыми параметрами, пример . Пример запуска с обязательными параметрами:
| Блок кода |
|---|
| language | bash |
|---|
| title | Witness: eccm/2.6/ |
|---|
|
./compose-tools.sh --install # установит docker, если он отсутствует в системе
./compose-tools.sh -s <WITNESS_HOST> --cluster witness |
После инициализации перейдите по перейдите по ранее установленному VIP-адресу в формате (имеет формат http://<VIP>/ — будет доступен WEB). Веб-интерфейс ЕССМ будет доступен.
| Раскрыть |
|---|
| title | Запуск ЕССМ в отказоустойчивой системе при запуске БД на отдельном сервереотдельных серверах |
|---|
|
Запуск ЕССМ в отказоустойчивой системе при запуске БД на отдельном сервереотдельных серверах| Примечание |
|---|
Убедитесь, что значение переменной ROLE на Master-базе данных и Slave-базе данных различается и соответствует их роли. |
Для запуска ЕССМ в отказоустойчивой системе при запуске БД на отдельном сервере необходимо перейти перейдите на сервер будущей Master-базы данных. Перейдите в директорию директорию postgres/ и запустите базу данных:: | Блок кода |
|---|
| language | bash |
|---|
| title | Master-db: eccm/2.6/ |
|---|
| ./compose-tools.sh --install # установит docker, если он отсутствует в системе
| | Блок кода |
|---|
cd postgres/
docker compose --env-file=.env --env-file=../.env.cluster -f docker-compose.cluster.yml up -d |
После того , как база данных на Master-db будет проинициализирована, перейдите на сервер Slaveсервер Slave-db. Перейдите в директорию postgres/ и запустите базу данных: | Блок кода |
|---|
| language | bash |
|---|
| title | Slave-db: eccm/2.6/ |
|---|
| ./compose-tools.sh --install # установит docker, если он отсутствует в системе
cd postgres/
docker compose --env-file=.env --env-file=../.env.cluster -f docker-compose.cluster.yml up -d |
Во время инициализации Slave-db , запустите Witness-узел, перейдя на сервер Witness-node. При помощи bash-скрипта произвести произведите запуск наблюдателя Witness с необходимыми параметрами, пример . Пример запуска с обязательными параметрами: | Блок кода |
|---|
| language | bash |
|---|
| title | Witness: eccm/2.6/ |
|---|
| ./compose-tools.sh --install # установит docker, если он отсутствует в системе
./compose-tools.sh -s <WITNESS_HOST> --cluster witness |
После полной инициализации всего кластера баз данных , перейдите на сервер Master-ECCM. При помощи bash-скрипта произвести произведите запуск мастера с необходимыми параметрами, пример . Пример запуска с обязательными параметрами: | Блок кода |
|---|
| language | bash |
|---|
| title | Master-app: eccm/2.6/ |
|---|
| ./compose-tools.sh --install # установит docker, если он отсутствует в системе
./compose-tools.sh -s <MASTER_ECCM_HOST> --cluster master --database-host <MASTER_DB_HOST> --database-port <MASTER_DB_PORT> --backup-database-host <SLAVE_DB_HOST> --backup-database-port <SLAVE_DB_PORT> |
Перейдите на сервер Slave-узла. При помощи bash-скрипта произвести произведите запуск наблюдателя Slave с необходимыми параметрами, пример . Пример запуска с обязательными параметрами: | Блок кода |
|---|
| language | bash |
|---|
| title | Slave: eccm/2.6/ |
|---|
| ./compose-tools.sh --install # установит docker, если он отсутствует в системе
./compose-tools.sh -s <SLAVE_ECCM_HOST> --cluster slave --database-host <MASTER_DB_HOST> --database-port <MASTER_DB_PORT> --backup-database-host <SLAVE_DB_HOST> --backup-database-port <SLAVE_DB_PORT> |
После инициализации перейдите по ранее установленному VIP-адресу в формате (имеет формат http://<VIP>/ — будет доступен WEB). Веб-интерфейс ЕССМ будет доступен. |