Распределенность медиасервера обеспечивает следующие возможности:
Для функционирования схемы система ECSS-10 должна обладать информацией о доступных ей медиасерверах и их возможностях. Механизм медиасерверов, используемых для обнаружения, должен быть динамическим, автоматически подстраиваться к изменениям параметров сети, реагировать на появление/исчезновение медиасервера/ECSS-10.
Используемая схема обнаружения и информирования о статусе/возможностях медиасерверов основана на стандартной SIP-регистрации (метод SIP REGISTER). В данном сообщении в ядро ECSS-10 передается вся необходимая служебная информация.
Согласно типовой схемы, подключения к ECSS-10 осуществляется в разных VLAN. Задача ECSS-10 обеспечить коммутацию медиапотоков между абонентами этих VLAN. Для коммутации медиапотоков между абонентами одного VLAN терминация трафика на медиаресурсе ECSS-10 (медиасервере) не является обязательной. Для абонентов разных VLAN необходимо:
На рисунке 1 указаны требования к функционалу медиасервера по формированию точки приема медиатрафика во всех VLAN, которые заведены на него.

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

Рисунок 2
ECSS-10 должен корректно выбирать медиасервер. Под корректностью подразумевается уровень его загруженности (равномерное использование доступных ресурсов), а так же учет его территориального расположения (распределение с учетом географии пользователей). Уровень загрузки ресурсов вычисляется на основании данных о параметрах медиасервера (сообщение уровня загрузки CPU в каждом сообщении от MSR к SIP-серверу).
Территориальную принадлежность ECSS-10 определяет самостоятельно путем тегирования аккаунтов UA медиасервера. Служебным UA для медиасервера ставится в соответствие имя сайта (site) - географическая зона, которую может обслуживать данный контакт медиасервера. Пользовательским окончаниям и транкам так же задается географическая областью путем установки параметра site. Для проключения медиа-потока ECSS-10 использует медиасервер с сайтом минимально удаленным от целевого.
Сетка взаимопритяжений/дистанций (матрица связности) сайтов задается в конфигурации ECSS-10.
Матрица связности показывает расстояние между сайтами в условных единицах. Чем меньше расстояние, тем сайты ближе. Близость сайтов задает предпочтения по использованию медиаресурсов сайта для обслуживания вызова.
| Пример Вызов инициируется абонентом site1. Для обслуживания вызова система по матрице связности ищет медиаресурсы с минимальным расстоянием от сайта инициатора вызова. Значения показывающие "расстояние" между сайтами являются условными и фактически задают стоимость использования медиаресурса выбранного сайта для обслуживания вызова от абонента. Расстояние до медиаресурсов сайта, к которому относится абонент по умолчанию, принимается равным 0, но может быть изменено. Это сделано для того, чтобы можно было на время вывести MSR из работы, например, для обновления. Если установлено расстояние между сайтами 0 - это означает, что медиаресурсы сайтов равноправны. Если абонентам одного сайта необходимо запретить использовать медиаресурса другого сайта, то необходимо установить расстояние между этими сайтами равное бесконечности - infinity. |
Алгорим который использует ядро для поиска подходящего MSR эквивалентен следующему:
Далее выбранные контакты ранжируются по расстоянию между site UA и site самого контакта в соответствии с матрицей связанности:
admin@[restfs1@IBM]:/$ system/media/site/matrix ┌───────────┬───┬────┬────┬────┬───┐ │ Site-name │ # │ 1 │ 2 │ 3 │ 4 │ ├───────────┼───┼────┼────┼────┼───┤ │ local │ 1 │ 0 │ 10 │ 20 │ │ │ site_102 │ 2 │ 10 │ │ │ │ │ site_103 │ 3 │ 20 │ │ │ │ │ site_104 │ 4 │ │ │ │ 0 │ └───────────┴───┴────┴────┴────┴───┘ Legend: empty distance - infinity distance between sites. [exec at: 02.08.2017 12:19:55, exec time: 19ms, nodes: core2@IBM] |
Выбираются контакты с наименьшим расстоянием;
Для контакта выставляем нижнюю границу(con_bottom_bound) по формуле:
con_bottom_bound = table_upper_bound |
Для контакта формируем верхнюю границу(con_upper_bound) по формуле:
(100 - con_msr_load) * con_msr_performance_coefficient |
Выставляем верхнюю границу таблицы(table_upper_bound) по формуле:
table_upper_bound = table_upper_bound + con_upper_bound |
Пример с 5 шага:
Шаг 5: Есть контакты con_1@msr_1, con_2@msr_1, con_1@msr_2, con_1@msr_3. Шаг 6: Есть контакты con_1@msr_1, con_1@msr_2, con_1@msr_3. msr_1 загружен на 55%, коэф. производительности 1.0. msr_2 загружен на 40%, коэф. производительности 0.9. msr_3 загружен на 60%, коэф. производительности 1.2. Шаг 6.1 table_upper_bound = 0, queue = [con_1@msr_1, con_1@msr_2, con_1@msr3] Шаг 6.2 take from queue = con_1@msr_1 Шаг 6.2.1 con_bottom_bound = 0 Шаг 6.2.2 con_upper_bound = (100 - 55) * 1.0 = 45 Шаг 6.2.3 table_upper_bound = 0 + 45 = 45 Шаг 6.2.4 put to list = con_1@msr_1(0-45) Шаг 6.3 переход на шаг 4.2 Шаг 6.2 take from queue = con_1@msr_2 Шаг 6.2.1 con_bottom_bound = 45 Шаг 6.2.2 con_upper_bound = (100 - 40) * 0.9 = 56 Шаг 6.2.3 table_upper_bound = 45 + 56 = 101 Шаг 6.2.4 put to list = con_1@msr_2(45-101) Шаг 6.2 take from queue = con_1@msr_3 Шаг 6.3 переход на шаг 6.2 Шаг 6.2.1 con_bottom_bound = 101 Шаг 6.2.2 con_upper_bound = (100 - 60) * 1.2 = 48 Шаг 6.2.3 table_upper_bound = 101 + 48 = 149 Шаг 6.2.4 put to list = con_1@msr_3(101-149) Шаг 6.4 list = [con_1@msr_1(0-45), con_1@msr_2(45-101), con_1@msr_3(101-149)] generate 58 Шаг 6.5 found con_1@msr_2(45-101) |
Найден контакт con_1@msr_2 (msr c именем msr_2).
MSR регистрируют контакты со следующими параметрами:
| name | zone | site | msr_id |
| msr1_eth0 | rtk | r_kalininsky | 1 |
| msr1_eth1 | mts | r_kalininsky | 1 |
| msr2_eth0 | rtk | r_sovetsky | 2 |
| msr2_eth1 | mts | r_sovetsky | 2 |
| msr3_eth0 | rtk | r_kirovsky | 3 |
| msr3_eth1 | mts | r_kirovsky | 3 |
Имеющаяся следующую матрицу связности:
| Site-name | d | 1 | 2 | 3 | 4 | 5 | 6 |
| r_kalininsky | 1 | 0 | |||||
| r_sovetsky | 2 | 0 | |||||
| r_kirovsky | 3 | 0 | |||||
| okrujnaya | 4 | 1 | 3 | 2 | 0 | ||
| molodeji | 5 | 3 | 1 | 2 | 0 | ||
| titova | 6 | 2 | 2 | 1 | 0 |
Абонент UA1 хочет установить разговор с абонентом UA2, при этом они имеют следующие параметры:
| UA | zone | site |
| ua1 | rtk | okrujnaya |
| ua2 | mts | molodeji |
Сначала паркуется плечо UA1.
Из списка активных контактов MSR выбираем все, которые принадлежат зоне rtk:
| name | zone | site | msr_id |
| msr1_eth0 | rtk | r_kalininsky | 1 |
| msr2_eth0 | rtk | r_sovetsky | 2 |
| msr3_eth0 | rtk | r_kirovsky | 3 |
Список контактов остается прежним.
Вычисляем расстояние между ua site: okrujnaya и сайтом каждого из контактов. Имеем:
| distance | name | zone | site | msr_id |
| 1 | msr1_eth0 | rtk | r_kalininsky | 1 |
| 2 | msr3_eth0 | rtk | r_kirovsky | 3 |
| 3 | msr2_eth0 | rtk | r_sovetsky | 2 |
Контакты ранжированы в порядке увеличения дистанции. Берем первый из них и используем его для парковки UA1:
name: msr1_eth0, msr_id:1
Парковка второго плеча: ua2.
Он принадлежит другой зоне, поэтому список контактов после выбора по зоне будет выглядеть так:
| name | zone | site | msr_id |
| msr1_eth1 | mts | r_kalininsky | 1 |
| msr2_eth1 | mts | r_sovetsky | 2 |
| msr3_eth1 | mts | r_kirovsky | 3 |
На предыдущем шаге у нас определен msr_id=1.
С учетом msr_id получаем новый список контактов:
| name | zone | site | msr_id |
| msr1_eth1 | mts | r_kalininsky | 1 |
Далее вычисляем расстояние между ua2 site: molodeju и r_kalininsky.
| distance | name | zone | site | msr_id |
| 1 | msr1_eth1 | mts | r_kalininsky | 1 |
В текущем примере используется довольно простая схема с MSR, поэтому для представленных условий у нас остался лишь один контакт.
Его и используем для парковки ua2.
Так как оба плеча сумели запарковаться на MSR, абоненты смогут обмениваться rtp трафиком.
Данный пример довольно простой и не иллюстрирует все способы применения заложенных возможностей и функций.
Однако базовые принципы показаны верно и их дальнейшая модификация позволит выстраивать весьма сложные схемы с территориальным тяготением голосового трафика.
Для каждого медиасервера в системе можно установить нужный коэффициент производительности. При распределении медиатрафика этот коэффициент будет учитываться и нагрузка между разными медиасерверами будет делиться пропорционально данным значениям. Коэффициент(любое положительное целое или дробное число) устанавливается командой system/media/msr/set.
Примеры:
Установить для msr_1 коэффициент производительности 2
system/media/msr/set msr_1 performance_coefficient 2 msr msr_1 set performance_coefficient from 1.0 to 2 [exec at: 21.07.2019 21:37:08, exec time: 102ms, nodes: core1@ecss1] |
Просмотр:
admin@mycelium1@ecss1:/$ system/media/msr/list Auto declared media server list specific: ┌───────┬─────────────┐ │ Name │ Performance │ │ │ coefficient │ ├───────┼─────────────┤ │ msr_1 │ 2.0 │ │ msr_2 │ 1.0 │ └───────┴─────────────┘ [exec at: 21.07.2019 21:37:12, exec time: 11ms, nodes: core1@ecss1] |
Также данные значения можно увидеть при выводе списка медиаресурсов:
admin@mycelium1@ecss1:/$ system/media/resource/list active Active media resource selected list specific: ┌─────────────┬───────┬────────────┬───────────┬──────┬────────┬───────────┬────────────┬───────────────────┬─────────┬──────────────┬────────┬─────────┬───────┬───────────────┬────────────┬─────────┐ │ Node │ MSR │ MSR │ MSR │ MSR │ Cc-id │ Cc-status │ Cc-uptime │ Cc-address │ Iface │ Iface │ Active │ Zone │ Site │ Contact │ Status │ Expired │ │ │ │ version │ perf coef │ load │ │ │ │ │ name │ addr │ │ │ │ │ │ │ ├─────────────┼───────┼────────────┼───────────┼──────┼────────┼───────────┼────────────┼───────────────────┼─────────┼──────────────┼────────┼─────────┼───────┼───────────────┼────────────┼─────────┤ │ core1@ecss1 │ msr_1 │ 3.14.0.156 │ 2.0 │ 0 │ 22abcd │ connected │ 1 12:01:16 │ 192.168.2.21:5700 │ bond1.2 │ 192.168.2.21 │ true │ default │ local │ bond1.2@msr_1 │ registered │ 58 │ │ │ msr_2 │ 3.14.0.156 │ 1.0 │ 0 │ c5b9d8 │ connected │ 12:01:10 │ 192.168.2.22:5700 │ bond1.2 │ 192.168.2.22 │ true │ default │ local │ bond1.2@msr_2 │ registered │ 57 │ └─────────────┴───────┴────────────┴───────────┴──────┴────────┴───────────┴────────────┴───────────────────┴─────────┴──────────────┴────────┴─────────┴───────┴───────────────┴────────────┴─────────┘ [exec at: 21.07.2019 21:51:27, exec time: 13ms, nodes: core1@ecss1] |
Механизм информирования ядра о степени загруженности MSR реализован через подписки. Команды по управлению такими подписками приведены справочнике команд CLI - /system/media/msr/subscription/.