3.14.4 Географическая распределенность
ECSS-10 должен корректно выбирать медиасервер. Под корректностью подразумевается уровень его загруженности (равномерное использование доступных ресурсов), а так же учет его территориального расположения (распределение с учетом географии пользователей). Уровень загрузки ресурсов вычисляется на основании данных о параметрах медиасервера (сообщение уровня загрузки CPU в каждом сообщении от MSR к SIP-серверу).
Территориальную принадлежность ECSS-10 определяет самостоятельно путем тегирования аккаунтов UA медиасервера. Служебным UA для медиасервера ставится в соответствие имя сайта (site) - географическая зона, которую может обслуживать данный контакт медиасервера. Пользовательским окончаниям и транкам так же задается географическая областью путем установки параметра site. Для проключения медиа-потока ECSS-10 использует медиасервер с сайтом минимально удаленным от целевого.
Сетка взаимопритяжений/дистанций (матрица связности) сайтов задается в конфигурации ECSS-10.
Выбор медиаресурса
- Выбор осуществляется среди зарегистрированных и активированных медиаресурсов.
- При выборе подходящего медиаресурса учитывается Zone(NID) и site.
- Сначала список доступных медиаресурсов фильтруется на основании параметра Zone(NID), затем выбирается ресурс с максимальным тяготением к site ресурса (минимальное "расстояние").
- При выборе медиаресурса для терминирующей стороны предпочтение отдается выделению точки "приземления" медиатрафика на том же медиасервере, который использовался для "приземления" медиатрафика вызывающей стороны. Если использование медиасервера вызывающей стороны невозможно (в силу отличных Zone(NID) вызывающего или вызываемого абонента), то медиаресурс терминирующей стороны выбирается по тому же алгоритму, что и для вызывающей стороны (с учетом Zone(NID) и site терминирующей стороны). Кроме того учитывается возможность проброса медиабриджа между медиасерверами вызывающей и вызываемой стороны.
Матрица связности
Матрица связности показывает расстояние между сайтами в условных единицах. Чем меньше расстояние, тем сайты ближе. Близость сайтов задает предпочтения по использованию медиаресурсов сайта для обслуживания вызова.
Вызов инициируется абонентом site1. Для обслуживания вызова система по матрице связности ищет медиаресурсы с минимальным расстоянием от сайта инициатора вызова.
Значения показывающие "расстояние" между сайтами являются условными и фактически задают стоимость использования медиаресурса выбранного сайта для обслуживания вызова от абонента.
Расстояние до медиаресурсов сайта, к которому относится абонент по умолчанию, принимается равным 0, но может быть изменено. Это сделано для того, чтобы можно было на время вывести MSR из работы, например, для обновления.
Если установлено расстояние между сайтами 0 - это означает, что медиаресурсы сайтов равноправны.
Если абонентам одного сайта необходимо запретить использовать медиаресурса другого сайта, то необходимо установить расстояние между этими сайтами равное бесконечности - infinity.
Алгоритм определения ресурсов
Алгорим который использует ядро для поиска подходящего MSR эквивалентен следующему:
- Для заданного UA пользователя (далее просто UA), который будет парковаться на MSR определяются связанные с ним параметры Zone, Site, и опционально msr_id (если информация о нем присутствует);
- Для ядра, на котором обслуживается текущий коллпроцесс выполняется поиск зарегистрированных(поле Status = registered), административно разрешенных(поле Active = true)Ч, c зоной(Zone) UA контактов MSR;
- Из найденных контактов выбираются те, которые соответствуют известному msr_id (если он все таки задан, в противном случае подходят все контакты предыдущего шага);
Далее выбранные контакты ранжируются по расстоянию между 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]
Выбираются контакты с наименьшим расстоянием;
- Контакты, полученные на предыдущем шаге, сортируем с удалением дубликатов по имени msr (поле msr_name). Получаем контакты с уникальными msr-ами. Контакты содержат информацию о загруженности msr-а и коэффициенте производительности msr-а;
- На основе контактов, полученных на предыдущем шаге, строится интервальная таблица загруженности msr с учетом коэффициента производительности:
- Верхняя граница таблицы (table_upper_bound) выставляется в 0, помещаем все контакты в очередь;
- Если очередь не пуста, то забираем контакт из очереди:
Для контакта выставляем нижнюю границу(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;
- Если контактов в списке нет, то такое плечо UA релизится с соответствующим cause(msr не найден);
- Генерируем случайное число от 0 до table_upper_bound;
- В списке находим контакт, в границы которого попадает сгенерированное число. Найденный контакт используется для парковки данного 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 регистрируют контакты со следующими параметрами:
| 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 трафиком.
Данный пример довольно простой и не иллюстрирует все способы применения заложенных возможностей и функций.
Однако базовые принципы показаны верно и их дальнейшая модификация позволит выстраивать весьма сложные схемы с территориальным тяготением голосового трафика.
Управление географическими зонами обслуживания медиасервера
declare
Команда предназначена для создания новой географической зоны (нового сайта), которую будет обслуживать медиасервер.
Имя сайта в системе должно быть уникальным. Если будет попытка создания сайта с уже используемым именем, команда вернет ошибку.
Путь команды:
/system/media/site/declare
Синтаксис:
declare <site name>
Параметры:
<site name> - имя сайта.
Пример:
admin@[mycelium1@ecss1]:/$ system/media/site/declare remote_side Site: remote_side. Created successfully. [exec at: 17.02.2019 13:15:40, exec time: 447ms, nodes: core1@ecss2]
distance
Команда предназначена для установки "расстояния" между сайтами.
По умолчанию, когда создаются сайты связность между ними задается как бесконечность (infinity).
Для установки требуемого расстояния между сайтами необходимо выполнить команду:
Путь команды:
/system/media/site/distance
Синтаксис:
distance <site name> <site name> <distance>
Параметры:
<site name> - географическая зона;
<distance> - положение сайтов относительно друг друга.
Пример:
admin@[mycelium1@ecss1]:/$ system/media/site/distance remote_1 local 64 Distance between remote_1 and local changed to: 64. [exec at: 17.02.2019 13:23:59, exec time: 125ms, nodes: core1@ecss1]
list
Команда возвращает список географических зон (сайтов), обслуживаемых медиасерверами.
По умолчанию в системе существует неудаляемый сайт "local"
Путь команды:
/system/media/site/list
Синтаксис:
list
Параметры:
Команда не содержит аргументов.
Пример:
admin@[mycelium1@ecss1]:/$ system/media/site/list List of all sites: local remote remote_1 remote_side [exec at: 17.02.2019 13:26:10, exec time: 117ms, nodes: core1@ecss2]
matrix
Команда позволяет просмотреть матрицу географических зон (сайтов), которые обслуживает медиасервер.
Для просмотра всей матрицы выполняем команду без параметров. При этом будет отображены все сайты если их число не превышает 20, если их число больше, то отображаются первые 20 (сортировка по алфавиту).
Путь команды:
/system/media/site/matrix
Синтаксис:
matrix [<site name> [<site name>]]
Параметры:
<site name> - имя сайта.
Пример:
admin@[mycelium1@ecss1]:/$ system/media/site/matrix local remote remote_1 ┌─────────────┬───┬────┬───┬────┐ │ Site-name │ # │ 1 │ 2 │ 3 │ ├─────────────┼───┼────┼───┼────┤ │ local │ 1 │ 0 │ │ 32 │ │ remote │ 2 │ │ 0 │ │ │ remote_1 │ 3 │ 32 │ │ 0 │ │ remote_side │ 4 │ │ │ │ └─────────────┴───┴────┴───┴────┘ Legend: empty distance - infinity distance between sites. [exec at: 17.02.2019 13:28:56, exec time: 85ms, nodes: core1@ecss2]
remove
Команда позволяет удалить сайт, обслуживаемый медиасервером, и всю информацию о нем.
Путь команды:
/system/media/site/remove
Синтаксис:
remove <site name>
Параметры:
<site name> - имя сайта.
Пример:
admin@[mycelium1@ecss1]:/$ system/media/site/remove remote_1 Site: remote_1. Removed successfully. [exec at: 17.02.2019 13:30:17, exec time: 100ms, nodes: core1@ecss1]
Коэффициент производительности
Для каждого медиасервера в системе можно установить нужный коэффициент производительности. При распределении медиатрафика этот коэффициент будет учитываться и нагрузка между разными медиасерверами будет делиться пропорционально данным значениям. Коэффициент(любое положительное целое или дробное число) устанавливается командой 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/.
Подписка MSR предназначена для получения информации о текущей загрузке медиасервера. Уровень чувствительности устанавливается в конфигурационном файле MSR в параметре load-delta. Данный параметр определяет относительное изменение(сравнение текущей загрузки с предыдущей) загрузки msr(от 1 до 100), при которой формируется нотификации о текущей загрузки msr(не чаще 1 раза в секунду). Коэффициент загрузки отправляется в каждое ядро посредством SIP PUBLISH с Event eltex-load-sensor, в Body находится текущая загрузка msr.
Пример файла конфигурации:
<?xml version="1.0" encoding="utf-8"?>
<config date="20:05:00 09.07.2019">
<general log-level="3" log-rotate="yes" max-calls="8192" max-in-group="512" load-sensor="media" load-delta="10"
spool-dir-size="100M"
log-name="msr.log"
log-path="/var/log/ecss/media-server" />
<transport bind-addr="192.168.2.21" port="5040" transport="udp+tcp" />
<media mixer-clock-rate="8000" use-vad="no" cng-level="0" jb-size="60"
rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="1024"
tias-in-sdp="no" thread-cnt="2" silence-threshold="-30" dtmf-flash-disable="no"
video-dscp="0" other-dscp="0"
dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="1280" video-enc-height="720" />
<codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" g729="0" speex="0" l16="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0" />
<accounts>
<dynamic msr_name="msr_1" realm="sip:192.168.2.21:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password" />
<dynamic msr_name="msr_1" realm="sip:192.168.2.22:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password" />
</accounts>
<pbyte>
<mcc bind-addr="192.168.2.21" port="5700" />
</pbyte>
</config
set
Команда предназначена для управления подписками о загрузке медиасервера.
Путь команды:
/system/media/msr/subscription/set
Синтаксис:
set <msr> <event> <property> <value>
Параметры:
- <msr> - имя MSR;
- <event> - eltex-call-count, имя события;
- <property> - active - boolean, включить/выключить подписку;
- expires - время жизни подписки, от 30 до 3600 сек.;
- <value> - значение, в соответствии с форматом.
Пример:
admin@ds1@ecss1:/$ system/media/msr/subscription/set msr_1 eltex-call-count expires 30 msr msr_1 event eltex-call-count set expires from 60 to 30 [exec at: 14.05.2019 23:12:23, exec time: 184ms, nodes: core1@ecss1
list
Команда для просмотра информации о состоянии подписки о загрузке медиасервера.
Путь команды:
/system/media/msr/subscription/list
Синтаксис:
list
Параметры:
- MSR - имя MSR;
- Is MSR registered? - зарегистрирован MSR или нет;
- Event - Подписка на событие;
- Active - активность;
- Expires - время жизни подписки;
- Notify - получено уведомлений;
- Timestamp - время получения уведомления;
- Event id - ID события;
- Status - статус подписки.
Пример:
admin@ds1@ecss1:/$ system/media/msr/subscription/list Subscriptions on msr ┌───────┬─────────────┬──────────────────┬────────┬─────────┬────────┬─────────────────────┬──────────────────┬────────┐ │ MSR │ Is MSR │ Event │ Active │ Expires │ Notify │ Timestamp │ Event id │ Status │ │ │ registered? │ │ │ │ │ │ │ │ ├───────┼─────────────┼──────────────────┼────────┼─────────┼────────┼─────────────────────┼──────────────────┼────────┤ │ msr_1 │ true │ eltex-call-count │ true │ 30 │ 0 │ 2019/05/14 23:16:34 │ 0615cfa9332fdbbd │ active │ │ msr_2 │ true │ eltex-call-count │ true │ 30 │ 0 │ 2019/05/14 23:16:31 │ 0615cfa9f704d743 │ active │ └───────┴─────────────┴──────────────────┴────────┴─────────┴────────┴─────────────────────┴──────────────────┴────────┘ [exec at: 14.05.2019 23:16:36, exec time: 58ms, nodes: core1@ecss1