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 |
Согласование кодеков на 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 сервера