HTTP Dynamic Streaming: настройка кластера веб серверов

This post is also available in: Английский

В сети Internet повсеместно предоставляются услуги доставки видео, но не везде это сделано удобным для клиента способом. В наших статьях уже освещалась тема постройки высокопроизводительных конфигураций по доставке видео контента на базе Adobe Flash Media Server. Но, иногда, доставка контента по протоколу HTTP является более оптимальным решением, и в этой статье мы расскажем Вам как построить производительную систему доставки видео-контента на базе веб-серверов NGINX и Apache.

Метод стриминга видео материалов с использованием технологии HTTP Dynamic Streaming предоставляет ряд преимуществ конечному пользователю:

  • обеспечивает более высокую производительность flash-приложений по сравнению с RTMP, вследствие меньшей загрузки RAM  (буфер видео потока при передаче через RTMP хранится в оперативной памяти, а при HTTP – на жестком диске)
  • предоставляет возможность пользователям, использующим медленные каналы связи, возможность поставить видео на паузу и дождаться его полной загрузки на ПК. Это позволяет пользователям просматривать видео даже в самом высоком качестве, независимо от скорости доступа в Интернет, что очень актуально для России, где далеко не все провайдеры перешли на современные каналы связи с высокой пропускной способностью.
  • при осуществлении навигации по единице видео контента буфер не сбрасывается

В этой статье мы рассмотрим процесс построения высокопроизводительной системы по HTTP доставке видео контента. Предлагаемое решение состоит из нескольких логических уровней: сетевое хранилище (дисковый массив), backend серверы (управление фрагментами), кеширующий frontend. Использование NGINX-сервера в роли frontend обеспечивает эффективное кеширование контента и, как следствие, повышает общую производительность системы. Наиболее оптимальным решением будет также использование интеллектуального балансировщика запросов на основе наличия контента в кеше frontend серверов, но это тема отдельной статьи.

Стоит сразу оговорится, что предлагаемая архитектура удобна для доставки контента в связке с Adobe Flash Access 2.0, но также она очень эффективна и в случае для доставки flv и f4v видео контейнеров.

Предварительные действия

Для построения кластера необходимо настроить связку отдающего видео фрагменты Apache версии =>2.2.x и NGINX =>0.8.x. Для этого вам потребуется модуль f4fhttp для Apache, который идет в составе поставки Adobe Flash Media Server.

Для упаковки / защиты видео файлов и разбиения их на фрагменты Вам также потребуется утилита компании Adobe f4packager, идущую в составе дистрибутива Adobe Flash Media Server.

Модуль f4fhttp и утилиту f4packager Вы можете загрузить с сайта Adobe (http://www.adobe.com/products/httpdynamicstreaming/), там же Вы можете ознакомиться с процедурой упаковки видеофайлов.

  • Формат FLV, также известный как Flash Video. Популярный формат, используемый в сети Internet для доставки видео контента. В настоящий момент применяется на таких крупных видео хостингах как Youtube и Google Video.
  • Формат F4V разработан в компании Adobe и оптимизирован для работы с Adobe FMS (например, DVR видео запись на FMS производится именно в этот контейнер) в сфере передачи HD-контента.
  • Формат F4F (MP4 fragment) также разработан компанией Adobe и позволяет хранить шифрованый видео контент (для этого необходимо наличие Adobe Flash Access 2.0). F4F является близким родственником f4v/flv, данные форматы объединяет  технология файловой сегментации,  наличие которой позволяет веб-серверу выполнять отдачу файла по частям. Примером использования данной операции может служить seek операция в Flash плеере, когда при переходе на другой фрагмент видео с веб-сервера подгружаются только нужные фрагменты файла. Подробней ознакомиться со спецификацией формата вы можете на сайте компании Adobe (http://help.adobe.com/en_US/HTTPStreaming/1.0/Using/WS4e5b2ae7575fffb8-4b53131d1272fa47d71-7ffc.html)

Оптимальная работа комплекса возможна при использовании высокопроизводительного хранилища данных. Например, использование ZFS и аппаратных flash акселераторов Sun Unified Storage 7000 серии позволяет достичь максимальной производительности при отдаче контента.

Настройка backend-сервера Apache
В спроектированной нами конфигурации Apache будет выполнять роль Origin сервера, который с помощью модуля f4fhttp будет производить сегментную выдачу видео-файлов *.f4f frontend серверам. Стоит отметить, что сфера применения данного решения не ограничивается отдачей f4f-видео. Для доставки flv-материалов Вы можете вместо Apache использовать NGINX, собраный с модулем ngx_http_flv_module (http://sysoev.ru/nginx/docs/http/ngx_http_flv_module.html). В этом случае backend NGINX будет отдавать сегменты FLV видео файлов, а frontend NGINX будет их кешировать. Таким образом решается проблема, что для выдачи видео сегмента веб серверу NGINX требуется закачать целиком файл.
Прежде всего необходимо обеспечить подгрузку модуля f4fhttp при запуске Apache-сервера. Для этого в конфигурационный файл httpd.conf добавьте следующую строку:

1
LoadModule f4fhttp_module modules/mod_f4fhttp.so

Предварительно нужно убедиться в наличии файлов модуля в данной директории.

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

1
2
mkdir /var/www/video
chown -c apache:apache /var/www/video

Когда директория создана, необходимо внести изменения в конфигурационный файл веб сервера добавив в него строки:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#Задаем DocumentRoot-директорию
DocumentRoot "/var/www/video"
#Определяем опции веб-сервера для работы с директорией
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
#Задаем параметры работы с директорией
<Location /vod>
#Включаем стриминг контента в рамках директории
HttpStreamingEnabled true
#Указываем физический путь до папки с видео файлами
#(актуально в случае использования symlink)
HttpStreamingContentPath "/var/www/video/vod"
</Location>

Настройка backend сервера завершена, теперь его следует перезапустить и перейти к следующей части.

Настройка frontend сервера NGINX
После установки сервера NGINX внесите в конфигурационный файл следующие изменения:

1
2
3
4
5
http {
…............
proxy_cache_path  /data/cache levels=1:2 keys_zone=my-cache:8m max_size=80G;
…............
}

Таким образом мы определяем кеш-зону для хранения кеша видео фрагментов размером в 80Gb.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location / {
….........
#Определяем  ключ кеширования. Кешировать мы будем по параметрам
#так в нашем случае имена видео файлов  всегда
#уникальны, тем самым гарантируется уникальность кеша
fastcgi_cache_key "$server_addr:$server_port$request_uri";
#Задаем адрес backend-сервера Apache,настроенного ранее
proxy_pass http://10.0.0.1:80;
#Определяем параметры работы с кешом
proxy_cache my-cache;
proxy_cache_valid  200 302  60m;
proxy_cache_valid  404      1m;
…........
}

После изменения конфигурационного файла запустите веб-сервер NGINX и попробуйте загрузить видео с помощью Flash плеера, настроенного на работу в режиме HTTP dynamic streaming. При корректной работе связки серверов, должна начаться передача видео контента. В папке /data/cache должно происходить создание структуры кеша:

1
#gizmo> watch ls -lah /data/cache
1
2
 Every  2.0s: ls -lah /data/cache/
Fri Dec 10 18:46:29 2010
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
total 68K
drwxr-xr-x 17 nginx nginx 4.0K Dec  3 14:18 .
drwxr-xr-x 10 root  root  4.0K Dec  4 18:33 ..
drwx------  3 nginx nginx 4.0K Dec  3 14:16 0
drwx------  4 nginx nginx 4.0K Dec  3 14:17 1
drwx------  5 nginx nginx 4.0K Dec  3 14:19 2
drwx------  7 nginx nginx 4.0K Dec  3 14:18 3
drwx------  3 nginx nginx 4.0K Dec  3 14:17 4
drwx------  4 nginx nginx 4.0K Dec  3 14:18 6
drwx------  5 nginx nginx 4.0K Dec  3 14:16 7
drwx------  3 nginx nginx 4.0K Dec  3 14:13 8
drwx------  5 nginx nginx 4.0K Dec  3 14:15 9
drwx------  3 nginx nginx 4.0K Dec  3 14:18 a
drwx------  5 nginx nginx 4.0K Dec  3 14:18 b
drwx------  3 nginx nginx 4.0K Dec  3 14:17 c
drwx------  5 nginx nginx 4.0K Dec  3 14:18 e
drwx------  4 nginx nginx 4.0K Dec  3 14:15 f

Для оптимальной работы данной конфигурации Вам также потребуется оптимизировать настройки ядра операционной системы и подобрать оптимальные опции кеширования NGINX. Подробнее о тюнинге ядра OS Linux мы расскажем в наших следующих статьях.