Иерархия инстансов
Общие положения
Иерархия инстансов представляет собой одноуровневую иерархическую структуру, на верхнем уровне которого расположен главный (master) инстанс, на нижнем располагаются дочерние (child) инстансы.
Основные правила работы иерархии инстансов:
- На master от child передаются следующие данные:
- метаданные (объект, рубрика, контроллер, типовая конфигурация, устройства, измеряемые и вычисляемые параметры, поправки к измеряемым параметрам на контроллере, а также вспомогательные справочники, которые создаются при их отсутствии на master);
- измерения (значения измеряемых и вычисляемых параметров на контроллере);
- события (доступность контроллеров, устройств, результаты выполнения команд отправленных с master);
- От master на child передаются только команды управления ручным режимом и установки значений измеряемому параметру;
- На master настраиваются свои функции контроля параметров;
- На master, на полученные объекты распространяются права пользователей, установленные для компании в которую передается объект с child.
Иерархия инстансов построена на передачи jms сообщений между инстансами master и child c использованием брокера Artemis и его расширения Federation.
Artemis и его расширение Federation обеспечивают всю маршрутизацию сообщений и их доставку между удаленными узлами.
Настройка очередей
На каждом инстансе, которые участвуют в иерархии добавить следующие очереди:
<address name="jms.queue.HierarchyExport">
<anycast>
<queue name="jms.queue.HierarchyExport"/>
</anycast>
</address>
<address name="jms.queue.HierarchyMeasure">
<multicast>
<queue name="jms.queue.HierarchyMeasure"/>
</multicast>
</address>
<address name="jms.queue.HierarchyMetaData">
<multicast>
<queue name="jms.queue.HierarchyMetaData"/>
</multicast>
</address>
<address name="jms.queue.HierarchyEvent">
<multicast>
<queue name="jms.queue.HierarchyEvent"/>
</multicast>
</address>
<address name="jms.queue.HierarchyCommand">
<multicast>
<queue name="jms.queue.HierarchyCommand"/>
</multicast>
</address>Типы, назначение адресов и очередей:
HierarchyExport - anycast, используется для передачи сообщения о необходимости отправить метаданные по объекту на master;
HierarchyMeasure, HierarchyMetaData, HierarchyEvent - multicast, на child для отправки данных на master;
HierarchyCommand - multicast, для отправки команд ;
Очереди добавляются для модулей:
engine;
periodic;
rest-services.
Настройка модуля engine
Engine выполняет основные функции иерархии.
Функции выполняемые на child:
- подготовка и отправка сообщений в очередь метаданных;
- подготовка и отправка сообщений в очередь измерений;
- подготовка и отправка сообщений в очередь событий;
- прием и разбор сообщений о командах с главного инстанса;
- отправка результатов выполнения команд с главного инстанса.
Функции выполняемые на master:
- прием и обработка сообщений из очереди метаданных;
- прием и обработка сообщений из очереди измерений;
- прием и обработка сообщений из очереди событий;
- прием и разбор сообщений о командах с главного инстанса;
- прием и обработка сообщений о результатах выполнения команд на дочернем инстансе.
В конфигурационный файл engine необходимо добавить следующие очереди (на master и child):
hierarchyexport:
destination: jms.queue.HierarchyExport
concurrency: 1-8
hierarchymetadata:
destination: jms.topic.HierarchyMetaData
hierarchymeasure:
destination: jms.topic.HierarchyMeasure
hierarchyevent:
destination: jms.topic.HierarchyEvent
hierarchycommand:
destination: jms.topic.HierarchyCommandИнфо
Так как HierarchyMetaData, HierarchyMeasure, HierarchyEvent, HierarchyCommand имеют тип multicast, то в конфиге они описываются, как jms.topic., хотя в конфигурации Artemis они имеют префикс jms.queue
Настройка модуля periodic
Компонент выполняет свои функции только на child. Один раз в час (каждая 7 минута часа) выбираются все объекты которые настроены на передачу данных по иерархии, и для всех таких объектов отправляется сообщение в очередь для sem-engine для отправки метаданных. Тем самым обеспечивается синхронизация изменений в метаданных с дочернего инстанса на главный.
В конфигурационный файл periodic необходимо добавить следующие очереди (на master и child) :
hierarchyexport:
destination: jms.queue.HierarchyExport
concurrency: 1-8
hierarchymetadata:
destination: jms.topic.HierarchyMetaData
hierarchymeasure:
destination: jms.topic.HierarchyMeasure
hierarchyevent:
destination: jms.topic.HierarchyEvent
hierarchycommand:
destination: jms.topic.HierarchyCommandНастройка модуля rest-services
Компонент обеспечивает выполнение команд ручного управления и установки значения на мастере с отправкой этих данных на соответствующий child.
В конфигурационный файл periodic необходимо добавить следующие очереди (на master и child) :
hierarchyexport:
destination: jms.queue.HierarchyExport
concurrency: 1-8
hierarchycommand:
destination: jms.topic.HierarchyCommandНастройка Federation
Узел Child
На каждом узле child прописываем коннектор master-узла.
<!-- Connectors -->
<connectors>
<connector name="netty-connector">tcp://child1:61616</connector>
<connector name="master-connector">tcp://master:61616</connector>
</connectors>где child1 - dns имя child узла,
master - dns имя master узла.
Узел Master
Прописываем коннекторы на все узлы child.
<!-- Connectors -->
<connectors>
<connector name="netty-connector">tcp://localhost:61616</connector>
<connector name="child1-connector">tcp://child1:61616?ackBatchSize=100&consumerWindowSize=-1</connector>
<connector name="master-connector">tcp://master:61616</connector>
</connectors>где child1 - dns имя child узла,
master - dns имя master узла.
Инфо
Если в иерархии инстансов используется несколько дочерних инстансов, тогда все они должны быть заданы в списке подключений
Примечание
Для всех дочерних коннекторов важно задавать ?ackBatchSize=100&consumerWindowSize=-1 - определяет возможность передачи больших сообщений
В конфигурацию очередей брокера Artemis должны быть добавлены настройки конфигурации федерации адресов:
<!-- Federation -->
<federations>
<federation name="hierarchy-federation" user="artemis" password="SuperHot">
<upstream name="master-upstream">
<circuit-breaker-timeout>1000</circuit-breaker-timeout>
<share-connection>true</share-connection>
<static-connectors>
<connector-ref>child1-connector</connector-ref>
</static-connectors>
<policy ref="policyChild"/>
</upstream>
<downstream name="master-downstream">
<circuit-breaker-timeout>1000</circuit-breaker-timeout>
<share-connection>true</share-connection>
<static-connectors>
<connector-ref>child1-connector</connector-ref>
</static-connectors>
<policy ref="policyMaster"/>
<upstream-connector-ref>master-connector</upstream-connector-ref>
</downstream>
<address-policy name="policyChild" auto-delete="false" auto-delete-message-count="-1">
<include address-match="HierarchyMetaData" />
<include address-match="HierarchyMeasure" />
<include address-match="HierarchyEvent" />
</address-policy>
<address-policy name="policyMaster" auto-delete="false" auto-delete-message-count="-1">
<include address-match="HierarchyCommand" />
</address-policy>
</federation>
</federations>Если в иерархии инстансов используется несколько дочерних инстансов связанных с master, тогда все они должны быть заданы в списке подключений <static-connectors> для <upstream name="master-upstream">.
Если на дочерних инстансах используются уникальные dns-имена master узла, то для каждого child-узла в конфигурацию вносится отдельная секция <downstream name="master-downstream">.
Если на всех дочерних имя коннектора одно, тогда достаточно в <static-connectors> для <downstream name="master-downstream"> перечислить все дочерние подключения
Примечание
В настройках правил федерации адресов auto-delete="false" auto-delete-message-count="-1" устанавливает, что если сервер, которому предназначены сообщения не доступен (например, master), то сообщения, отправляемые по федерации, будут храниться на источнике (в примере это child) пока не восстановится подключение (к master), и сообщения не передадутся на сервер назначения. При длительных потерях связи и большом потоке данных между инстансами данная настройка может требовать значительный объем дискового пространства для Artemis.
При необходимости, данными параметрами и параметром auto-delete-delay, можно настроить хранение определенного объема сообщений.
Настройка на инстансе Master
Зайдите под системной учетной записью в раздел Мастер инстансов. Зарегистрируйте child инстанс.
Инфо
Для регистрации child инстанса требуется его GUID. Возьмите его на child-инстансе в разделе Компании. Каждая компания имеет свой уникальный GUID.
Настройка на инстансе Child
На форме объектов отметьте чекбокс Участник иерархии. Это будет признаком необходимости включить данный объект в схему иерархии и передать данные, описанные выше, на master.
Для объекта, который отмечен как объект схемы иерархии, выберите параметры, которые будут передаваться на master. Для этого на параметре, либо групповой операции над параметрами, отметьте чек-бокс Участник иерархии.
В таких случаев, на master уйдут измерения только отмеченных параметров.