Skip to main content

Высокая доступность

Резервирование сервера приложений

Описание

Для обеспечения высокой доступности вы можете запустить несколько экземпляров сервера приложений ТехноДок на разных серверах.

  • Для каждого экземпляра сервера приложений необходимо указать его приоритет Cluster:Priority и адреса других серверов ТехноДок Cluster:ServersAddresses в файле technodoc.settings.ini.
  • В Системе может быть только один ведущий сервер и неограниченное количество ведомых серверов приложений.

Кластер серверов приложений

Кластер серверов приложений

  • Сервера приложений ТехноДок запускают процесс голосования и назначают серверу с наибольшим приоритетом роль ведущий, остальным серверам назначается роль ведомый.
    • Частота голосования определяется настройкой Cluster:PollingRate в файле technodoc.settings.ini. Значение по умолчанию - 1 минута.
    • Если в процессе голосования сервер меняет роль с ведомого на ведущего, то происходит повышение приоритета сервера на значение, равное количеству секунд, прошедших с 1 января 1970 года.
    • После того, как ведомый сервер стал ведущим, обратного переключения не произойдет до тех пор, пока новый ведущий сервер корректно функционирует.

Выбор нового ведущего сервера приложений

Выбор нового ведущего сервера приложений

  • В случае выполнения аварийного переключения пользователь будет видеть информационное окно.

Информационное окно о возникшем аварийном переключении

Информационное окно о возникшем аварийном переключении

  • Сервер приложений в роли ведущий использует настройки technodoc.settings.json из основной секции настроек.
  • Сервер приложений в ведомый использует настройки technodoc.settings.json из секции Standby.
    • Предполагается, что большая часть периодических задач (создание отчетов по расписанию, пересчет отчетов, отправка по почте и т.д.) будут работать только на основном сервере, на резервном сервере они будут простаивать.
    • Чтобы указать, что определенная настройка должна примениться только для ведомого сервера, необходимо перед настройкой добавить префикс Standby. Например, для отключения всех периодических задач, необходимо в файле technodoc.settings.ini в секции [Standby:JobScheduler] раскомментировать строку IsEnabled=false.
  • Клиентское приложений ТехноДок может отправлять запросы на чтение как ведущему серверу, так и ведомому.
    • В зависимости от настройки Cluster:RequestHandleType в technodoc.settings.json будет выбрана одна из стратегий обработки запросов на сервере с ролью ведомый:
      • Cluster:RequestHandleType=Forbid - для запросов на изменение данных (POST, PUT, DELETE) будет возвращена ошибка 405 Method Not Allowed.
      • Cluster:RequestHandleType=RedirectToPrimary - запросы на изменение данных будут перенаправлены на ведущий сервер.
      • Режим Cluster:RequestHandleType=RedirectToPrimary гарантированно поддерживается в панели Каскад. В других браузерах могут быть установлены политики безопасности, которые в настоящий момент не позволяют корректно выполнять перенаправление запросов.

Настройка

Для примера рассмотрим схему, состоящую из 2-х серверов reports.server1 (ведущий) и reports.server1 (ведомый).

Пример кластера из 2-х серверов

Пример кластера из 2-х серверов

Действия выполняемые на хосте reports.server1:
  • Открыть файл technodoc.settings.ini на хосте reports.server1.
  • В секции [Cluster] указать настройку Priority=1, что сделает данный сервер ведущим, так как это будет максимальный приоритет среди серверов в данной конфигурации.
  • В секции [Cluster] указать настройку ServersAddresses:0=http://reports.server2. Данная настройка задает адрес второго сервера для его опроса.
  • В результате настройки в секции [Cluster] на хосте reports.server1 будут выглядеть следующим образом:
[Cluster]
Priority = 1
ServersAddresses:0 = http://reports.server2

При переходе сервера в режим ведомый необходимо отключить периодические задачи чтобы избежать возможные конфликты, связанные с одновременной модификацией данных. Для этого необходимо выполнить следующие действия:

  • Открыть файл technodoc.settings.ini на хосте reports.server1.
  • Отключить задачи для ведомого сервера как показано ниже:
[Standby:Reports:Jobs:UploadReportValuesJob]                       # Задача загрузки значений отчетов
IsEnabled = False
[Standby:Reports:Jobs:ProcessReportsCreationRulesJob] # Задача создания отчетов
IsEnabled = False
[Standby:Reports:Jobs:ProcessReportsRulesJob] # Задача обработки правил отчетов
IsEnabled = False
[Standby:OperationTime:Jobs:CalculateOperationTimeJob] # Задача расчета наработки
IsEnabled = False
[Standby:Mail:Jobs:SendMailsJob] # Задача отправки почты
IsEnabled = False
[Standby:Mail:Jobs:DeleteMailsJob] # Задача удаления устаревших писем
IsEnabled = False
Действия выполняемые на хосте reports.server2:
  • Открыть файл technodoc.settings.ini на хосте reports.server2.
  • В секции [Cluster] указать настройку Priority=0, что сделает данный сервер ведомым, так как это будет минимальный приоритет среди серверов в данной конфигурации.
  • В секции [Cluster] указать настройку ServersAddresses:0=http://reports.server1. Данная настройка задает адрес второго сервера.
  • В результате, настройки в секции [Cluster] на хосте reports.server2 будут выглядеть следующим образом:
[Cluster]
Priority = 0
ServersAddresses:0 = http://reports.server1
  • Для режима ведомого сервера отключить выполнение задач как показано ниже:
[Standby:Reports:Jobs:UploadReportValuesJob]                       # Задача загрузки значений отчетов
IsEnabled = False
[Standby:Reports:Jobs:ProcessReportsCreationRulesJob] # Задача создания отчетов
IsEnabled = False
[Standby:Reports:Jobs:ProcessReportsRulesJob] # Задача обработки правил отчетов
IsEnabled = False
[Standby:OperationTime:Jobs:CalculateOperationTimeJob] # Задача расчета наработки
IsEnabled = False
[Standby:Mail:Jobs:SendMailsJob] # Задача отправки почты
IsEnabled = False
[Standby:Mail:Jobs:DeleteMailsJob] # Задача удаления устаревших писем
IsEnabled = False
  • После завершения настроек выше, надо перезагрузить оба сервера приложений ТехноДок.

Резервирование БД

ТехноДок может использовать одну из следующих СУБД для создания реплицированной БД:

  • PostgreSQL.
  • MariaDB.
  • Microsoft SQL Server.

PostgreSQL

PostgreSQL имеет несколько вариантов организации высокой доступности. Подробнее с вариантами и информацией по настройке можно ознакомиться: High Availability, Load Balancing, and Replication.

MariaDB

MariaDB поддерживает режим репликации Master-Master что позволяет вести запись данных как в основной, так и в резервный сервер БД. Ниже приведены шаги настройки репликации Master-Master.

На первом сервере:

  1. В секцию [mysqld] конфигурационного файла БД MariaDB добавить следующие настройки:
sql-mode			= "ANSI_QUOTES" 
datadir = путь к данным
server-id = 1
log-bin = bin-log
bind-address = 0.0.0.0
auto_increment_increment = 2
auto_increment_offset = 1
  1. Перезапустить службу БД MariaDB, выполнив в терминале команду: Для linux: systemctl restart mariadb Для windows: net start mariadb
  2. Установить соединение с БД MariaDB, выполнив в терминале команду: mysql -u root –p , где root – пользователь, а после ключа -p пароль (если был указан)
  3. Создать пользователя, который будет ответственен за репликацию БД MariaDB, выполнив в терминале команды: create user 'replication_user'@'%' identified by 'replication_user'; grant replication slave on *.* to 'replication_user'@'%';
  4. Проверить состояние бинарного лога, выполнив в терминале команду: show master status; Значение полей Position и File будут использоваться для конфигурации репликации на втором сервере.
|	File			|	Position 
| mariadb-bin.000001 | 314

На втором сервере:

  1. В секцию [mysqld] конфигурационного файла БД MariaDB добавить следующие настройки:
sql-mode			=	"ANSI_QUOTES"
datadir = путь к данным
server-id = 2
log-bin = bin-log
bind-address = 0.0.0.0
auto_increment_increment = 2
auto_increment_offset = 2
  1. Выполнить пункты 2-4 аналогично первому серверу.
  2. Остановить репликацию, выполнив в терминале команду: stop slave;
  3. Настраиваем репликацию, указав второму серверу, где нужно искать файл журнала: CHANGE MASTER TO MASTER_HOST='master1', MASTER_USER='replication_user', MASTER_PASSWORD='replication_user_password', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=314; где MASTER_HOST – ip первого мастера, MASTER_USER/ MASTER_PASSWORD – логин/пароль пользователя с правами репликации, которого создали ранее, MASTER_LOG_FILE и MASTER_LOG_POS - название журнала и номер позиции из пункта 5 подраздела На первом сервере соответственно.
  4. Запустить репликацию, выполнив в терминале команду: start slave;
  5. Проверить статус сервера на наличие ошибок, выполнив команду: show slave status \G Наличие числовых значений в Read_Master_Log_Pos и Relay_Log_Pos указывает, что ошибок нет.
  6. Проверить состояние бинарного лога, выполнив в терминале команду: show master status; Значение полей Position и File будут использоваться для конфигурации репликации на первом сервере.
|	File			|	Position 
| mariadb-bin.000002 | 8196

На первом сервере:

  1. Остановить репликацию, выполнив в терминале команду: stop slave;
  2. Настраиваем репликацию, указав первому серверу, где нужно искать файл журнала: CHANGE MASTER TO MASTER_HOST='server2', MASTER_USER='replication_user', MASTER_PASSWORD='replication_user_password', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=8196; где MASTER_HOST – ip второго мастера, MASTER_USER/ MASTER_PASSWORD – логин/пароль пользователя с правами репликации, которого создали ранее, MASTER_LOG_FILE и MASTER_LOG_POS - название журнала и номер позиции из пункта 7 подраздела На втором сервере соответственно.
  3. Запустить репликацию, выполнив в терминале команду: start slave;
  4. Проверить статус сервера, выполнив в терминале команду: show slave status \G Наличие числовых значений в Read_Master_Log_Pos и Relay_Log_Pos указывают, что ошибок нет. Если нет ошибок, то репликация настроена. В секции [Database] конфигурационного файла technodoc.settings.ini ТехеноДок указать корректную строку подключения к БД MariaDB и установить значение RoundRobin для ключа FailoverStrategy. При возникновении проблем с восстановлением репликации при переключении или аварийной остановки, необходимо запустить репликацию повторно, выполнив в терминале команду: start slave;
# Пример строки подключения
Type = MariaDb # Тип БД - MariaDb
ConnectionString = Server=localhost;Database=technodoc;Uid=root;Password=password # Строка соединения с БД

Microsoft SQL Server

Microsoft SQL Server имеет несколько вариантов организации высокой доступности. Подробнее с вариантами и информацией по настройке можно ознакомиться: Business continuity and database recovery - SQL Server.

Резервированный проект КАСКАД

В данном разделе описана конфигурация, состоящая из 2 резервированных серверов ТехноДок и КАСКАД. Для примера будем использовать следующие адреса:

  • reports.server1 и reports.server2 – основной и резервный сервер ТехноДок. База данных ТехноДок находится на тех же серверах. В качестве резервируемой БД может выступать MariaDB, PostgreSQL или Microsoft SQL Server.
  • kaskad.server1 и kaskad.server2 - основной и резервный сервер КАСКАД.

Схема взаимодействия ТехноДок и КАСКАД

Схема взаимодействия ТехноДок и КАСКАД

Для обмена данными между ТехноДок и КАСКАД используется протокол XMLRPC. Для отображения графического интерфейса ТехноДок используется панель с компонентом WebView. Для настройки взаимодействия ТехноДок и КАСКАД необходимо выполнить следующие действия:

  1. Настроить кластер БД ТехноДок.
  2. Настроить кластер ТехноДок.
  3. Добавить и настроить скрипты взаимодействия КАСКАД с ТехноДок в проекте КАСКАД в настроенный резервируемый проект.
  4. Добавить в ТехноДок внешнее соединение с настройками подключения для каждой из пар проекта КАСКАД.
  5. Добавить и настроить в проекте КАСКАД панель отображения ТехноДок с автоматическим выбором основного сервера.

Настройка реплицируемой БД ТехноДок

ТехноДок может использовать одну из следующих СУБД для создания реплицированной БД:

После выполнения настройки резервирования БД необходимо на каждом из серверов ТехноДок задать следующие настройки подключения:

  • Открыть файл technodoc.settings.ini на хосте reports.server1.
  • В секции [Database:Connections:Primary] раскомментировать следующие строки и указать корректные данные авторизации:
# Настройки для MariaDb
Type = MariaDb # Тип БД – MariaDb
ConnectionString=Server=reports.server1;Database=technodoc;Uid=root;Password=password # Строка соединения с БД;
# Настройки для PostgreSql
Type = PostgreSql # Тип БД – PostgreSql
ConnectionString=Server=reports.server1;Database=technodoc;User Id=postgres;Password=postgres;SearchPath=td# Строка соединения с БД;
# Настройки для Microsoft SQL Server
Type = MsSql # Тип БД – MS SQL Server
ConnectionString=Server=reports.server1;Database=technodoc;User Id=sa;Password=password # Строка соединения с БД;
  • В секции [Database:Connections: Standby] раскомментировать следующие строки и указать корректные данные авторизации:
# Настройки для MariaDb
Type = MariaDb # Тип БД – MariaDb
ConnectionString=Server=reports.server2;Database=technodoc;Uid=root;Password=password # Строка соединения с БД;
# Настройки для PostgreSql
Type = PostgreSql # Тип БД – PostgreSql
ConnectionString=Server=reports.server2;Database=technodoc;User Id=postgres;Password=postgres;SearchPath=td # Строка соединения с БД;
# Настройки для Microsoft SQL Server
Type = MsSql # Тип БД – MS SQL Server
ConnectionString=Server=reports.server2;Database=technodoc;User Id=sa;Password=password # Строка соединения с БД;
  • В секции [Database] установить настройку FailoverStrategy в значение RoundRobin (используется по умолчанию).
FailoverStrategy = RoundRobin
  • Повторить настройки в таком же порядке на сервере reports.server2.
Дополнение для PostgreSQL

Альтернативный вариант задать строку подключения к БД, в которой будут сразу указаны все сервера для подключения и приоритетная БД для подключения, за выбор БД для подключения будет отвечать драйвер, для этого:

  • Открыть файл technodoc.settings.ini на хосте reports.server1.
  • В секции [Database:Connections:Primary] раскомментировать следующие строки и указать корректные данные авторизации:
Type = PostgreSql # Тип БД – PostgreSql
ConnectionString=Server=reports.server1,reports.server2;Database=technodoc;User Id=postgres;Password=postgres;SearchPath=td;Target Session Attributes=primary # Строка соединения с БД;
  • Повторить настройки в таком же порядке на сервере reports.server2. В данном случае с помощью задания опции подключения Target Session Attributes=primary драйвер автоматически будет искать и подключаться к главной БД без необходимости явного указанию второй строки соединения.
Дополнение для Microsoft SQL Server

При выборе в качестве опции резервирования группы доступности Always On будет нужна только одна строка подключения, соответственно настройки подключения будут выглядеть следующим образом (в качестве адреса кластера для примера зададим cluster.server):

  • Открыть файл technodoc.settings.ini на хосте reports.server1.
  • В секции [Database:Connections:Primary] раскомментировать следующие строки и указать корректные данные авторизации:
Type = MsSql # Тип БД – MS SQL Server
ConnectionString=Server=cluster.server;Database=technodoc;User Id=sa;Password=password # Строка соединения с БД;
  • Повторить настройки в таком же порядке на сервере reports.server2. В данном отвечать за выбор главной БД будет настроенный кластер, в составе которого работают группы доступности.

Настройка кластера ТехноДок.

Подробная информация о работе кластера ТехноДок описана в разделе Резервирование сервера приложений. В данном разделе будет приведен пример настройки кластера.

Действия выполняемые на хосте reports.server1:
  • Открыть файл technodoc.settings.ini на хосте reports.server1.
  • В секции [Cluster] указать настройку Priority=1, что сделает данный сервер ведущим, так как это будет максимальный приоритет среди серверов в данной конфигурации.
  • В секции [Cluster] указать настройку ServersAddresses:0=http://reports.server2. Данная настройка задает адрес второго сервера для его опроса.
  • В результате настройки в секции [Cluster] на хосте reports.server1 будут выглядеть следующим образом:
[Cluster]
Priority = 1
ServersAddresses:0 = http://reports.server2

При переходе сервера в режим ведомый необходимо отключить периодические задачи чтобы избежать возможные конфликты, связанные с одновременной модификацией данных. Для этого необходимо выполнить следующие действия:

  • Открыть файл technodoc.settings.ini на хосте reports.server1.
  • Отключить задачи для ведомого сервера как показано ниже:
[Standby:Reports:Jobs:UploadReportValuesJob]                       # Задача загрузки значений отчетов
IsEnabled = False
[Standby:Reports:Jobs:ProcessReportsCreationRulesJob] # Задача создания отчетов
IsEnabled = False
[Standby:Reports:Jobs:ProcessReportsRulesJob] # Задача обработки правил отчетов
IsEnabled = False
[Standby:OperationTime:Jobs:CalculateOperationTimeJob] # Задача расчета наработки
IsEnabled = False
[Standby:Mail:Jobs:SendMailsJob] # Задача отправки почты
IsEnabled = False
[Standby:Mail:Jobs:DeleteMailsJob] # Задача удаления устаревших писем
IsEnabled = False
Действия выполняемые на хосте reports.server2:
  • Открыть файл technodoc.settings.ini на хосте reports.server2.
  • В секции [Cluster] указать настройку Priority=0, что сделает данный сервер ведомым, так как это будет минимальный приоритет среди серверов в данной конфигурации.
  • В секции [Cluster] указать настройку ServersAddresses:0=http://reports.server1. Данная настройка задает адрес второго сервера.
  • В результате, настройки в секции [Cluster] на хосте reports.server2 будут выглядеть следующим образом:
[Cluster]
Priority = 0
ServersAddresses:0 = http://reports.server1
  • Для режима ведомого сервера отключить выполнение задач как показано ниже:
[Standby:Reports:Jobs:UploadReportValuesJob]                       # Задача загрузки значений отчетов
IsEnabled = False
[Standby:Reports:Jobs:ProcessReportsCreationRulesJob] # Задача создания отчетов
IsEnabled = False
[Standby:Reports:Jobs:ProcessReportsRulesJob] # Задача обработки правил отчетов
IsEnabled = False
[Standby:OperationTime:Jobs:CalculateOperationTimeJob] # Задача расчета наработки
IsEnabled = False
[Standby:Mail:Jobs:SendMailsJob] # Задача отправки почты
IsEnabled = False
[Standby:Mail:Jobs:DeleteMailsJob] # Задача удаления устаревших писем
IsEnabled = False
  • После завершения настроек выше, надо перезагрузить оба сервера приложений ТехноДок.

Настройка обмена данными ТехноДок и КАСКАД

ТехноДок выполняет обмен данными с КАСКАД по протоколу XMLRPC. Для настройки коммуникации между ТехноДок выполните следующие действия на каждом узле из резервированной пары (подробнее об интеграции смотрите КАСКАД Цифра):

  1. Скопируйте в проект КАСКАД CONTROL скрипты из папки components/kaskad/scripts установленного экземпляра ТехноДок.
  2. В скрипте technodoc.ctl при необходимости измените порт, изменив значение переменной TECHNODOC_XMLRPC_HTTP_PORT (по умолчанию используется 8242).
  3. Добавьте новый менеджер сценариев, указав в опциях запуска скрипт technodoc.ctl.
  4. Запустите добавленный менеджер. В консоли проекта должна появиться запись XMLRPC-сервер запущен на порту ХХХХ.

Запуск скрипта взаимодействия ТехноДок и КАСКАД

Запуск скрипта взаимодействия ТехноДок и КАСКАД

Далее необходимо добавить в ТехноДок внешнее соединение:

  1. Перейти в пункт меню Внешние соединения.
  2. Добавить источник данных КАСКАД и указать 2 опции подключения с адресами до каждой резервной пары серверов КАСКАД - kaskad.server1 и kaskad.server2 (подробнее о настройке данного источника данных см. Настройки источника КАСКАД).

Настройка внешнего соединения с источником данных КАСКАД

Настройка внешнего соединения с источником данных КАСКАД

Замечание

Строки подключения можно указать в любом порядке, ТехноДок выполнит подключение к первому доступному источнику, а КАСКАД автоматически перенаправит запрос к основному серверу.

Настройка панели КАСКАД при работе ТехноДок в кластере

Для настройки подключения панели к основному экземпляру ТехноДок в кластере необходимо выполнить следующие действия:

  1. В проекте КАСКАД открыть скрипт на каждом из серверов открыть scripts\libs\Technodoc\Core\technodocServerSettings.ctl.
  2. Для переменной TECHNODOC_CLUSTER_URLS задать в виде строк список адресов (URL) экземпляров ТехноДока в кластере.
// Массив адресов серверов Технодока
dyn_string TECHNODOC_CLUSTER_URLS = makeDynString("http://reports.server1", "http://reports.server2");
  1. Если проект был запущен, то перезагрузить проект.

Теперь, при открытии панели, будет выполняться поиск и подключение к основному экземпляру ТехноДока.