ECSS-10 должен корректно выбирать медиасервер. Под корректностью подразумевается уровень его загруженности (равномерное использование доступных ресурсов), а так же учет его территориального расположения (распределение с учетом географии пользователей). Уровень загрузки ресурсов вычисляется на основании данных о параметрах медиасервера (сообщение уровня загрузки CPU в каждом сообщении от MSR к SIP-серверу).

Территориальную принадлежность ECSS-10 определяет самостоятельно путем тегирования аккаунтов UA медиасервера. Служебным UA для медиасервера ставится в соответствие имя сайта (site) - географическая зона, которую может обслуживать данный контакт медиасервера. Пользовательским окончаниям и транкам так же задается географическая областью путем установки параметра site. Для проключения медиа-потока ECSS-10 использует медиасервер с сайтом минимально удаленным от целевого.
Сетка взаимопритяжений/дистанций (матрица связности) сайтов задается в конфигурации ECSS-10.

Выбор медиаресурса

  1. Выбор осуществляется среди зарегистрированных и активированных медиаресурсов.
  2. При выборе подходящего медиаресурса учитывается Zone(NID) и site.
  3. Сначала список доступных медиаресурсов фильтруется на основании параметра Zone(NID), затем выбирается ресурс с максимальным тяготением к site ресурса (минимальное "расстояние").
  4. При выборе медиаресурса для терминирующей стороны предпочтение отдается выделению точки "приземления" медиатрафика на том же медиасервере, который использовался для "приземления" медиатрафика вызывающей стороны. Если использование медиасервера вызывающей стороны невозможно (в силу отличных Zone(NID) вызывающего или вызываемого абонента), то медиаресурс терминирующей стороны выбирается по тому же алгоритму, что и для вызывающей стороны (с учетом Zone(NID) и site терминирующей стороны). Кроме того учитывается возможность проброса медиабриджа между медиасерверами вызывающей и вызываемой стороны.

Матрица связности

Матрица связности показывает расстояние между сайтами в условных единицах. Чем меньше расстояние, тем сайты ближе. Близость сайтов задает предпочтения по использованию медиаресурсов сайта для обслуживания вызова.

Пример
Вызов инициируется абонентом site1. Для обслуживания вызова система по матрице связности ищет медиаресурсы с минимальным расстоянием от сайта инициатора вызова.
Значения показывающие "расстояние" между сайтами являются условными и фактически задают стоимость использования медиаресурса выбранного сайта для обслуживания вызова от абонента.
Расстояние до медиаресурсов сайта, к которому относится абонент по умолчанию, принимается равным 0, но может быть изменено. Это сделано для того, чтобы можно было на время вывести MSR из работы, например, для обновления. 
Если установлено расстояние между сайтами 0 - это означает, что медиаресурсы сайтов равноправны.
Если абонентам одного сайта необходимо запретить использовать медиаресурса другого сайта, то необходимо установить расстояние между этими сайтами равное бесконечности - infinity.

Алгоритм определения ресурсов

Алгорим который использует ядро для поиска подходящего MSR эквивалентен следующему:

  1. Для заданного UA пользователя (далее просто UA), который будет парковаться на MSR определяются связанные с ним параметры Zone, Site, и опционально msr_id (если информация о нем присутствует);
  2. Для ядра, на котором обслуживается текущий коллпроцесс выполняется поиск зарегистрированных(поле Status = registered), административно разрешенных(поле Active = true)Ч, c зоной(Zone) UA контактов MSR;
  3. Из найденных контактов выбираются те, которые соответствуют известному msr_id (если он все таки задан, в противном случае подходят все контакты предыдущего шага);
  4. Далее выбранные контакты ранжируются по расстоянию между 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]

    Выбираются контакты с наименьшим расстоянием;

  5. Контакты, полученные на предыдущем шаге, сортируем с удалением дубликатов по имени msr (поле msr_name). Получаем контакты с уникальными msr-ами. Контакты содержат информацию о загруженности msr-а и коэффициенте производительности msr-а;
  6. На основе контактов, полученных на предыдущем шаге, строится интервальная таблица загруженности msr с учетом коэффициента производительности:
    1. Верхняя граница таблицы (table_upper_bound) выставляется в 0, помещаем все контакты в очередь;
    2. Если очередь не пуста, то забираем контакт из очереди:
      • Для контакта выставляем нижнюю границу(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


      • Кладем контакт в список;
      • Переход к пункту 6.2;
    3. Если контактов в списке нет, то такое плечо UA релизится с соответствующим cause(msr не найден);
    4. Генерируем случайное число от 0 до table_upper_bound;
    5. В списке находим контакт, в границы которого попадает сгенерированное число. Найденный контакт используется для парковки данного UA на MSR.

Пример с 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 регистрируют контакты со следующими параметрами:

namezonesitemsr_id
msr1_eth0rtkr_kalininsky1
msr1_eth1mtsr_kalininsky1
msr2_eth0rtkr_sovetsky2
msr2_eth1mtsr_sovetsky2
msr3_eth0rtkr_kirovsky3
msr3_eth1mtsr_kirovsky3

Имеющаяся следующую матрицу связности:

Site-named123456
r_kalininsky10




r_sovetsky2
0



r_kirovsky3

0


okrujnaya41320

molodeji5312
0
titova6221

0

Абонент UA1 хочет установить разговор с абонентом UA2, при этом они имеют следующие параметры:

UAzonesite
ua1rtkokrujnaya
ua2mtsmolodeji

Сначала паркуется плечо UA1.
Из списка активных контактов MSR выбираем все, которые принадлежат зоне rtk:

namezonesitemsr_id
msr1_eth0rtkr_kalininsky1
msr2_eth0rtkr_sovetsky2
msr3_eth0rtkr_kirovsky3

Список контактов остается прежним.
Вычисляем расстояние между ua site: okrujnaya и сайтом каждого из контактов. Имеем:

distancenamezonesitemsr_id
1msr1_eth0rtkr_kalininsky1
2msr3_eth0rtkr_kirovsky3
3msr2_eth0rtkr_sovetsky2

Контакты ранжированы в порядке увеличения дистанции. Берем первый из них и используем его для парковки UA1:
name: msr1_eth0, msr_id:1

Парковка второго плеча: ua2.
Он принадлежит другой зоне, поэтому список контактов после выбора по зоне будет выглядеть так:

namezonesitemsr_id
msr1_eth1mtsr_kalininsky1
msr2_eth1mtsr_sovetsky2
msr3_eth1mtsr_kirovsky3

На предыдущем шаге у нас определен msr_id=1.

С учетом msr_id получаем новый список контактов:

namezonesitemsr_id
msr1_eth1mtsr_kalininsky1

Далее вычисляем расстояние между ua2 site: molodeju и r_kalininsky.

distancenamezonesitemsr_id
1msr1_eth1mtsr_kalininsky1

В текущем примере используется довольно простая схема с 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/.