В нашем блоге мы уже много раз упоминали о практическом применении CDN. Это и трансляции аукционов, скачек и спортивных мероприятий. И трансляции вебинаров, мастер-классов и онлайн уроков.

Действительно, необходимость видеотрансляций WebRTC с низкой задержкой уже прочно обосновалась в нашей жизни. Предлагаем рассмотреть еще один вариант развертывания CDN с балансировкой нагрузки (Elastic Load Balancing) и автоматическим масштабированием (auto scaling) в среде Amazon Web Services (AWS).

Сервисы AWS уже давно полюбились разработчикам разных уровней как раз за масштабируемость, надежность и простоту использования. Можно развернуть виртуальный сервер любой нужной конфигурации за несколько кликов. Благодаря системе автоматического масштабирования при появлении ресурсоемкой задачи в короткие сроки могут быть развернуты сотни серверов, на которые будет распределяться нагрузка, и которые, по завершению работы будут остановлены для экономии средств на оплату.

Как вы уже, наверное, знаете, 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 серверов до трех.

 

schema_cdn_load_balancer_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Для развертывания потребуется настроить следующие компоненты в консоли Amazon EC2:

  • WCS Origin инстанс;
  • балансировщик нагрузки;
  • шаблон запуска;
  • группа масштабирования.

 

Запуск WCS Origin

Выберите пункт «Instances» в разделе «Instances» меню в левой части консоли AWS. Нажмите кнопку «Launch Instance»:

В открывшемся мастере запуска инстансов выберите «AWS Marketplace» и с помощью строки поиска найдите «Flashphoner Web Call Server». Нажмите кнопку «Select»:

find_flashphoner_web_call_server_image_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Ознакомьтесь с информацией об образе и нажмите кнопку «Continue»:

product_details_flashphoner_web_call_server_image_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Выберите тип виртуальной машины для инстанса и нажмите кнопку «Next: Configure Instance Details»:

Choose_instans_type_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

В нижней части страницы «Configure Instance Details» разверните секцию «Advanced Details» вставьте в поле «User data» скрипт обновления и настройки WCS. (пример скрипта рассмотрим чуть ниже). Остальные настройки можно оставить по умолчанию. После добавления скрипта перейдите на страницу мастера «Configure Security Group»:

На странице «Configure Security Group» создайте новую группу безопасности для файрволла, либо используйте ранее созданную группу. По умолчанию все необходимые порты доступны из настроек образа. Нажмите кнопку «Review and Launch»:

Configure_Security_Group_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Просмотрите параметры создаваемого инстанса и, если нет ошибок, нажмите кнопку «Launch»:

review_instance_launch_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Будет запущен инстанс WCS сервера с ролью CDN Origin. Найдите и запишите (или запомните) IP адрес Origin WCS во внутренней сети AWS, он потребуется для дальнейших настроек:

ip_address_instance_origin_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Скрипт обновления 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»:

create_load_balancer_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Далее выберите тип балансировщика — «Classic Load Balancer». Этот тип позволяет назначить нужные порты для контроля состояния сервера. Нажмите кнопку «Create» для выбранного типа балансировщика:

choose_classic_load_balancer_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Откроется мастер настройки балансировщика. На первой вкладке укажите имя создаваемого балансировщика и нужные для работы порты и протоколы. Для перехода к следующему шагу настройки нажмите кнопку «Next: Assign Security Groups»:

Define_load_balancer_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

На следующей вкладке укажите группу безопасности и нажмите кнопку «Next: Configure Security Settings»:

Assign_Security_Groups_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

На третьем шаге вы можете загрузить SSL сертификаты для подтверждения подлинности серверов. Выберите пункт «Upload a certificate to IAM» в секции «Certificate type» и загрузите сертификаты. После чего нажмите кнопку «Next: Configure Health Check»:

Configure_Security_Settings_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Четвертый шаг настройки позволяет настроить проверку состояния серверов входящих в балансировщик нагрузки. Трафик будет направляться только к тем серверам, которые прошли проверку работоспособности. Если сервер не проходит проверку, он автоматически удаляется из балансировщика.

Используйте следующие URL для контроля состояния:

по протоколу HTTP: http://<WCS instance DNS name>:8081/?action=stat
по протоколу HTTPS: https://<WCS instance DNS name>:8444/?action=stat

Сделайте настройки и нажмите кнопку «Next: Add EC2 Instances»:

Configure-Health-Check_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

На пятом шаге настройки происходит добавление серверов к балансировщику. На текущий момент у нас запущен только инстанс с ролью CDN Origin, а балансировщик мы настраиваем для инстансов с ролью CDN Edge, поэтому на этом шаге не добавляем существующий инстанс к балансировщику. Нажмите кнопку «Next: Add Tags»

Следующий шаг позволяет назначить балансировщику теги. При необходимости указываем теги и нажимаем кнопку «Review and Create»:

Add_Tags_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

И, наконец, заключительный шаг. Проверяем конфигурацию балансировщика и нажимаем кнопку «Create» :

Review_and_Create_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Через несколько секунд получаем сообщение об успешном создании балансировщика. Нажмите кнопку «Close», что бы вернуться в консоль AWS:

Successfully_created_load_balancer_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

После создания балансировщика переходим к созданию шаблона запуска для автоматического создания новых инстансов.

Шаблон запуска

В левом боком меню выберите пункт «Launch Templates» в разделе «Instances» и нажмите кнопку «Create launch template»:

choose_create_launch_template_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Открывается мастер создания шаблонов запуска. В секции «Launch template name and description» укажите имя и описание шаблона:

Launch_template_name_and_description_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

В следующей секции «Amazon machine image (AMI)» выберите из выпадающего списка свежий образ Flashphoner WCS. Для быстроты и удобства можно воспользоваться поиском:

choose_Amazon_machine_image_AMI_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

В секциях «Instance type» «Key pair (login) » «Network settings» выберите тип создаваемого инстанса, пару ключей для доступа к инстансу по SSH, задайте тип сети и выберите группу безопасности для файрволла:

WM_settings_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

В следующей секции «Storage (volumes)» настройте размер и параметры жесткого диска для инстансов, которые будут созданы на основе этого шаблона:

storage_settings_AMI_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Затем разворачиваем секцию «Advanced details». Находим поле «User data» и вставляем скрипт для обновления WCS и настройки роли CDN Edge, после чего нажимаем кнопку «Create launch template» :

Create_launch_template_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Листинг кода скрипта для обновления 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» :

Choose_AutoScaling_Groups_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

В открывшемся мастере создания группы на первом шаге нужно указать шаблон запуска для новых инстансов, который мы создали ранее. Переключаем радиокнопку на использование шаблона и указываем нужный шаблон. Для перехода к следующему шагу нажмите кнопку «Next Step» :

choose_template_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

На следующем шаге мастера создания группы укажите имя группы, выберите версию «Latest» для шаблона запуска. Выберите пункт «Combine purchase options and instances» и укажите тип виртуальной машины для инстанса. Деактивируйте чекбокс «Use the default settings to get started quickly» и задайте соотношение между используемыми виртуальными машинами:

Configure_AutoScaling_group_details_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Ниже на этой странице разверните секцию «Advanced Details», активируйте чекбокс «Receive traffic from one or more load balancers» и укажите в поле «Classic Load Balancers» балансировщик, который мы создали ранее. После всех настроек нажмите кнопку «Next: Configure scaling policies»:

Configure_AutoScaling_group_advanced_details_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

На следующей странице мастера выбираем пункт «Use scaling policies to adjust the capacity of this group» Укажите минимальное и максимальное число инстансов в AutoScaling группе и задайте значения загрузки процессора и время, в течении которого должна сохранятся загрузка для запуска дополнительного инстанса. После указания настроек нажмите кнопку «Review»:

Configure_scaling_policies_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

На странице «Review» проверьте настройки и нажмите кнопку «Create Auto Scaling Group»:

Review_AutoScaling_group_create_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Получаем сообщение об успешном создании группы масштабирования. Нажмите «Close» для возврата в консоль:

Successfully_created_auto_scaling_group_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

На этом этап развертывания завершен. Если в балансировщике не было запущено ни одного инстанса, то новый инстанс запустится автоматически при создании группы масштабирования. При загрузке процессора этого инстанса более 80% будет выполнено условие масштабирования и запущены дополнительные инстансы.

Тестирование

Кроме подготовленных выше инстансов на AWS для тестирования понадобятся:

  • браузер Google Chrome;
  • аппаратная или виртуальная веб камера для организации трансляции видеопотока.

 

В браузере Google Chrome открываем web интерфейс WCS сервера по DNS имени инстанса с ролью CDN Origin:

https://<CDN Origin Instans DNS name>:8444

Авторизуемся в web интерфейсе и открываем пример «Two-way Streaming». Устанавливаем соединение с сервером по WebSocket и публикуем видеопоток:

Origin_publish_stream_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Затем, запускаем web интерфейс WCS CDN Edge сервера по DNS имени балансировщика:

https://<Load balancer DNS name>:8444

Авторизуемся в web интерфейсе, открываем пример «Media Devices» и устанавливаем соединение с балансировщиком по WebSocket. В правом столбце настроек снимаем чекбокс «default» для параметра «Size» и задаем значения для транскодирования видеопотока. Например, если поток на Origin сервере опубликован с размерами 320х240 задаем значение 640х480. Повторите действия в нескольких вкладках браузера, для имитации большого количества зрителей.

media_devices_playing_transcoding_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Транскодирование достаточно ресурсоемкий процесс и приведет к срабатыванию триггера для запуска дополнительных Edge серверов.

Для этого тестирования мы занизили порог срабатывания масштабирования до значения загрузки процессора 10%. Как видите на скриншоте ниже, после того как порог нагрузки на процессор был превышен более минуты, для снижения нагрузки были запущены два дополнительных инстанса:

run_additional_instances_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

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

http://<WCS instance DNS name>:8081/?action=stat

которую нужно открыть для каждого из инстансов, входящих в балансировщик. На странице статистики есть значение «connection_websocket» которое показывает число активных WebSocket сессий на сервере:

testing_websocket_statistic_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Настройка доменных имен

Для регистрации и управления доменными именами существует сервис «Amazon Route 53», который предоставляет пользователям высокодоступную и масштабируемую систему доменных имен (DNS). Сервис «Route 53» направляет запросы пользователей к инфраструктуре AWS, например к инстансам Amazon EC2 или балансировщикам нагрузки Elastic Load Balancing.

Для настройки доменных имен для CDN, которую мы создали выше выполните следующие шаги:

Откройте консоль управления сервисом «Route 53»:

open_route53_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Зарегистрируйте новое доменное имя или перенесите существующее:

create_domain_name_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

После регистрации или переноса доменного имени выбираем из меню в левой части окна пункт «Hosted zones» и переходим в созданную доменную зону:

open_domain_zone_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Для создания новых А записей серверов входящих в CDN нажимаем кнопку «Create Record Set»:

create_record_set_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Создаем записи для сервера Origin и балансировщика нагрузки:

create_record_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

В качестве проверки пробуем обратиться к серверам, входящим в CDN по созданным доменным именам:

testing_domain_name_WCS_Amazon_AWS_Marketplace_Balancer_AutoScaling_WebSocket_WebRTC

Итог

В результате всех работ мы создали CDN с балансировщиком нагрузки и автоматическим масштабированием, с помощью которой можно проводить любые видеотрансляции, для которых нужна низкая задержка. Балансировщик помогает нивелировать пиковые нагрузки, даже при такой ресурсоемкой операции, как транскодирование видео, что бы задержка в трансляции оставалась по прежнему низкой. А автоматическое масштабирование помогает сэкономить деньги на покупку лицензий и аренду виртуальных машин, потому что сервера запускаются только тогда, когда в этом есть потребность. Поэтому, будет не лишним один раз потратить время на настройку, что бы потом автоматические сервисы всегда были на подхвате.

Хорошего стриминга!

Ссылки

Наш демо сервер

WCS на Amazon EC2