AWS, ELB, CDN, Auto Scaling и другие аббревиатуры и термины для WebRTC с низкой задержкой
Современные браузеры не предоставляют возможность выбора - использовать WebRTC или не использовать. И если проиграть поток можно по HLS, MSE, то захватить поток с камеры и публиковать поток из браузера можно только с помощью WebRTC. Производители браузеров приняли этот "формат" и внедрили его в свои продукты. Так же как в свое время, те же вендоры поддерживали Flash Player в качестве плагина. Текущая ситуация с WebRTC отличается только тем, что WebRTC встроен в браузер нативно, на уровне кода, а не в виде плагина. Если через пару лет кто-то предложит лучшую библиотеку для работы с видео, нет сомнений, что вендоры перейдут на эту новую технологию. Но сегодня в мире браузеров правит бал Chrome, поэтому горизонт для WebRTC остается чистым.
Протокол RTMP в свое время вышел за пределы плеера и браузера и в настоящий момент активно используется для скармливания видео потоков крупным сервисам, таким как YouTube, Facebook и Twitch. Тоже самое происходит сейчас и с WebRTC, который тоже вышел за пределы браузера и перестал быть просто браузерной библиотекой для работы с видео. Сегодня WebRTC можно активно использовать, например, для обмена трафиком между серверами. И далее мы расскажем, как это работает в CDN - когда много стриминговых серверов делят возросшую нагрузку.
CDN (Content Delivery Network) - Сеть доставки контента. В своей минимальной конфигурации состоит из одного или нескольких Origin серверов, на которые публикуются видеопотоки, и одного или нескольких Edge, которые раздают медиапотоки подписчикам. Еще есть серверы типа Transcoder, которые выделяются для транскодирования потоков.
Итак, простейшая CDN:
А если у вас, то густо, то пусто? Допустим вы транслируете спортивные мероприятия. Во время проведения мероприятия у вас огромное число подписчиков, все серверы в CDN загружены почти до предела. После окончания мероприятия - трансляция не ведется и подписчиков нет вовсе и не будет ближайшие сутки. Серверы будут работать впустую. Простой оборудования, учитывая, что серверы нужны достаточно мощные, может вылиться в большие расходы. Давайте посмотрим, как можно их избежать, если использовать сервисы облачной платформы AWS для организации CDN.
Сервисы AWS (Amazon Web Services) уже давно полюбились разработчикам разных уровней как раз за масштабируемость, надежность и простоту использования. Можно развернуть виртуальный сервер любой нужной конфигурации за несколько кликов. Благодаря системе автоматического масштабирования (auto scaling) и балансировки нагрузки (Elastic Load Balancing) при появлении ресурсоемкой задачи в короткие сроки могут быть развернуты сотни серверов, на которые будет распределяться нагрузка, и которые, по завершению работы будут остановлены для экономии средств на оплату.
Как вы уже, наверное, знаете, Web Call Server адаптирован для запуска в окружении Amazon EC2 в несколько кликов. Инстансы WCS поддерживают балансировку распределения нагрузки при помощи технологии AWS Elastic Load Balancing, которая автоматически распределяет WebSocket-соединения по нескольким инстансам Amazon EC2. Если нагрузка на процессор сервера достигает значения, которое определено как триггер в политике масштабирования, будут запущены новые WCS инстансы, которые будут добавлены в балансировщик.
То есть имеется возможность автоматического развертывания сервера на основе готового образа — либо собранного собственноручно, либо загруженного из AWS Marketplace.
Запуск балансировщика нагрузки с автоматическим масштабированием на базе самостоятельно собранного образа WCS будет удобен для задач с длительным периодом работы (месяцы, годы). Для таких задач использование почасовой лицензии WCS, которая доступна при запуске образа из AWS Marketplace, будет стоить существенно дороже. Поэтому рекомендуем приобрести помесячную лицензию. Затем вручную развернуть WCS на инстансе Amazon EC2, активировать приобретенную лицензию, настроить сервер и создать образ для автоматического развертывания.
Для задач, которые запускаются на короткие периоды (часы, дни), напротив рекомендуем использовать запуск балансировщика нагрузки с автоматическим масштабированием на базе образа из AWS Marketplace. Почасовая лицензия, которая автоматически активируется при запуске инстанса в этом случае будет оптимальной.
Ниже мы подробно рассмотрим, как развернуть CDN с балансировщиком и автоматическим масштабированием на базе образа WCS из AWS Marketplace и процесс тестирования развернутой системы.
Развертывание CDN с балансировщиком и автоматическим масштабированием
Конфигурация CDN будет следующей:
один origin сервер;
один Edge в составе балансировщика нагрузки, который позволяет во время пиковой нагрузки увеличить число Edge серверов до трех.
Для развертывания потребуется настроить следующие компоненты в консоли Amazon EC2:
WCS Origin инстанс;
балансировщик нагрузки;
шаблон запуска;
группа масштабирования.
Запуск WCS Origin
Выберите пункт "Instances" в разделе "Instances" меню в левой части консоли AWS. Нажмите кнопку "Launch Instance":
В открывшемся мастере запуска инстансов выберите "AWS Marketplace" и с помощью строки поиска найдите "Flashphoner Web Call Server". Нажмите кнопку "Select":
Ознакомьтесь с информацией об образе и нажмите кнопку "Continue":
Выберите тип виртуальной машины для инстанса и нажмите кнопку "Next: Configure Instance Details":
В нижней части страницы "Configure Instance Details" разверните секцию "Advanced Details" вставьте в поле "User data" скрипт обновления и настройки WCS. (пример скрипта рассмотрим чуть ниже). Остальные настройки можно оставить по умолчанию. После добавления скрипта перейдите на страницу мастера "Configure Security Group":
На странице "Configure Security Group" создайте новую группу безопасности для файрволла, либо используйте ранее созданную группу. По умолчанию все необходимые порты доступны из настроек образа. Нажмите кнопку "Review and Launch":
Просмотрите параметры создаваемого инстанса и, если нет ошибок, нажмите кнопку "Launch":
Будет запущен инстанс WCS сервера с ролью CDN Origin. Найдите и запишите (или запомните) IP адрес Origin WCS во внутренней сети AWS, он потребуется для дальнейших настроек:
Скрипт обновления WCS до актуальной версии и настройки роли CDN Origin:
#!/bin/bash
# Stop WCS before reconfiguring
PID="$(pgrep -f 'com.flashphoner.server.Server' | grep -v bash)"
if [ -n "$PID" ]; then
service webcallserver stop
fi
# Update WCS to the latest build (optionally, set to false if you don't)
UPDATE=true
if $UPDATE; then
cd /tmp
wget --timeout=10 --no-check-certificate https://flashphoner.com/download-wcs5.2-server.tar.gz -O wcs5-server.tar.gz
if [ $? -eq 0 ]; then
mkdir -p FlashphonerWebCallServer-5.2-latest && tar xzf wcs5-server.tar.gz -C FlashphonerWebCallServer-5.2-latest --strip-components 1
cd FlashphonerWebCallServer-5.2-latest
chmod +x install.sh
./install.sh -silent
cd ..
rm -rf FlashphonerWebCallServer-5.2-latest wcs5-server.tar.gz
fi
fi
# Configuration setup
WCS_CONFIG=/usr/local/FlashphonerWebCallServer/conf/flashphoner.properties
JVM_CONFIG=/usr/local/FlashphonerWebCallServer/conf/wcs-core.properties
#CDN settings
CDN_ROLE=origin
CDN_IP=0.0.0.0
echo -e "\ncdn_enabled=true" >> $WCS_CONFIG
echo -e "\ncdn_ip=$CDN_IP" >> $WCS_CONFIG
echo -e "\ncdn_role=$CDN_ROLE" >> $WCS_CONFIG
echo -e "\ncdn_nodes_resolve_ip=false" >> $WCS_CONFIG
# Request keyframes from WebRTC publishers every 5 seconds
echo -e "\nperiodic_fir_request=true" >> $WCS_CONFIG
# Disable RTMP keepalives to publish from OBS
echo -e "\nkeep_alive.enabled=websocket,rtmfp" >> $WCS_CONFIG
# Configure heap settings
HEAP_SIZE=512m
sed -i -e "s/^\(-Xmx\).*\$/\1$HEAP_SIZE/" $JVM_CONFIG
# Start WCS after reconfiguring
PID="$(pgrep -f 'com.flashphoner.server.Server' | grep -v bash)"
if [ -n "$PID" ]; then
service webcallserver restart
else
service webcallserver start
fi
# Disable internal firewall, ports are allowed/blocked on security group level
iptables -F
Балансировщик нагрузки
В консоли AWS, из меню в левой части страницы выберите пункт "Load Balancers" и нажмите на открывшейся странице кнопку "Create Load Balancer":
Далее выберите тип балансировщика — "Classic Load Balancer". Этот тип позволяет назначить нужные порты для контроля состояния сервера. Нажмите кнопку "Create" для выбранного типа балансировщика:
Откроется мастер настройки балансировщика. На первой вкладке укажите имя создаваемого балансировщика и нужные для работы порты и протоколы. Для перехода к следующему шагу настройки нажмите кнопку "Next: Assign Security Groups":
На следующей вкладке укажите группу безопасности и нажмите кнопку "Next: Configure Security Settings":
На третьем шаге вы можете загрузить SSL сертификаты для подтверждения подлинности серверов. Выберите пункт "Upload a certificate to IAM" в секции "Certificate type" и загрузите сертификаты. После чего нажмите кнопку "Next: Configure Health Check":
Четвертый шаг настройки позволяет настроить проверку состояния серверов входящих в балансировщик нагрузки. Трафик будет направляться только к тем серверам, которые прошли проверку работоспособности. Если сервер не проходит проверку, он автоматически удаляется из балансировщика.
Используйте следующие URL для контроля состояния:
по протоколу HTTP: http://<WCS instance DNS name>:8081/?action=stat
по протоколу HTTPS: https://<WCS instance DNS name>:8444/?action=stat
Сделайте настройки и нажмите кнопку "Next: Add EC2 Instances":
На пятом шаге настройки происходит добавление серверов к балансировщику. На текущий момент у нас запущен только инстанс с ролью CDN Origin, а балансировщик мы настраиваем для инстансов с ролью CDN Edge, поэтому на этом шаге не добавляем существующий инстанс к балансировщику. Нажмите кнопку "Next: Add Tags"
Следующий шаг позволяет назначить балансировщику теги. При необходимости указываем теги и нажимаем кнопку "Review and Create":
И, наконец, заключительный шаг. Проверяем конфигурацию балансировщика и нажимаем кнопку "Create" :
Через несколько секунд получаем сообщение об успешном создании балансировщика. Нажмите кнопку "Close", что бы вернуться в консоль AWS:
После создания балансировщика переходим к созданию шаблона запуска для автоматического создания новых инстансов.
Шаблон запуска
В левом боком меню выберите пункт "Launch Templates" в разделе "Instances" и нажмите кнопку "Create launch template":
Открывается мастер создания шаблонов запуска. В секции "Launch template name and description" укажите имя и описание шаблона:
В следующей секции "Amazon machine image (AMI)" выберите из выпадающего списка свежий образ Flashphoner WCS. Для быстроты и удобства можно воспользоваться поиском:
В секциях "Instance type" "Key pair (login) " "Network settings" выберите тип создаваемого инстанса, пару ключей для доступа к инстансу по SSH, задайте тип сети и выберите группу безопасности для файрволла:
В следующей секции "Storage (volumes)" настройте размер и параметры жесткого диска для инстансов, которые будут созданы на основе этого шаблона:
Затем разворачиваем секцию "Advanced details". Находим поле "User data" и вставляем скрипт для обновления WCS и настройки роли CDN Edge, после чего нажимаем кнопку "Create launch template" :
Листинг кода скрипта для обновления WCS и настройки роли CDN Edge. Для корректной работы скрипта укажите в переменной "CDN_POINT_OF_ENTRY" внутренний адрес инстанса CDN Origin:
#!/bin/bash
# Stop WCS before reconfiguring
PID="$(pgrep -f 'com.flashphoner.server.Server' | grep -v bash)"
if [ -n "$PID" ]; then
service webcallserver stop
fi
# Update WCS to the latest build (optionally, set to false if you don't)
UPDATE=true
if $UPDATE; then
cd /tmp
wget --timeout=10 --no-check-certificate https://flashphoner.com/download-wcs5.2-server.tar.gz -O wcs5-server.tar.gz
if [ $? -eq 0 ]; then
mkdir -p FlashphonerWebCallServer-5.2-latest && tar xzf wcs5-server.tar.gz -C FlashphonerWebCallServer-5.2-latest --strip-components 1
cd FlashphonerWebCallServer-5.2-latest
chmod +x install.sh
./install.sh -silent
cd ..
rm -rf FlashphonerWebCallServer-5.2-latest wcs5-server.tar.gz
fi
fi
# Configuration setup
WCS_CONFIG=/usr/local/FlashphonerWebCallServer/conf/flashphoner.properties
JVM_CONFIG=/usr/local/FlashphonerWebCallServer/conf/wcs-core.properties
#CDN settings
CDN_ROLE=edge
CDN_IP=0.0.0.0
CDN_POINT_OF_ENTRY=172.31.43.82 #IP address CDN Origin
echo -e "\ncdn_enabled=true" >> $WCS_CONFIG
echo -e "\ncdn_ip=$CDN_IP" >> $WCS_CONFIG
echo -e "\ncdn_role=$CDN_ROLE" >> $WCS_CONFIG
echo -e "\ncdn_point_of_entry=$CDN_POINT_OF_ENTRY" >> $WCS_CONFIG
echo -e "\ncdn_nodes_resolve_ip=false" >> $WCS_CONFIG
# Configure heap settings
HEAP_SIZE=512m
sed -i -e "s/^\(-Xmx\).*\$/\1$HEAP_SIZE/" $JVM_CONFIG
# Start WCS after reconfiguring
PID="$(pgrep -f 'com.flashphoner.server.Server' | grep -v bash)"
if [ -n "$PID" ]; then
service webcallserver restart
else
service webcallserver start
fi
# Disable internal firewall, ports are allowed/blocked on security group level
iptables -F
Следующим этапом развертывания будет создание группы масштабирования.
Группа масштабирования
B меню в левой части страницы EC2 Console в разделе "Auto Scaling" выберите пункт "Auto Scaling Groups" :
В открывшемся мастере создания группы на первом шаге нужно указать шаблон запуска для новых инстансов, который мы создали ранее. Переключаем радиокнопку на использование шаблона и указываем нужный шаблон. Для перехода к следующему шагу нажмите кнопку "Next Step" :
На следующем шаге мастера создания группы укажите имя группы, выберите версию "Latest" для шаблона запуска. Выберите пункт "Combine purchase options and instances" и укажите тип виртуальной машины для инстанса. Деактивируйте чекбокс "Use the default settings to get started quickly" и задайте соотношение между используемыми виртуальными машинами:
Ниже на этой странице разверните секцию "Advanced Details", активируйте чекбокс "Receive traffic from one or more load balancers" и укажите в поле "Classic Load Balancers" балансировщик, который мы создали ранее. После всех настроек нажмите кнопку "Next: Configure scaling policies":
На следующей странице мастера выбираем пункт "Use scaling policies to adjust the capacity of this group" Укажите минимальное и максимальное число инстансов в AutoScaling группе и задайте значения загрузки процессора и время, в течении которого должна сохранятся загрузка для запуска дополнительного инстанса. После указания настроек нажмите кнопку "Review":
На странице "Review" проверьте настройки и нажмите кнопку "Create Auto Scaling Group":
Получаем сообщение об успешном создании группы масштабирования. Нажмите "Close" для возврата в консоль:
На этом этап развертывания завершен. Если в балансировщике не было запущено ни одного инстанса, то новый инстанс запустится автоматически при создании группы масштабирования. При загрузке процессора этого инстанса более 80% будет выполнено условие масштабирования и запущены дополнительные инстансы.
Тестирование
Кроме подготовленных выше инстансов на AWS для тестирования понадобятся:
браузер Google Chrome;
аппаратная или виртуальная веб камера для организации трансляции видеопотока.
В браузере Google Chrome открываем web интерфейс WCS сервера по DNS имени инстанса с ролью CDN Origin:
https://<CDN Origin Instans DNS name>:8444
Авторизуемся в web интерфейсе и открываем пример "Two-way Streaming". Устанавливаем соединение с сервером по WebSocket и публикуем видеопоток:
Затем, запускаем web интерфейс WCS CDN Edge сервера по DNS имени балансировщика:
https://<Load balancer DNS name>:8444
Авторизуемся в web интерфейсе, открываем пример "Media Devices" и устанавливаем соединение с балансировщиком по WebSocket. В правом столбце настроек снимаем чекбокс "default" для параметра "Size" и задаем значения для транскодирования видеопотока. Например, если поток на Origin сервере опубликован с размерами 320х240 задаем значение 640х480. Повторите действия в нескольких вкладках браузера, для имитации большого количества зрителей.
Транскодирование достаточно ресурсоемкий процесс и приведет к срабатыванию триггера для запуска дополнительных Edge серверов.
Для этого тестирования мы занизили порог срабатывания масштабирования до значения загрузки процессора 10%. Как видите на скриншоте ниже, после того как порог нагрузки на процессор был превышен более минуты, для снижения нагрузки были запущены два дополнительных инстанса:
Чтобы убедиться, что соединения распределяются между активными инстансами в балансировщике нагрузки, используйте страницу статистики:
http://<WCS instance DNS name>:8081/?action=stat
которую нужно открыть для каждого из инстансов, входящих в балансировщик. На странице статистики есть значение "connection_websocket" которое показывает число активных WebSocket сессий на сервере:
Настройка доменных имен
Для регистрации и управления доменными именами существует сервис "Amazon Route 53", который предоставляет пользователям высокодоступную и масштабируемую систему доменных имен (DNS). Сервис "Route 53" направляет запросы пользователей к инфраструктуре AWS, например к инстансам Amazon EC2 или балансировщикам нагрузки Elastic Load Balancing.
Для настройки доменных имен для CDN, которую мы создали выше выполните следующие шаги:
Откройте консоль управления сервисом "Route 53":
Зарегистрируйте новое доменное имя или перенесите существующее:
После регистрации или переноса доменного имени выбираем из меню в левой части окна пункт "Hosted zones" и переходим в созданную доменную зону:
Для создания новых А записей серверов входящих в CDN нажимаем кнопку "Create Record Set":
Создаем записи для сервера Origin и балансировщика нагрузки:
В качестве проверки пробуем обратиться к серверам, входящим в CDN по созданным доменным именам:
Итог
В результате всех работ мы создали CDN с балансировщиком нагрузки и автоматическим масштабированием, с помощью которой можно проводить любые видеотрансляции, для которых нужна низкая задержка. Балансировщик помогает нивелировать пиковые нагрузки, даже при такой ресурсоемкой операции, как транскодирование видео, что бы задержка в трансляции оставалась по прежнему низкой. А автоматическое масштабирование помогает сэкономить деньги на покупку лицензий и аренду виртуальных машин, потому что сервера запускаются только тогда, когда в этом есть потребность. Поэтому, будет не лишним один раз потратить время на настройку, что бы потом автоматические сервисы всегда были на подхвате.
Хорошего стриминга!
Ссылки
Быстрое развертывание WCS на базе Amazon
CDN для стриминга WebRTC с низкой задержкой
Документация по быстрому развертыванию и тестированию WCS сервера
Документация по развертыванию WCS-сервер в Amazon EC2
Документация по настройке балансировки нагрузки с масштабированием при помощи AWS ELB