Привет, Хабр! Меня зовут Роман Кармалов, в МТС Диджитал я руковожу группой, которая поддерживает инфраструктуру, в том числе работу прокси-серверов. В компании регулярно проводятся корпоративные онлайн-трансляции: их смотрит от двух до пятнадцати тысяч человек. Если не предпринять необходимых мер, то это вызовет нагрузку, которая может «уронить» внутреннюю инфраструктуру компании. В нашем случае решением проблемы стали кэширующие прокси-серверы на базе ПО Squid, сокращающие медиатрафик в десятки раз.

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

Зачем нам нужны отдельные прокси

Массовые видеотрансляции — всегда испытание для сетевой инфраструктуры. Поток Full HD на один VDI генерирует трафик в 2,5 Мб/с, а пять тысяч зрителей — уже 12,5 Гб/с. Растет нагрузка на межсетевые экраны, из-за чего могут деградировать другие сервисы, а у пользователей возникнут задержки видео и звука.

Для такой проблемы кэширующие прокси-серверы — проверенное решение. Его используют почти все крупные стриминговые платформы, например Netflix или Twitch. Альтернативой ему является настройка мультикаста (многоадресной IP-рассылки), при которой маршрутизатор пересылает трафик всем подключенным пользователям. Мы от него отказались, так как это слишком сложный и недостаточно гибкий в настройке способ, который вдобавок будет работать не у всех пользователей.

У прокси-серверов есть режим кэширования: при обращении к ним они берут контент из своего кэша, а не запрашивают его каждый раз у веб-ресурса. Помню историю на заре интернета, когда провайдеры из регионов с узкими каналами связи закупали и ставили оборудование, чтобы кэшировать трафик от Яндекса. По похожему принципу работают Google Cache Server, но в рамках своей CDN.

Для видеотрансляций мы взяли open-source-прокси Squid, который активно используем в других проектах.

Настройка прокси 

Особенность трансляций в том, что зрители смотрят примерно одни и те же фрагменты видео по 2–3 секунды. Прокси должен скачивать, кэшировать, отдавать, а затем удалять их. При этом серверу не нужно много ресурсов для их хранения.

Сначала мы попробовали кэширование на жесткий диск, но провели нагрузочное тестирование и увидели, что у него недостаточно производительности. В итоге отключили настройку кэша на диск и оставили такие настройки:

#Опции вытеснения — процент использования кэша, при котором он будет обновляться
cache_swap_low 85 
cache_swap_high 90

#Опция включения задержки: если у нас много запросов к одинаковому URL, который уже скачивается, то они ставятся в режим ожидания.
collapsed_forwarding on

#Объем кэша
cache_mem 5000 MB

#Максимальный размер файла, который можно кэшировать
maximum_object_size_in_memory 10 MB

Обратите внимание на опцию collapsed_forwarding: ее обычно выключают на прокси-серверах, через которые проходит много разного контента. При такой настройке процент обращения к кэшу будет низким и при видеотрансляциях трафик от прокси до удаленного ресурса может нагружать сеть.

В итоге для сервера нам подошла конфигурация 8 CPU, 32 Гб оперативной памяти и 40 Гб на диске под операционную систему. Мы проверили, сколько подключений может выдержать один прокси: без деградации работы сети мы дошли до двух с половиной тысяч соединений.

Размещение прокси в корпоративной сети

Наши трансляции идут с сервера подрядчика из интернета во внутреннюю сеть МТС, где ее уже смотрят сотрудники:

Среднее количество пользователей на один сервер
Среднее количество пользователей на один сервер

В МТС есть крупные региональные ЦОДы: по два в Москве, Санкт-Петербурге, Нижнем Новгороде, Краснодаре, Екатеринбурге, Новосибирске и на Дальнем Востоке. Мы разместили от одного до семи кэширующих серверов в каждом ЦОД в зависимости от числа сотрудников в регионе. Балансировка осуществляется с помощью механизма BGP ECMP.  

Общая схема размещения: кэширующие прокси из внутренней сети соединяются с серверами в DMZ, через которые идет доступ в интернет
Общая схема размещения: кэширующие прокси из внутренней сети соединяются с серверами в DMZ, через которые идет доступ в интернет

Для взаимодействия с внешними ресурсами трафик маршрутизируется через закрытые DMZ-сегменты и проходит несколько межсетевых экранов. В DMZ у нас находятся продуктовые прокси-серверы, которые управляют всем доступом в интернет из корпоративной сети. Кэширование можно было бы настроить н�� них, но мы решили создать отдельную систему, чтобы она не влияла на работу основных сервисов. Размещение кэширующих прокси во внутренней сети cнижает нагрузку на фаерволы в DMZ.

Пользователи обращаются к серверу в своем регионе и не создают сетевую нагрузку на межрегиональные каналы. Затем трафик идет через технологический прокси региона к CDN-сети транслятора в интернете. При необходимости масштабирования мы просто добавляем дополнительные серверы.

Как это работает

Для направления трафика на кэширующие прокси мы используем PAC/Wpad-файлы. В групповых политиках домена указывается адрес их размещения, настройки доступа и правила использования этих файлов на рабочих станциях. В самих PAC/Wpad-файлах для выделенных доменов видеотрансляции указываем использование кэширующего прокси, DIRECT для трафика на внутренние системы и продуктовые интернет-прокси для ресурсов в интернете.

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

Мои советы по работе с прокси для трансляций

Описанный мной способ уменьшил нагрузку на сеть в десятки раз. По всем прокси-серверам кэшируется до 98% трафика (тут и далее данные усреднены платформой мониторинга):

От каждого сервера к пользователям уходит почти 1 Гб/с:

В это же время от CDN-транслятора поток занимает не больше 14 Мб/с:

У нас есть возможность развивать систему дальше. Например, вынести прокси в удаленные офисы, до которых идет слабый или дорогой канал связи. Или оптимизировать число серверов, чтобы еще сократить объем идущего на них трафика. Но в целом в текущем виде система уже нас устраивает: пользователи смотрят трансляции в хорошем качестве, и сеть работает стабильно.

Если вы сталкиваетесь с похожей задачей кэширования медиатрафика, то учитывайте:

  • для трансляций лучше отключить использование диска, чтобы кэш хранился только в оперативной памяти — так вы избежите зависаний изображения и звука у зрителей;

  • по нашим тестам один прокси максимально выдерживает две с половиной тысячи коннектов. Поэтому при расчете своих систем можно ориентироваться на полторы тысячи подключений на сервер;

  • если у вас трансляция идет из внешней сети, то лучше разместить прокси в inside, чтобы не перегружать фаерволы на границах внутренних сегментов;

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

На этом у меня все. Если у вас появились вопросы или дополнения, пишите в комментариях.