Рассмотрим добавление еще одного или нескольких MSR, для распределения медиа трафика на 3 хоста и более, для высоко нагруженных систем /для приземления RTP трафика на локальном сайте в распределенных системах.
Требования к ОС/дополнительным пакетам, соответствуют требованиям ECSS10.
Установка MSR
Для работы MSR на отдельном хосте потребуются следующие пакеты с сайта Элтекс:
- ecss-dns-env
- ecss-media-server
Для этого необходимо добавить репозиторий ELTEX:
sudo sh -c "echo 'deb [arch=amd64] http://archive.eltex.org/ssw/jammy/3.14 stable main extras external' > /etc/apt/sources.list.d/eltex-ecss10-stable.list"
Далее необходимо выполнить импорт ключа командой:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 33CB2B750F8BB6A5
Перед началом установки необходимо обновить ОС:
sudo apt update
Если вы видите такое сообщение системы:
W: http://archive.eltex.org/ssw/jammy/3.14/dists/unstable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
Выполните следующую команду:
sudo cp /etc/apt/trusted.gpg /etc/apt/trusted.gpg.d
sudo apt update
sudo apt upgrade
Устанавливаем пакет "ecss-dns-env"
sudo apt install ecss-dns-env
Настройщик предложит выбрать разделы для настройки по вопросам ниже. Нужно выбрать broker, restfs и mysql. (на все вопросы указать "mysql vrrp адрес" ECSS10, для примера 10.0.10.10 )
| Вопрос ecss-dns-env | ответы |
|---|---|
| [Primary broker] Введите адрес: | 10.0.10.10 (необходимо ввести) |
| [Secondary broker] Введите адрес: | 10.0.10.10 (необходимо ввести) |
| [Mysql] Введите адрес: | 10.0.10.10 (необходимо ввести) |
| [Restfs] Введите адрес: | 10.0.10.10 (необходимо ввести) |
В случае необходимости можно скорректировать командой:
sudo dpkg-reconfigure ecss-dns-env
Проверка:
ping -c1 cocon.mysql.ecss ping -c1 dialer.mysql.ecss ping -c1 statistics.mysql.ecss ping -c1 tc.mysql.ecss ping -c1 tts.mysql.ecss ping -c1 system.restfs.ecss
ping -c1 cocon.mysql.ecss PING cocon.mysql.ecss (10.0.10.10) 56(84) bytes of data. 64 bytes from 10.0.10.10 (10.0.10.10): icmp_seq=1 ttl=64 time=0.234 ms --- cocon.mysql.ecss ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.234/0.234/0.234/0.000 ms . . . ping -c1 system.restfs.ecss PING system.restfs.ecss (10.0.10.10) 56(84) bytes of data. 64 bytes from 10.0.10.10 (10.0.10.10): icmp_seq=1 ttl=64 time=0.531 ms --- system.restfs.ecss ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.531/0.531/0.531/0.000 ms
Устанавливаем пакет "ecss-media-server"
sudo apt install ecss-media-server
Для медиасервера (ecss-media-server/MSR) возможно начальное конфигурирование с записью параметров в файл конфигурации,
для этого нужно провести конфигурацию transport bind-addr,mcc bind-addres (указываем локальный IP адрес, для примера 10.0.20.93):
| Вопросы ecss-media-server | Ответы для ecss1 |
|---|---|
| [ MSR SIP ] Введите bind-ip адрес (Enter) | 10.0.20.93 (необходимо ввести) |
| [MSR Control-Channel] Введите bind-ip-адрес | 10.0.20.93 (необходимо ввести) |
После формирования конфигураций по умолчанию производим их проверку:
sudo nano /etc/ecss/ecss-media-server/config.xml
<?xml version="1.0" encoding="utf-8"?>
<config date="15:25:27 21.04.2025">
<general log-level="3" log-rotate="yes" max-calls="8192" max-vid-calls="8192" max-in-group="512" load-sensor="media" load-delta="10" calls-delta="100" spool-dir-size="100M" log-name="msr.log" log-path="/var/log/ecss/media-server" use-srtp="disabled" enable-ice-transport="no" ice-update="no" aggressive-ice="yes" stun-server="" suspicious-mode="no"/>
<transport bind-addr="10.0.20.93" port="5040" transport="udp+tcp"/>
<!-- By default configured public TURN-server -->
<turn-server use-turn="no" host="numb.viagenie.ca" user="webrtc@live.com" password="muazkh"/>
<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="2048" tias-in-sdp="no" thread-cnt="2" vid-enc-threads="2" vid-dec-threads="2" video-conf-layout="evenly" keyframe-interval="1000" vid-decode-delay="100" silent-codec-switch="yes" 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="640" video-enc-height="360" finalsilence="1000" rtcp-stat-dump="yes" dtmf-tg-fpc-loop="10" dtmf-tg-fit="1" dtmf-tg-fot="2" dtmf-tg-volume="12288"/>
<codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" g726="0" g729="0" speex="0" l16="0" g7221="0" opus="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0"/>
<accounts>
<!-- <dynamic msr_name="msr.name"
realm="sip:127.0.0.1:5000"
dtmf_mode="rfc+inband+info"
auth_name="user"
auth_password="password" /> -->
</accounts>
<pbyte>
<mcc bind-addr="10.0.20.93" port="5700"/>
</pbyte>
<conf_dir path="/etc/ecss/ecss-media-server/conf.d"/>
<metrics enable="no"/>
<rtp>
<auto addr-v4=""/>
</rtp>
</config>
В файле /etc/ecss/ecss-media-server/conf.d/default.xml указываем Ip адреса core, vlan 20 ECSS10 (для примера 10.0.20.91/10.0.20.92):
<?xml version="1.0"?>
<config>
<accounts>
<dynamic msr_name="msr.msr" realm="sip:10.0.20.91:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
<dynamic msr_name="msr.msr" realm="sip:10.0.20.92:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
</accounts>
</config>
Выполним перезагрузку сервиса:
sudo systemctl restart ecss-media-server
Проверяем, что новый MSR зарегистрировался на ecss1/ecss2 нодах:
Или аналогичная проверка в Cocon:
/system/media/resource/list all All 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.ecss1 │ 3.14.16.0.118 │ 1.0 │ 0 │ 54faa9 │ connected │ 01:57:46 │ 10.0.20.91:5700 │ net.20 │ 10.0.20.91 │ true │ default │ local │ net.20@msr.ecss1 │ registered │ 69 │ │ │ msr.ecss2 │ 3.14.16.0.118 │ 1.0 │ 0 │ 4cff7c │ connected │ 01:57:48 │ 10.0.20.92:5700 │ net.20 │ 10.0.20.92 │ true │ default │ local │ net.20@msr.ecss2 │ registered │ 67 │ │ │ msr.msr │ 3.14.16.0.147 │ 1.0 │ 0 │ 607c93 │ connected │ 00:17:07 │ 10.0.20.93:5700 │ net.20 │ 10.0.20.93 │ false │ default │ sub_A_site │ net.20@msr.msr │ registered │ 113 │ │ │ msr.msr1 │ 3.14.16.0.147 │ 1.0 │ 0 │ 77518b │ connected │ 00:17:11 │ 10.0.20.94:5701 │ net.30 │ 10.0.20.94 │ false │ default │ sub_B_site │ net.30@msr.msr1 │ registered │ 110 │ │ core1@ecss2 │ msr.ecss1 │ 3.14.16.0.118 │ 1.0 │ 0 │ 54faa9 │ connected │ 01:57:32 │ 10.0.20.91:5700 │ net.20 │ 10.0.20.91 │ true │ default │ local │ net.20@msr.ecss1 │ registered │ 81 │ │ │ msr.ecss2 │ 3.14.16.0.118 │ 1.0 │ 0 │ 4cff7c │ connected │ 01:57:32 │ 10.0.20.92:5700 │ net.20 │ 10.0.20.92 │ true │ default │ local │ net.20@msr.ecss2 │ registered │ 80 │ │ │ msr.msr │ 3.14.16.0.147 │ 1.0 │ 0 │ 607c93 │ connected │ 00:17:07 │ 10.0.20.93:5700 │ net.20 │ 10.0.20.93 │ false │ default │ sub_A_site │ net.20@msr.msr │ registered │ 112 │ │ │ msr.msr1 │ 3.14.16.0.147 │ 1.0 │ 0 │ 77518b │ connected │ 00:17:11 │ 10.0.20.94:5701 │ net.30 │ 10.0.20.94 │ false │ default │ sub_B_site │ net.30@msr.msr1 │ registered │ 109 │ └─────────────┴───────────┴───────────────┴───────────┴──────┴────────┴───────────┴───────────┴─────────────────┴────────┴────────────┴────────┴─────────┴────────────┴──────────────────┴────────────┴─────────┘
Активизируем и сохраняем:
Или аналогичные действия в Cocon:
/system/media/resource/set * net.30@msr.msr1 active true Media resource: ┌─────────────┬─────────────────┬──────────┬───────┐ │ Node │ Contact │ Property │ Value │ ├─────────────┼─────────────────┼──────────┼───────┤ │ core1@ecss1 │ net.30@msr.msr1 │ active │ true │ │ core1@ecss2 │ net.30@msr.msr1 │ active │ true │ └─────────────┴─────────────────┴──────────┴───────┘
Проверяем:
/system/media/resource/list 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.ecss1 │ 3.14.16.0.118 │ 1.0 │ 0 │ 54faa9 │ connected │ 00:02:51 │ 10.0.20.91:5700 │ net.20 │ 10.0.20.91 │ true │ default │ local │ net.20@msr.ecss1 │ registered │ 129 │ │ │ msr.ecss2 │ 3.14.16.0.118 │ 1.0 │ 0 │ 4cff7c │ connected │ 00:02:51 │ 10.0.20.92:5700 │ net.20 │ 10.0.20.92 │ true │ default │ local │ net.20@msr.ecss2 │ registered │ 128 │ │ │ msr.msr │ 3.14.16.0.147 │ 1.0 │ 0 │ 607c93 │ connected │ 00:02:48 │ 10.0.20.93:5700 │ net.20 │ 10.0.20.93 │ true │ default │ sub_A_site │ net.20@msr.msr │ registered │ 132 │ │ │ msr.msr1 │ 3.14.16.0.147 │ 1.0 │ 0 │ 77518b │ connected │ 00:02:51 │ 10.0.20.94:5701 │ net.30 │ 10.0.20.94 │ true │ default │ sub_B_site │ net.30@msr.msr1 │ registered │ 129 │ │ core1@ecss2 │ msr.ecss1 │ 3.14.16.0.118 │ 1.0 │ 0 │ 54faa9 │ connected │ 00:02:31 │ 10.0.20.91:5700 │ net.20 │ 10.0.20.91 │ true │ default │ local │ net.20@msr.ecss1 │ registered │ 149 │ │ │ msr.ecss2 │ 3.14.16.0.118 │ 1.0 │ 0 │ 4cff7c │ connected │ 00:02:33 │ 10.0.20.92:5700 │ net.20 │ 10.0.20.92 │ true │ default │ local │ net.20@msr.ecss2 │ registered │ 147 │ │ │ msr.msr │ 3.14.16.0.147 │ 1.0 │ 0 │ 607c93 │ connected │ 00:02:32 │ 10.0.20.93:5700 │ net.20 │ 10.0.20.93 │ true │ default │ sub_A_site │ net.20@msr.msr │ registered │ 147 │ │ │ msr.msr1 │ 3.14.16.0.147 │ 1.0 │ 0 │ 77518b │ connected │ 00:02:31 │ 10.0.20.94:5701 │ net.30 │ 10.0.20.94 │ true │ default │ sub_B_site │ net.30@msr.msr1 │ registered │ 149 │ └─────────────┴───────────┴───────────────┴───────────┴──────┴────────┴───────────┴───────────┴─────────────────┴────────┴────────────┴────────┴─────────┴────────────┴──────────────────┴────────────┴─────────┘
Создание нескольких Site-ов
По умолчанию, после установки в ECSS10 существует только один сайт "local". В случае использования нескольких абонентских локаций, с большой локальной речевой нагрузкой, будет хорошим решением приземлять речевой трафик локально, а в центральный офис отправлять только сигнальную информацию. Конечно RTP пакеты для абонентов в центральном офисе будут отправлены на локацию "local". Для реализации данной концепции потребуется не только добавить MSR на локациях "Sub_A_Site", "Sub_B_Site", что мы уже сделали. Но и описать в SSW к каким локациям относится тот или иной абонент. А так же описать правила распределения речевой нагрузки как внутри одной локации, так и между ними.
Указать реальную локацию абонента можно как через веб, так и через cocon:
Вариант веб.
Вариант Cocon.
/domain/test_domain/iface/user-set sip1 sip 50000@test_domain site sub_B_site
Property 'site' successfully changed to 'sub_B_site' for interfaces:
50000@test_domain
/domain/test_domain/iface/info sip1 sip 50000@test_domain
┌─────────────────┬─┬───────────────┬────────────────────────────────────────────────────────────────────────────────┐
│ Interface │W│ Property │ Value │
├─────────────────┼─┼───────────────┼────────────────────────────────────────────────────────────────────────────────┤
│50000@test_domain│i│account │{"...53-48-48-48-48","...53-48-48-48-48"} │
│ │i│adapter\version│"3.14.16.0.687" │
│ │i│alias │"alias-as-user" │
│ │i│aliases_list │["50000"] │
│ │i│auth_qop │true │
│ │D│cfc-support │true │
│ │i│declaration │{none,{1744,955449,987490}} │
│ │g│domain │"test_domain" │
│ │i│gate │{gate_amqp,<<"acp.adapter.init.ex">>,<<"acp.sip.sip1.test_set.init.rk">>} │
│ │i│group │"sip" │
│ │i│id │<<"06d0e9439eeca756">> │
│ │i│isActive │true │
│ │i│media-profile │{media_profile,"default",user, │
│ │ │ │ [{media_profile_codecs,'<other>', │
│ │ │ │ [{media_profile_codec,<<"<other>">>,<<"*">>,true,#{}}], │
│ │ │ │ #{offroad => false,'rtcp-enabled' => true}}, │
│ │ │ │ {media_profile_codecs,audio, │
│ │ │ │ [{media_profile_codec,<<"G722">>,<<"*">>,true,#{}}, │
│ │ │ │ {media_profile_codec,<<"PCMA">>,<<"*">>,true,#{}}, │
│ │ │ │ {media_profile_codec,<<"PCMU">>,<<"*">>,true,#{}}, │
│ │ │ │ {media_profile_codec,<<"G729">>,<<"*">>,true,#{}}, │
│ │ │ │ {media_profile_codec,<<"telephone-event">>,<<"*">>,true,#{}}], │
│ │ │ │ #{offroad => false,'rtcp-enabled' => true}}], │
│ │ │ │ #{'dtmf-receive-type' => auto,'dtmf-transmit-type' => transit}} │
│ │i│modificator │undefined │
│ │i│my_from │none │
│ │i│owner │"sip1" │
│ │i│profile │undefined │
│ │i│routing.context│default_routing │
│ │i│sip_domain │"test_domain" │
│ │i│site │<<"sub_B_site">> │
│ │i│subtype │user │
│ │D│terminal_type │smart │
│ │i│type │sip │
│ │i│user_agent │"TAU-8.IP/2.6.8 SN/VI33009554 sofia-sip/1.9" │
│ │i│user_name │"50000" │
│ │D│zone │<<"default">> │
└─────────────────┴─┴───────────────┴────────────────────────────────────────────────────────────────────────────────┘
Legend:
W: Where property is set:
D: This is default property
G: This is global property
g: This is group property
O: This is owner property
B: This is group+owner property
i: This is interface property
?: Unknown property level
Note: * char in W column means "Can't read iface resource info". Error reason in value column in this case
Звонки между абонентов разных сайтов будут по очереди обрабатывать MSR сайта абонента А/В.
Конфигурирование распределенного медиасервера
Описание
Распределенность медиасервера обеспечивает следующие возможности:
- Масштабирование количества медиаканалов за счет использования нескольких медиасерверов;
- Обмен медиатрафиком между абонентами, представленными в разных сетях-зонах;
- Региональное тяготение — минимизация межсетевого трафика медиаданных и снижение латентности за счет близкого расположения ресурса медиасервера к источникам/потребителям медиатрафика;
- Специализация медиаресурсов на медиасерверах (медиасервера могут отличаться своими возможностями).
Для функционирования схемы система ECSS-10 должна обладать информацией о доступных ей медиасерверах и их возможностях. Механизм медиасерверов, используемых для обнаружения, должен быть динамическим, автоматически подстраиваться к изменениям параметров сети, реагировать на появление/исчезновение медиасервера/ECSS-10.
Используемая схема обнаружения и информирования о статусе/возможностях медиасерверов основана на стандартной SIP-регистрации (метод SIP REGISTER). В данном сообщении в ядро ECSS-10 передается вся необходимая служебная информация.
Согласно типовой схемы, подключения к ECSS-10 осуществляется в разных VLAN. Задача ECSS-10 обеспечить коммутацию медиапотоков между абонентами этих VLAN. Для коммутации медиапотоков между абонентами одного VLAN терминация трафика на медиаресурсе ECSS-10 (медиасервере) не является обязательной. Для абонентов разных VLAN необходимо:
- Терминировать медиатрафик из разных VLAN в медиасервере;
- Обеспечить "перекладку" медиапакетов из одного VLAN в другой.
На рисунке 1 указаны требования к функционалу медиасервера по формированию точки приема медиатрафика во всех VLAN, которые заведены на него.
Рисунок 1 — Требования к функционалу медиасервера
Типовой случай распределенного медиасервера будет выглядеть следующим образом:
Рисунок 2 — Типовой случай распределенного медиасервера
Географическая распределенность
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 (если информация о нем присутствует);
- Для ядра, на котором обслуживается текущий call-процесс, выполняется поиск зарегистрированных (поле Status = registered), административно разрешенных (поле Active = true), c зоной (Zone) UA контактов MSR;
- Из найденных контактов выбираются те, которые соответствуют известному msr_id (если он все таки задан, в противном случае подходят все контакты предыдущего шага);
Далее выбранные контакты ранжируются по расстоянию между site UA и site самого контакта в соответствии с матрицей связанности:
/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.
Выбираются контакты с наименьшим расстоянием;
- Контакты, полученные на предыдущем шаге, сортируем с удалением дубликатов по имени 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.
distance
Команда предназначена для установки "расстояния" между сайтами.
По умолчанию, когда создаются сайты связность между ними задается как бесконечность (infinity).
Для установки требуемого расстояния между сайтами необходимо выполнить команду:
Путь команды:
/system/media/site/distance
Синтаксис:
distance <site name> <site name> <distance>
Параметры:
<site name> - географическая зона;
<distance> - положение сайтов относительно друг друга.
Пример:
admin@mycelium1@ecss1:/$ system/media/site/distance local remote_side 64 Distance between local and remote_side changed to: 64.
list
Команда возвращает список географических зон (сайтов), обслуживаемых медиасерверами.
По умолчанию в системе существует неудаляемый сайт "local"
Путь команды:
/system/media/site/list
Синтаксис:
list
Параметры:
Команда не содержит аргументов.
Пример:
List of all sites: local remote remote_side
matrix
Команда позволяет просмотреть матрицу географических зон (сайтов), которые обслуживает медиасервер.
Для просмотра всей матрицы выполняем команду без параметров. При этом будет отображены все сайты если их число не превышает 20, если их число больше, то отображаются первые 20 (сортировка по алфавиту).
Путь команды:
/system/media/site/matrix
Синтаксис:
matrix [<site name> [<site name>]]
Параметры:
<site name> - имя сайта.
Пример:
admin@mycelium1@ecss1:/$ system/media/site/matrix local remote_side remote ┌─────────────┬───┬───┬───┬────┐ │ site │ # │ 1 │ 2 │ 3 │ ├─────────────┼───┼───┼───┼────┤ │ local │ 1 │ 0 │ r │ 64 │ │ remote │ 2 │ r │ 0 │ r │ │ remote_side │ 3 │ r │ r │ 0 │ └─────────────┴───┴───┴───┴────┘ The site of row is correspond to site of iface(domain/<domain>/iface). The site of column is correspond to site of contact(system/media/resource/list). Legend: r - the distance is present only when there is another subscriber with a distance not equal to the value r(relation) to a given msr. empty distance - infinity distance between sites.
remove
Команда позволяет удалить сайт, обслуживаемый медиасервером, и всю информацию о нем.
Путь команды:
/system/media/site/remove
Синтаксис:
remove <site name>
Параметры:
<site name> - имя сайта.
Пример:
admin@mycelium1@ecss1:/$ system/media/site/remove remote_side Site: remote_side. Removed successfully.
Коэффициент производительности
Для каждого медиасервера в системе можно установить нужный коэффициент производительности. При распределении медиатрафика этот коэффициент будет учитываться, и нагрузка между разными медиасерверами будет делиться пропорционально данным значениям. Коэффициент (любое положительное целое или дробное число) устанавливается командой system/media/msr/set.
Примеры:
Установить для msr_1 коэффициент производительности 2:
/system/media/msr/set --performance_coefficient 2 --msr_name msr_1 Success: Property has been set for msr_1.
Просмотр:
/system/media/msr/info --ccid Default: ┌─────────────────────────────────┬─────────┬────────────────────────────────────────────────────────────────────────────────┐ │ Property │ Value │ Description │ ├─────────────────────────────────┼─────────┼────────────────────────────────────────────────────────────────────────────────┤ │check_cp │false │Check call process by UPDATE from msr? │ │check_cp_timeout │200 │Timeout of wait response from call process, ms │ │close_cc │true │Do close control connection to msr after registration expires from msr? │ │cps_limit │50 │Maximum number(limit) of CPS(Calls per Second) distributed to msr, from 0 to 50 │ │critical_load │100 │If the load of msr more or equal this value, msr will no longer be selected to h│ │ │ │andle calls. Percent, from 0 to 100 │ │is_max_calls_limit_reached │false │Check maximum number of calls on MSR has been reached? │ │is_subscribe_to_call_count │false │Is subscribe to call count on msr? │ │'max-calls' │4096 │Maximum number(limit) of calls that MSR supports. The value received from MSR. │ │'media/chatroom' │audio │Media of the chatroom │ │'media/conference' │audio │Media of the network conference │ │'media/meetme' │audio │Media of the meet me conference │ │'media/teleconference' │audio │Media of the teleconference │ │'mixer-clock-rate' │8000 │Audio mixing frequency on MSR. The value received from MSR. Used in SORM3 │ │performance_coefficient │1.0 │Msr performance coefficient │ │subscribe_to_call_count_expires │60 │Expires of subscribe to call count on msr, s │ │zmq_connection_response_timeout │500 │Connection response timeout, ms │ │zmq_connection_update_ack_timeout│500 │Connection update ack timeout, ms │ │zmq_connection_update_timeout │1000 │Connection update timeout, ms │ │zmq_reconnect_timeout │1000 │Reconnect timeout, ms │ │zmq_src_port │undefined│Source port of control connection │ └─────────────────────────────────┴─────────┴────────────────────────────────────────────────────────────────────────────────┘ MSR: ┌─────────┬───────────┬─────┐ │ MSR │ Property │Value│ ├─────────┼───────────┼─────┤ │msr.ecss1│'max-calls'│4048 │ │msr.ecss2│'max-calls'│4048 │ └─────────┴───────────┴─────┘ CCID: ┌──────┬─────────┐ │ CCID │ MSR │ ├──────┼─────────┤ │3f6496│msr.ecss2│ │fbd880│msr.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.ecss1 │ 3.14.15.243 │ 1.0 │ 0 │ fbd880 │ connected │ 04:09:14 │ 10.0.20.71:5700 │ net.20 │ 10.0.20.71 │ true │ default │ local │ net.20@msr.ecss1 │ registered │ 93 │ │ │ msr.ecss2 │ 3.14.15.243 │ 1.0 │ 0 │ 3f6496 │ connected │ 04:09:15 │ 10.0.20.72:5700 │ net.20 │ 10.0.20.72 │ true │ default │ local │ net.20@msr.ecss2 │ registered │ 92 │ │ core1@ecss2 │ msr.ecss1 │ 3.14.15.243 │ 1.0 │ 0 │ fbd880 │ connected │ 04:09:18 │ 10.0.20.71:5700 │ net.20 │ 10.0.20.71 │ true │ default │ local │ net.20@msr.ecss1 │ registered │ 89 │ │ │ msr.ecss2 │ 3.14.15.243 │ 1.0 │ 0 │ 3f6496 │ connected │ 04:09:20 │ 10.0.20.72:5700 │ net.20 │ 10.0.20.72 │ true │ default │ local │ net.20@msr.ecss2 │ registered │ 87 │ └─────────────┴───────────┴─────────────┴───────────┴──────┴────────┴───────────┴───────────┴─────────────────┴────────┴────────────┴────────┴─────────┴───────┴──────────────────┴────────────┴─────────┘
Уровень загрузки медиасервера
Механизм информирования ядра о степени загруженности MSR реализован через подписки. Команды по управлению такими подписками приведены справочнике команд CLI — /system/media/msr/subscription/.
Также в конфигурационном файле msr предусмотрены настройки, отображенные по следующей ссылке.






