Чтобы зрители были довольны, видеотрансляции должны идти с минимально возможной задержкой. Поэтому ваша задача, как разработчика какого-либо продукта связанного с видеотрасляциями — будь то система вебинаров, онлайн обучения или онлайн аукцион, обеспечить низкую задержку. В случае использования CDN низкая задержка обеспечивается использованием технологии WebRTC для передачи видеопотока от Origin сервера к Edge серверам, которые, в свою очередь, позволяют подключить большое количество зрителей. Но, если постоянно держать включенными некоторое количество серверов в расчете на большой наплыв зрителей, то, в то время, когда наплыва нет, деньги на аренду серверов расходуются зря. Оптимальным вариантом было бы запускать дополнительные Edge при увеличении потока зрителей и гасить их при уменьшении.

Ранее в нашем блоге мы уже писали о развертывании WCS CDN на базе DigitalOcean и AWS. В этой статье рассмотрим вариант развертывания CDN на базе Google Cloud Platform.

Google Cloud Platform — это стек облачных сервисов, которые выполняются на той же самой инфраструктуре, которую Google использует для своих продуктов. То есть, получается, что пользовательские приложения запущены в среде Google Cloud Platform, крутятся на тех же серверных мощностях, что и сам «великий и ужасный» Google, поэтому, по умолчанию, гарантируется бесперебойная работа и оптимизация сервисов для локальных сетей по всему миру.

Инфраструктура Google Cloud Platform, как и в случае с AWS, поддерживает автоматическое масштабирование и балансировку распределения нагрузки, поэтому не приходится беспокоиться о лишних расходах на оплату виртуальных серверов — вы платите только за то, что используете.

На момент написания статьи образа для быстрого развертывания WCS в GCP Marketplace не было. Но есть возможность автоматического развертывания WCS из образа виртуальной машины, который был подготовлен вручную. В этом случае, для WCS используется стандартная ежемесячная лицензия.

Теперь рассмотрим, как развернуть WCS CDN с балансировщиком и автоматическим масштабированием и процесс тестирования развернутой системы.

Развертывание CDN с балансировщиком и автоматическим масштабированием

Конфигурация CDN будет следующей:

  • один Origin сервер;
  • один Edge в составе балансировщика нагрузки, который позволяет во время пиковой нагрузки увеличить число Edge серверов до трех.

 

schema_cdn_load_balancer_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

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

  • глобальный файрволл на уровне проекта Google Cloud;
  • виртуальные машины WCS CDN Origin и WCS CDN Edge;
  • шаблон развертывания на основе образа диска WCS CDN Edge;
  • группу масштабирования;
  • балансировщик нагрузки.

 

Итак, приступим.

Настройка глобального файрволла на уровне Google Cloud

Настройка межсетевого экрана действует на все запущенные в вашем проекте сервера, поэтому начнем развертывание с нее.

В основном меню консоли Google Cloud откройте раздел «VPC networks» и выберите пункт «Firewall»:

choose_VPC_networks_firewall_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

На открывшейся странице нажмите кнопку «Create Firewall Rule» :

Click_Create_Firewall_Rule_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

В открывшемся мастере задайте имя правила:

name_firewall_rule_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Ниже на странице разрешите входящий трафик с любых компьютеров:

allow_traffic_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Еще ниже в секции «Protocols and ports» укажите порты для работы WCS и нажмите кнопку «Create»:

allow_firewall_ports_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

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

Развертывание сервера WCS Origin

В консоли Google Cloud откройте раздел «Compute Engine» и выберите из меню в левой части пункт «VM instances». Нажмите кнопку «Create» в диалоге создания нового экземпляра сервера:

create_an_instance_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

В открывшемся мастере укажите имя сервера, выберите регион и зону расположения датацентра, а также конфигурацию сервера. Выбор конфигурации сервера зависит от планируемых целей использования WCS, бюджета, региона и зоны расположения датацентра GCP. Для тестирования в рамках этой статьи мы используем минимальные технические характеристики виртуальных машин:

name_an_instance_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Ниже на странице в секции «Boot disk» нажмите кнопку «Change» и выберите образ «CentOS 7»:

choose_centos_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Разверните секцию «Management, security, disks, networking, sole tenancy»:

choose_advanced_settings_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

На вкладке «Security» добавьте публичный ключ для доступа к серверу по SSH:

add_public_SSH_key_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

На вкладке «Networking» в секции «Network interfaces» настройте внешний и внутренний IP адреса для сервера. Для работы в составе CDN серверу нужно назначить статический внутренний IP адрес:

networking_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

После всех настроек нажмите кнопку «Create» для создания нового экземпляра WCS сервера с ролью CDN Origin:

create_instance_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Спустя пару минут сервер будет создан и запущен. Подключаемся к нему по ssh и устанавливаем WCS. Все действия — установка, изменение настроек, запуск или перезапуск WCS — должны выполняться с root правами, либо через sudo.

1. Установите Wget, Midnight Commander и дополнительные инструменты и библиотеки

sudo yum -y install wget mc tcpdump iperf3 fontconfig

2. Установите JDK. Для работы в условиях больших нагрузок рекомендуется JDK 12 или 14. Удобнее провести установку при помощи скрипта на bash. Текст скрипта:

#!/bin/bash
sudo rm -rf jdk*
curl -s https://download.java.net/java/GA/jdk12.0.2/e482c34c86bd4bf8b56c0b35558996b9/10/GPL/openjdk-12.0.2_linux-x64_bin.tar.gz | tar -zx
[ ! -d jdk-12.0.2/bin ] && exit 1
sudo mkdir -p /usr/java
[ -d /usr/java/jdk-12.0.2 ] && sudo rm -rf /usr/java/jdk-12.0.2
sudo mv -f jdk-12.0.2 /usr/java
[ ! -d /usr/java/jdk-12.0.2/bin ] && exit 1
sudo rm -f /usr/java/default
sudo ln -sf /usr/java/jdk-12.0.2 /usr/java/default
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/java/jdk-12.0.2/bin/java" 1
sudo update-alternatives --install "/usr/bin/jstack" "jstack" "/usr/java/jdk-12.0.2/bin/jstack" 1
sudo update-alternatives --install "/usr/bin/jcmd" "jcmd" "/usr/java/jdk-12.0.2/bin/jcmd" 1
sudo update-alternatives --install "/usr/bin/jmap" "jmap" "/usr/java/jdk-12.0.2/bin/jmap" 1
sudo update-alternatives --set "java" "/usr/java/jdk-12.0.2/bin/java"
sudo update-alternatives --set "jstack" "/usr/java/jdk-12.0.2/bin/jstack"
sudo update-alternatives --set "jcmd" "/usr/java/jdk-12.0.2/bin/jcmd"
sudo update-alternatives --set "jmap" "/usr/java/jdk-12.0.2/bin/jmap"

3. Загрузите архив для установки самой свежей стабильной версии WebCallServer:

sudo wget https://flashphoner.com/download-wcs5.2-server.tar.gz

4. Распакуйте архив и запустите скрипт установки WCS и следуйте указаниям мастера установки. Для запуска WCS вам потребуется действительная лицензия. Для правильной работы команды, укажите номер сборки скачанного вами архива:

sudo tar -xvzf FlashphonerWebCallServer-5.2.714.tar.gz && cd FlashphonerWebCallServer-5.2.714 && ./install.sh

5. Для активации лицензии запустите скрипт «./activation.sh» из каталога установки WCS. Этот шаг, при желании, можно пропустить и активировать лицензию позже через веб-интерфейс:

sudo cd /usr/local/FlashphonerWebCallServer/bin && sudo ./activation.sh

6. Отключите firewalld и SELinux. Сетевой экран мы ранее настроили на уровне Google Cloud Platform, поэтому нет необходимости закрывать порты в операционной системе:

sudo systemctl stop firewalld && systemctl disable firewalld && setenforce 0

7. Откройте любым удобным редактором файл flashphoner.properties, который можно найти по пути:

/usr/local/FlashphonerWebCallServer/conf/flashphoner.properties

и внесите в него настройки для запуска CDN. В параметре «cdn_ip» укажите внутренний IP адрес вашей виртуальной машины с ролью CDN Origin:

cdn_enabled=true
cdn_ip=10.128.0.3 # Local IP address CDN Origin
cdn_nodes_resolve_ip=false
cdn_role=origin

На скриншоте ниже примерный вид файла flashphoner.properties для WCS с ролью CDN Origin:

properties_origin_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

После изменения настроек запустите (или перезапустите) Web Call Server:

systemctl start webcallserver

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

Запуск балансировщика нагрузки и автоматического масштабирования

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

  • образ диска, который будет использоваться в шаблоне при создании нового экземпляра WCS;
  • шаблон, на основе которого будут создаваться новые экземпляры сервера при масштабировании;
  • группа масштабирования;
  • балансировщик нагрузки;
  • настройки контроля активности сервера.

 

Создание образа диска

Начнем настройку с развертывания WCS сервера с ролью CDN Edge, для того, чтобы создать на его основе образ диска для шаблона создания новых экземпляров WCS в балансировщике.

Повторите инструкцию по подготовке сервера Origin до пункта о внесении настроек в файл flashphoner.properties. Для роли Edge внесите в этот файл следующие настройки:

cdn_enabled=true
cdn_ip=10.128.0.4
cdn_nodes_resolve_ip=false
cdn_point_of_entry=10.128.0.3
cdn_role=edge
http_enable_root_redirect=false

edge_properties_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

После внесения и сохранения настроек, остановите в консоли Google Cloud виртуальную машину WCS CDN Edge, выберите из меню в левой части пункт «Images» и нажмите кнопку «Create Image»:

choose_create_images_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

В открывшемся мастере укажите имя нового образа, выберите в качестве источника диск виртуальной машины WCS CDN Edge и нажмите кнопку «Create»:

create_edge_image_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

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

Создание шаблона развертывания

Выберите из меню в левой части окна консоли Google Cloud пункт «Instance templates» и нажмите кнопку «Create Instance template»:

choose_instans_template_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

В открывшемся мастере создания шаблона развертывания укажите имя шаблона и выберите конфигурацию виртуальной машины:

create_template_edge_name_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Ниже на странице в секции «Boot disk» нажмите кнопку «Change». в Открывшемся окне перейдите на вкладку «Custom Images» и выберите образ диска WCS CDN Edge, который мы создали ранее. Нажмите кнопку «Select»:

choose_edge_image_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Разверните секцию «Management, security, disks, networking, sole tenancy». На вкладке «Security» добавьте публичный ключ для доступа к серверу по SSH и нажмите кнопку «Create»:

create_template_add_public_SSH_key_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Шаблон развертывания для WCS с ролью CDN Edge создан. Теперь перейдем к созданию группы масштабирования.

Создание группы масштабирования

Из меню в левой части окна консоли Google Cloud выберите пункт «Instance groups» и нажмите кнопку «Create Instance group»:

choose_instans_group_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

На открывшейся странице выберите регион и зону расположения группы и укажите шаблон развертывания WCS Edge, который мы создали ранее:

create_group_edge_name_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

В секции «Autoscaling» на этой же странице настройте триггер запуска дополнительных серверов Edge. В качестве триггера будем использовать загрузку процессора более 80% . В поле «Maximum number of instances» укажите максимальное количество виртуальных машин, которые будут запущены при срабатывании триггера:

autoscaling_metric_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Затем включите проверку состояния виртуальной машины в секции «Autohealing». Для того, чтобы создать настройку проверки сервера, выберите из списка в поле «Health check» пункт «Сreate a health check»:

choose_create_health_check_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

В открывшемся мастере создания проверки состояния сервера укажите имя проверки, протокол TCP, порт 8081 и запрос /health-check. Настройте критерии проверки и нажмите кнопку «Save and continue»:

create_health_check_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Разверните секцию «Advanced creation options» и активируйте чекбокс «Do not retry machine creation». После чего нажмите «Create»:

advanced_creation_options_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Будет создана группа масштабирования и запущен один WCS с ролью CDN Edge. Последним этапом настройки нашей CDN с балансировщиком нагрузки и автоматическим масштабированием будет настройка балансировщика.

Создание балансировщика нагрузки

Сначала зарезервируем для балансировщика внешний IP адрес. В главном меню Google Cloud Platform в секции «VPC network» выберите пункт «External IP addresses» и нажмите кнопку «Reserve static address»:

reserve_static_address_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

На открывшейся странице в поле «Name» задаем имя для зарезервированного IP адреса. Выбираем уровень качества сетевых услуг для адреса и тип распространения. После завершения всех настроек нажимаем кнопку «Reserve»:

create_reserve_static_address_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Затем переходим к настройке балансировщика.

Выбираем пункт «Load balancing» в разделе «Network services» секции «Networking» основного меню Google Cloud Platform:

choose_create_loadbalancing_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Нажимаем кнопку «Create load balancer»:

Click_Create_load_balancing_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Затем, выберите тип балансировщика «TCP Load Balancing» и нажмите кнопку «Start configuration»:

start_configuration_load_balancing_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

На открывшейся странице укажите внешний балансировщик «From Internet to my VMs» и регион размещения серверов балансировщика. После выбора настроек нажмите кнопку «Continue»:

choose_type_region_load_balancer_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

На следующей странице задайте имя балансировщика, перейдите в раздел настроек «Backend configuration» и укажите в каком регионе будут созданы сервера входящие в состав балансировщика. На вкладке «Select existing instance groups» выберите группу масштабирования Edge серверов, которую мы создали ранее. В поле «Health check»выберите из выпадающего списка пункт «Сreate a health check»:

Backend_configuration_load_balancing_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

На открывшейся странице укажите параметры для проверки состояния работы балансировщика — порт 8081 и запрос /, после чего нажмите кнопку «Save and continue»:

choose_type_region_load_balancer_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Затем, перейдите к настройкам раздела «Frontend configuration». В этом разделе нужно создать привязку портов к внешнему IP адресу. Укажите внешний IP адрес для балансировщика, который мы зарезервировали выше и создайте конфигурации для TCP портов 8081, 8080, 8443, 8444 для HTTP(S) и WS(S). После создания необходимых портов нажмите кнопку «Create»:

Frontend_configuration_load_balancing_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

Балансировщик будет запущен. На этом развертывание CDN с балансировщиком и масштабированием можно считать завершенным. Переходим к тестированию.

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

Методика тестирования

Для проведения нагрузочного тестирования, при создании группы масштабирования мы выставили порог загрузки процессора для срабатывания триггера на 20%. Тестирование будем проводить с использованием браузера Google Chrome и виртуальной вебкамеры для организации трансляции видеопотока. Чтобы сымитировать повышение нагрузки на процессор запустим воспроизведение потока с транскодированием с помощью примера «Media Devices».

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

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

В браузере Google Chrome открываем web интерфейс WCS с ролью CDN Origin Авторизуемся, открываем пример «Two-way Streaming», устанавливаем соединение с сервером по WebSocket и публикуем видеопоток.

testing_origin_publish_stream_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

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

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

testing_edge_play_stream_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

В консоли Google Cloud видим, что были запущены две дополнительные виртуальные машины:

launch_additional_VM_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

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

http://<WCS instance IP address>:8081/?action=stat

Откройте страницу статистики для каждой виртуальной машины, запущенной балансировщиком. Значение «connection_websocket» показывает количество активных WebSocket сессий на каждой виртуальной машине.

testing_websocket_statistic_Google_Cloud_Platform_GCP_CDN_WCS_Balancer_AutoScaling_WebSocket_WebRTC

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

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

Ссылки

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

Документация

Быстрое развертывание и тест WCS сервера

WCS в Google Cloud Platform

Настройка балансировки нагрузки с масштабированием в GCP