В стандартной конфигурации используем 2 сервера: ecss1 и ecss2, соответственно 2 MSR которые обрабатывают медиа трафик.
Рассмотрим добавление еще одного или нескольких MSR, для распределения медиа трафика на 3 хоста и более, для высоко нагруженных систем /для приземления RTP трафика на локальном сайте в распределенных системах.

Требования к ОС/дополнительным пакетам, соответствуют требованиям ECSS10.

Установка MSR

Для работы MSR на отдельном хосте потребуются следующие пакеты с сайта Элтекс:

Для этого необходимо добавить репозиторий 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 данного сайта.
Звонки между абонентов разных сайтов будут по очереди обрабатывать MSR сайта абонента А/В.


Конфигурирование распределенного медиасервера

Описание

Распределенность медиасервера обеспечивает следующие возможности:

Для функционирования схемы система ECSS-10 должна обладать информацией о доступных ей медиасерверах и их возможностях. Механизм медиасерверов, используемых для обнаружения, должен быть динамическим, автоматически подстраиваться к изменениям параметров сети, реагировать на появление/исчезновение медиасервера/ECSS-10.

Используемая схема обнаружения и информирования о статусе/возможностях медиасерверов основана на стандартной SIP-регистрации (метод SIP REGISTER). В данном сообщении в ядро ECSS-10 передается вся необходимая служебная информация.

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

  1. Терминировать медиатрафик из разных VLAN в медиасервере;
  2. Обеспечить "перекладку" медиапакетов из одного VLAN в другой.

На рисунке 1 указаны требования к функционалу медиасервера по формированию точки приема медиатрафика во всех VLAN, которые заведены на него.

Рисунок 1 — Требования к функционалу медиасервера

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

Рисунок 2 — Типовой случай распределенного медиасервера

Географическая распределенность

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

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

  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 --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 предусмотрены настройки, отображенные по следующей ссылке.