CDN на базе WCS-серверов может быть организована двумя способами:
- Статическая CDN, набор узлов в которой жестко определяется на этапе настройки, и для изменения конфигурации CDN необходимо перезапустить сервер(а), которые являются источниками потоков в данной сети. Такая CDN 1.0 организуется на базе функции балансировки нагрузки.
- Динамическая CDN, набор узлов в которой может изменяться на ходу. Для включения/исключения узла из такой CDN достаточно перезапустить только этот узел.
В данном разделе рассмотрим динамическую CDN на базе Web Call Server 5.1.
Описание
Принципы работы динамической CDN
Распределенная динамическая сеть доставки контента (CDN) на базе WCS 5.1 работает следующим образом:
- При запуске сервера запускается специальный CDN-модуль. Модуль отправляет запрос к серверу, указанному как точка входа в CDN, для получения от него списка других серверов в CDN и списка доступных потоков. Если точка входа не указана, либо указанный сервер недоступен, модуль ожидает извещения от какого-либо другого сервера в CDN (например, если этот сервер уже был добавлен в список CDN-серверов на другом сервере, или указан как точка входа). В результате каждый активный CDN-сервер в каждый момент времени имеет актуальный список всех остальных CDN-серверов.
- Все взаимодействие между узлами CDN производится по Websocket.
Роли серверов в CDN
Сервер может иметь одну из двух ролей
1. Origin: служит источником потоков для других серверов в CDN. Может раздавать как опубликованные на нем потоки, так и потоки, которые он забирает с других серверов.
2. Edge: может забирать потоки с Origin-серверов, при этом не раздает свои (локальные) потоки другим сереврам.
При этом потоки не раздаются принудительно, Edge-сервер забирает определенный поток с Origin только по запросу пользователя из браузера или мобильного приложения.
Схема работы
- Браузер соединяется с Origin сервером по протоколу Websocket и отправляет команду publish.
- Браузер захватывает микрофон и камеру и отправляет WebRTC поток на сервер.
- Второй браузер устанавливает соединение с Edge3 сервером по Websocket и отправляет команду play.
- Edge3 сервер запрашивает поток у Origin сервера
- Edge3 сервер получает WebRTC поток.
- Второй браузер получает WebRTC поток и воспроизводит этот поток на странице.
Принципы идентификации потоков в CDN
Имя потока уникально для каждого WCS-сервера (и однозначно идентифицирует поток), но не для CDN в целом. Таким образом, существует два ограничения:
- Если на сервере опубликован поток с таким же именем, как у потока, уже опубликованного на каком-либо Origin-сервере, то при воспроизведении на этом сервере будет воспроизводиться локальный (не CDN) поток.
- При воспроизведении CDN-потока на этом сервере не может быть опубликован поток с таким же именем. То же имя может быть использовано для публикации только после остановки воспроизведения и удаления pull-агента по истечении таймаута проверки активности (по умолчанию 1 минута).
Настройка
Параметры файла настроек
Для настройки CDN используются следующие основные параметры файла настроек flashphoner.properties (полный список см в описании файла настроек):
Параметр | Значение по умолчанию | Тип | Описание |
---|---|---|---|
cdn_enabled | false | Boolean | Включить/отключить CDN |
cdn_ip | Empty | String | Адрес сервера в CDN |
cdn_nodes_resolve_ip | false | Boolean | Разрешать имена серверов в IP-адреса |
cdn_point_of_enry | Empty | String | Адрес сервера-точки входа в CDN для данного сервера |
cdn_port | 8084 | Int | Номер порта для CDN |
cdn_role | edge | String | Роль сервера в CDN: origin - источник потоков для других серверов в CDN edge - может получать потоки с других серверов |
Примеры конфигурации
Пример минимальной конфигурации
Два сервера: Origin (origin.flasphoner.com) и Edge (edge.flasphoner.com)
Настройки Origin:
cdn_enabled=true cdn_ip=origin.flashponer.com cdn_nodes_resolve_ip=true cdn_role=origin
Настройки Edge:
cdn_enabled=true cdn_ip=edge.flashphoner.com cdn_nodes_resolve_ip=true cdn_point_of_entry=origin.flashponer.com cdn_role=edge
Пример конфигурации с двумя Origin-серверами
Четыре сервера: Origin1 (origin1.flasphoner.com), Origin2 (origin2.flasphoner.com) и Edge1 (edge1.flasphoner.com), Edge2 (edge2.flasphoner.com)
Настройки Origin1:
cdn_enabled=true cdn_ip=origin1.flashponer.com cdn_nodes_resolve_ip=true cdn_role=origin
Настройки Origin2:
cdn_enabled=true cdn_ip=origin2.flashponer.com cdn_point_of_entry=origin1.flashponer.com cdn_nodes_resolve_ip=true cdn_role=origin
Настройки Edge1:
cdn_enabled=true cdn_ip=edge1.flashphoner.com cdn_point_of_entry=origin1.flashponer.com cdn_nodes_resolve_ip=true cdn_role=edge
Настройки Edge2:
cdn_enabled=true cdn_ip=edge2.flashphoner.com cdn_point_of_entry=origin1.flashponer.com cdn_nodes_resolve_ip=true cdn_role=edge
Использование CLI
Получение информации о текущем состояниии CDN из командной строки WCS производится следующими командами:
Команда | Описание | Пример результата |
---|---|---|
show cdn-nodes | Отображает список узловых серверов в CDN: ACTIVE - сервер запущен, отвечает на запросы и/или рассылает извещения PASSIVE - сервер остановлен или недоступен | Ip State --------------------------------- edge1.flashphoner.com ACTIVE edge2.flashphoner.com ACTIVE origin2.flashphoner.com PASSIVE |
show cdn-routes | Отображает список активных потоков в CDN | Route Stream ------------------------------------ 1-origin2.flashphoner.com-2 stream1 0-origin2.flashphoner.com-0 stream2 2-origin1.flashphoner.com-1 stream1 |
Удаление остановленных серверов из списка узлов
По умолчанию, остановленный или недоступный узел будет отображаться в списке серверов CDN в статусе PASSIVE до тех пор, пока он вновь не будет запущен, либо вся CDN не будет остановлена. При необходимости, может быть установлен интервал, по истечении которого неактивный узел будет удаляться из списка. Интервал задается в секундах при помощи параметра в файле настроек flashphoner.properties, например
cdn_nodes_timeout=60
В данном случае неактивные узлы будут удаляться из списка через 60 секунд.
Согласование кодеков на Origin и Edge серверах
Для того, чтобы избежать излишнего транскодирования при ретрансляции потоков, необходимо согласовывать настройку кодеков на Origin и Edge серверах.
Рассмотрим следующую схему работы CDN, предназначенной для ретрансляции потока с веб-камеры и RTMP-кодировщика:
1. Ретрансляция потока, захваченного из браузера Chrome
1.1. Origin принимает поток H.264+Opus с Chrome.
1.2. Edge забирает с Origin поток по WebRTС H.264+Opus, на Origin нет транскодинга.
1.3. Зритель забирает с Edge поток:
1.3.1. по H.264+Opus, на Edge нет транскодинга;
1.3.2. по H.264+AAC, на Edge транскодинг Opus > AAC.
2. Ретрансляция потока, захваченного c RTMP-кодировщика
2.1. Origin принимает поток H.264+AAC с RTMP стримера.
2.2. Edge забирает с Origin поток по WebRTС H.264+Opus, на Origin транскодинг AAC > Opus.
2.3. Зритель забирает с Edge поток:
2.3.1. по H.264+Opus, на Edge нет транскодинга;
2.3.2. по H.264+AAC, на Edge транскодинг Opus > AAC.
Для работы такой CDN необходимо в файле flashphoner.properties настроить кодеки следующим образом:
на Origin сервере
codecs=opus,mpeg4-generic,alaw,ulaw,g729,g722,telephone-event,h264,vp8,flv,mpv # включаем транскодинг, чтобы отдавать на Edge только Opus disable_rtc_avoid_transcoding_alg=true
на Edge сервере
codecs=opus,mpeg4-generic,alaw,ulaw,g729,g722,telephone-event,h264,vp8,flv,mpv #удаляем aac с cdn, чтобы забирать с Origin только Opus codecs_exclude_cdn=flv,telephone-event,mpeg4-generic
Краткое руководство по тестированию
Подготовка к тестированию
1. Для тестирования используем:
- два WCS сервера;
- веб-приложение Two Way Streaming для публикации потока
- веб-приложение Player для воспроизведения потока.
Настройка WCS
2. Для тестирования настройте CDN в минимальной конфигурации: один Origin и один Edge-сервер
Настройки Origin:
cdn_enabled=true cdn_nodes_resolve_ip=true cdn_ip=origin.flashphoner.com cdn_role=origin
Настройки Edge:
cdn_enabled=true cdn_nodes_resolve_ip=true cdn_point_of_entry=origin.flashphoner.com cdn_ip=edge.flashphoner.com cdn_role=edge
Здесь origin.flashphoner.com и edge.flashphoner.com - примеры имен WCS-серверов
Перезапустите Origin и Edge-серверы. Войдите в интерфейс командной строки Edge-сервера, авторизуйтесь и введите команду
show cdn-nodes
Результат выполнения команды будет следующим:
> show cdn-nodes Ip State --------------------------- origin.flashphoner.com ACTIVE
Запуск трансляции с веб-камеры на Origin-сервер
3. Откройте веб-приложение Two Way Streaming на Origin-сервере. Нажмите кнопку Connect и укажите имя транслируемого потока testCDN:
4. Нажмите кнопку Publish. Начнется трансляция потока с веб-камеры:
Воспроизведение потока на Edge-сервере
5. Откройте веб-приложение Player на Edge-сервере. Укажите имя потока, транслируемого на Origin-сервер, testCDN:
6. Нажмите кнопку Start. Начнется воспроизведение потока testCDN:
7. В интерфейсе командной строки Edge-сервера введите команду
show cdn-routes
Результат выполнения команды будет следующим:
> show cdn-routes Route Stream -------------------------------- 0-origin.flashphoner.com-0 testCDN
Остановка трансляции с веб-камеры на Origin-сервер
8. Нажмите кнопку Stop на странице публикации потока. Публикация остановится:
При этом на странице воспроизведения Edge-сервера проигрывание потока также остановится с вывоом сообщения "Stopped by publisher stop"
Известные проблемы
1) Изменение настройки кодеков на Edge сервере может приводить к возрастанию нагрузки на сервер в результате включения транскодинга
Симптомы: при ретрансляции большого количества потоков возрастает нагрузка на CPU Edge-сервера
Решение: согласовать настройку кодеков на Origin и Edge серверах таким образом, чтобы исключить излишнее включение транскодинга
Например, если в настройке Origin сервера указан следующий набор кодеков:
codecs=opus,mpeg4-generic,alaw,ulaw,g729,g722,telephone-event,h264,vp8
а в настройке Edge сервера - такой
codecs=opus,speex16,mpeg4-generic,g729,g722,h264,vp8
то при ретрансляции потока на Edge сервере включается транскодирование звука в Speex16 или AAC, что при большом количестве потоков существенно увеличивает нагрузку на CPU сервера