Difference between revisions of "AceStream 3.0"
(→Стартовые узлы) |
|||
(45 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
==Где скачать== | ==Где скачать== | ||
− | + | https://wiki.acestream.media/Download | |
− | |||
− | |||
==Changelog== | ==Changelog== | ||
+ | ''3.0.3'' | ||
+ | *исправлен баг с падением движка на некоторых трансляциях | ||
+ | *снижена нагрузка на процессор при отдаче на высоких скоростях | ||
+ | *оптимизированы алгоритмы поиска новых пиров | ||
+ | *оптимизировано взаимодействие клиентов со стартовыми серверами | ||
+ | |||
+ | ''3.0.2'' | ||
+ | *добавлена возможность фильтровать трафик на спец. узлах (см. [[#Фильтрация трафика|Фильтрация трафика]]) | ||
+ | |||
+ | ''3.0.1'' | ||
+ | *проведена масштабная оптимизация работы всех модулей | ||
+ | |||
+ | ''3.0.0-a18'' | ||
+ | *исправлен баг, из-за которого узлы поддержки могли потерять связь с источником | ||
+ | *параметр <tt>--title</tt> стал обязательным (в этом параметре передается "читабельное" название трансляции, которое выводится у пользователей в плеере при просмотре) | ||
+ | *добавлены два обязательных параметра для источника: | ||
+ | **<tt>--quality</tt> - качество канала; возможные значения: | ||
+ | ***SD | ||
+ | ***HD | ||
+ | **<tt>--category</tt> - категория канала; возможные значения: | ||
+ | ***informational - Информационный | ||
+ | ***entertaining - Развлекательный | ||
+ | ***educational - Познавательный | ||
+ | ***movies - кино | ||
+ | ***documentaries - Документалистика | ||
+ | ***sport - Спортивный | ||
+ | ***fashion - Мода | ||
+ | ***music - Музыкальный | ||
+ | ***regional - Региональный | ||
+ | ***ethnic - Этнический | ||
+ | ***religion - Религиозный | ||
+ | ***teleshop - Телемагазин | ||
+ | ***erotic_18_plus - Эротический 18+ | ||
+ | ***other_18_plus - Другие 18+ | ||
+ | ***cyber_games - Cyber Games | ||
+ | ***amateur - Любительский | ||
+ | ***webcam - вебкамера | ||
+ | ***kids - детский | ||
+ | ***series - сериалы | ||
+ | |||
+ | ''3.0.0-a12'' | ||
+ | *значительно оптимизирована нагрузка на процессор | ||
+ | *ликвидированы утечки памяти | ||
+ | |||
''3.0.0-a5'' | ''3.0.0-a5'' | ||
*добавлены стартовые узлы | *добавлены стартовые узлы | ||
Line 14: | Line 56: | ||
''3.0.0-a1'' | ''3.0.0-a1'' | ||
*первая альфа-версия | *первая альфа-версия | ||
+ | |||
+ | ==Как установить поверх старой версии== | ||
+ | * скачать архив для нужной ОС | ||
+ | * распаковать во временную папку (например, в /tmp/acestream) | ||
+ | * скопировать соответствующие файлы из временной папки в корневые папки /usr/bin/ и /usr/share/acestream (все старые файлы и папки можно удалить) | ||
+ | |||
+ | ВАЖНО: для работы новой версии движка должен быть установлен пакет <tt>python-setuptools</tt>. | ||
==Как запустить без удаления старой версии== | ==Как запустить без удаления старой версии== | ||
Line 62: | Line 111: | ||
===Новые параметры для запуска источника=== | ===Новые параметры для запуска источника=== | ||
*--metatracker (string) - добавить адрес метатрекера в транспортный файл | *--metatracker (string) - добавить адрес метатрекера в транспортный файл | ||
+ | *--startup-node (string) - добавить адрес стартового узла в транспортный файл | ||
===Эти параметры уже не используются=== | ===Эти параметры уже не используются=== | ||
Line 83: | Line 133: | ||
--port 8631 \ | --port 8631 \ | ||
--download-from "192.168.1.2:7764"</nowiki> | --download-from "192.168.1.2:7764"</nowiki> | ||
+ | |||
+ | ===Оптимизизация распределения трафика=== | ||
+ | Начиная с версии 3.0.5 узлы поддержки умеют автоматически находить пиров с хорошей скоростью отдачи и подсоединять их к себе. Данный алгоритм позволяет оптимизировать распределение трафика. Во время подключения таких пиров общее кол-во подсоединенных пиров может превысить значение <tt>--max-peers</tt>. Максимальное кол-во пиров сверх значения <tt>--max-peers</tt> задается опцией <tt>--core-sandbox-max-peers</tt> (по умолчанию 5). Если задать <tt>--core-sandbox-max-peers</tt> равным нулю, то алгоритм оптимизации распределения трафика будет отключен, поэтому делать это крайне не рекомендуется. | ||
===Приватные узлы=== | ===Приватные узлы=== | ||
Line 108: | Line 161: | ||
Стартовый узел принимает такой же набор параметров, как и узел поддержки. | Стартовый узел принимает такой же набор параметров, как и узел поддержки. | ||
− | + | ||
Стартовый узел принимает такой же набор параметров, как и узел поддержки, плюс некоторые дополнительные параметры: | Стартовый узел принимает такой же набор параметров, как и узел поддержки, плюс некоторые дополнительные параметры: | ||
*''<tt>--startup-node-max-connections (integer)</tt>'' - максимальное количество узлов, с которым стартовый узел держит постоянные соединения (если к узлу подключится больше других узлов, чем указано в этом параметре, лишние соединения будут разорваны). | *''<tt>--startup-node-max-connections (integer)</tt>'' - максимальное количество узлов, с которым стартовый узел держит постоянные соединения (если к узлу подключится больше других узлов, чем указано в этом параметре, лишние соединения будут разорваны). | ||
Line 114: | Line 167: | ||
*''<tt>--startup-node-upload-buffer (integer)</tt>'' - минимальный буфер в секундах, который будет отдан каждому подсоединившемуся узлу перед тем, как его можно будет отключить | *''<tt>--startup-node-upload-buffer (integer)</tt>'' - минимальный буфер в секундах, который будет отдан каждому подсоединившемуся узлу перед тем, как его можно будет отключить | ||
*''<tt>--startup-node-time-limit (integer)</tt>'' - максимальная длительность соединения в секундах, после достижения которой соединение может быть разорвано, даже если узел еще не получил необходмый объем данных. | *''<tt>--startup-node-time-limit (integer)</tt>'' - максимальная длительность соединения в секундах, после достижения которой соединение может быть разорвано, даже если узел еще не получил необходмый объем данных. | ||
− | |||
Пример запуска стартового узла: | Пример запуска стартового узла: | ||
Line 122: | Line 174: | ||
--port 8632 \ | --port 8632 \ | ||
--download-from "192.168.1.2:7764"</nowiki> | --download-from "192.168.1.2:7764"</nowiki> | ||
+ | |||
+ | Для того, чтобы стартовый сервер нормально работал, все узлы-клиенты должны знать его адрес и порт. | ||
+ | Для этого адрес и порт стартового сервера необходимо либо внести в транспортный файл (опция --startup-node при создании трансляции), либо использовать метатрекер для оповещения клиентов об адресах стартовых серверов. | ||
+ | |||
+ | Пример запуска источника с указанием адреса стартового узла: | ||
+ | <nowiki>acestreamengine \ | ||
+ | --stream-source-node \ | ||
+ | --port 7764 \ | ||
+ | --source "http://brodilo.tv/channel.php" \ | ||
+ | --startup-node "192.168.1.3:8632" | ||
+ | --name "test" \ | ||
+ | --title "test" \ | ||
+ | --quality SD \ | ||
+ | --category entertaining | ||
+ | --bitrate 350000 \ | ||
+ | --publish-dir /var/www/transport \ | ||
+ | --cache-dir /var/cache/acestream \ | ||
+ | --private-node 1 \ | ||
+ | --upload-to "192.168.1.3:8632"</nowiki> | ||
===Метатрекеры=== | ===Метатрекеры=== | ||
− | + | ||
+ | Метатрекер - это сервер, который сообщает узлам о доступных трекерах и стартовых узлах. | ||
+ | |||
+ | URL метатрекера задается на источнике при создании трансляции и записывается в транспортный файл. | ||
+ | |||
+ | Метатрекеры позволяют динамически добавлять трекеры и/или стартовые узлы для трансляции без необходимости перезапуска трансляции и пересоздания транспортного файла. | ||
+ | |||
+ | Пример запуска источника с метатрекером: | ||
+ | <nowiki>acestreamengine \ | ||
+ | --stream-source-node \ | ||
+ | --port 7764 \ | ||
+ | --source "http://brodilo.tv/channel.php" \ | ||
+ | --metatracker "http://example.org/metatracker.php" | ||
+ | --name "test" \ | ||
+ | --title "test" \ | ||
+ | --bitrate 350000 \ | ||
+ | --publish-dir /var/www/transport \ | ||
+ | --cache-dir /var/cache/acestream \ | ||
+ | --private-node 1 \ | ||
+ | --upload-to "192.168.1.3:8631"</nowiki> | ||
+ | |||
+ | Метатрекер принимает запросы по протоколу HTTP и выдает ответ в формате JSON, поэтому метатрекер может быть реализован на базе любого веб-сервера. | ||
+ | |||
+ | Каждый узел при запуске трансляции отправляет на метатрекер HTTP GET запрос с параметром <tt>infohash</tt> (хеш трансляции в виде hex-строки). Пример запроса на метатрекер: | ||
+ | <nowiki>http://example.org/metatracker.php?infohash=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3</nowiki> | ||
+ | |||
+ | Формат ответа: | ||
+ | <nowiki>{ | ||
+ | "trackers": ["tracker_url_1", "tracker_url_2", ...], | ||
+ | "startup_nodes": ["node1_address", "node2_address", ...], | ||
+ | "interval": UPDATE_INTERVAL_IN_SECONDS | ||
+ | }</nowiki> | ||
+ | |||
+ | где | ||
+ | *tracker_url_1, tracker_url_2 - URL трекеров | ||
+ | *node1_address, node2_address - адреса стартовых узлов в виде строк в формате ip:port (например, 192.168.1.2:8632) | ||
+ | *UPDATE_INTERVAL_IN_SECONDS - интервал обновления в секундах (как часто каждый клиент должен повторно обращаться на метатрекер) | ||
+ | |||
+ | Пример ответа: | ||
+ | <nowiki>{ | ||
+ | "trackers":["udp:\/\/tracker.example.org:2710\/announce"], | ||
+ | "startup_nodes":["192.168.1.3:8632"], | ||
+ | "interval":3600 | ||
+ | }</nowiki> | ||
+ | |||
+ | Пример серверного кода метатрекера на PHP: | ||
+ | |||
+ | <nowiki><?php | ||
+ | $infohash = isset($_GET['infohash']) ? $_GET['infohash'] : ''; | ||
+ | |||
+ | $trackers = array( | ||
+ | 'udp://tracker.example.org:2710/announce', | ||
+ | ); | ||
+ | |||
+ | $startup_nodes = array( | ||
+ | '192.168.1.3:8632', | ||
+ | ); | ||
+ | |||
+ | $data = array( | ||
+ | 'trackers' => $trackers, | ||
+ | 'startup_nodes' => $startup_nodes, | ||
+ | 'interval' => 30, | ||
+ | ); | ||
+ | |||
+ | header('Content-Type: application/json'); | ||
+ | echo json_encode($data);</nowiki> | ||
===Веб-интерфейс узла=== | ===Веб-интерфейс узла=== | ||
+ | Каждый узел имеет веб-интерфейс для просмотра текущего состояния, а также возможности изменения некоторых параметров "на лету" (без перезапуска узла). | ||
+ | |||
+ | Веб-интерфейс работает на основном порту узла (заданном параметром <tt>--port</tt>). | ||
+ | |||
+ | По умолчанию веб-интерфейс доступен только с той же машины, на которой запущен узел. | ||
+ | Для того, чтобы разрешить удаленный доступ, необходимо запустить узел с опцией <tt>--service-remote-access</tt>. | ||
+ | Также можно задать пароль на веб-интерфейс для предотвращения несанкционированного доступа с помощью опции <tt>--service-access-token</tt> | ||
+ | |||
+ | Полный список опций для настройки веб-интерфейса: | ||
+ | *<tt>--stats-report-interval</tt> - частота обновления статистики узла в секундах (по умолчанию 60) | ||
+ | *<tt>--stats-report-peers</tt> - если данная опция задана, то в мониторинг будет выдаваться список узлов, с которыми в данный момент соединен данный узел (по умолчанию список узлов не выводится) | ||
+ | *<tt>--service-remote-access</tt> - разрешить удаленный доступ на веб-интерфейс | ||
+ | *<tt>--service-access-token</tt> - задать пароль на веб-интерфейс | ||
+ | |||
+ | Доступ к веб-интерфейсу осуществляется по HTTP-GET запросом на порт узла: | ||
+ | *мониторинг - <nowiki>http://node.address:PORT/app/TOKEN/monitoring</nowiki> | ||
+ | *управление - <nowiki>http://node.address:PORT/app/TOKEN/update</nowiki> | ||
+ | |||
+ | Если узел запущен без опции <tt>--service-access-token</tt>, то TOKEN в запросе не указывается. | ||
+ | <br/>Ответы выдаются в формате JSON. | ||
+ | |||
+ | Примеры: | ||
+ | *запрос на узел без пароля на веб-интерфейс: | ||
+ | <nowiki>http://192.168.1.3:8640/app/monitor</nowiki> | ||
+ | *запрос на узел с паролем qwerty на веб-интерфейс: | ||
+ | <nowiki>http://192.168.1.3:8640/app/qwerty/monitor</nowiki> | ||
====Мониторинг==== | ====Мониторинг==== | ||
− | + | Интерфейс мониторинга выдает такую информацию: | |
+ | *<tt>version</tt> - версия узла | ||
+ | *<tt>max_connections</tt> - максимальное кол-во TCP-соединений | ||
+ | *<tt>max_peers</tt> - максимальное кол-во одновременно подсоединенных узлов | ||
+ | *<tt>max_upload_slots</tt> - максимальное кол-во открытых слотов для раздачи | ||
+ | *<tt>download_speed</tt> - текущая скорость загрузки данных (байт/с) | ||
+ | *<tt>upload_speed</tt> - текущая скорость отдачи данных (байт/с) | ||
+ | *<tt>connected_peers_count</tt> - кол-во подсоединенных узлов | ||
+ | *<tt>connected_peers</tt> - список подсоединенных узлов (пустой, если не задана опция --stats-report-peers) | ||
+ | *<tt>upload_slots</tt> - текущее кол-во слотов для раздачи | ||
====Управление==== | ====Управление==== | ||
− | + | Для изменения параметров узла "на лету" нужно отправить запрос такого вида на веб-интерфейс: | |
+ | <nowiki>http://192.168.1.3:8640/app/update?param1=value1¶m2=value2...</nowiki> | ||
+ | param1 и param2 задают названия параметров, которые необходимо обновить, value1 и value2 - новые значения для параметров. | ||
+ | |||
+ | Доступные для обновления параметры: | ||
+ | *<tt>max_peers</tt> | ||
+ | *<tt>max_upload_slots</tt> | ||
+ | |||
+ | Пример: | ||
+ | <nowiki>http://192.168.1.3:8640/app/update?max_peers=100&max_upload_slots=30</nowiki> | ||
+ | (держать соединения с 100 узлами одновременно и открыть 30 слотов на раздачу) | ||
+ | |||
+ | ===Фильтрация трафика=== | ||
+ | Начиная с версии 3.0.2 добавлена возможность фильтровать трафик на спец. узлах (источнике, узле поддержки и стартовом узле). Фильтровать можно по ip-адресам либо по геотаргетингу. Правила для фильтрации должны быть вынесены в отдельный конфигурационный файл, путь к которому передается спец. узлу в параметре --ip-filter-config. | ||
+ | |||
+ | Конфигурационный файл представляется собой текстовый файл в формате JSON с такой структурой: | ||
+ | <tt>{ | ||
+ | "groups": { | ||
+ | "<group_1>": { | ||
+ | "addresses": ["<ip_address_1>", "<ip_address_2>", ...], | ||
+ | "countries": ["<country_code_1>", "<country_code_2>", ...] | ||
+ | }, | ||
+ | "<group_2>": { | ||
+ | "addresses": ["<ip_address_1>", "<ip_address_2>", ...], | ||
+ | "countries": ["<country_code_1>", "<country_code_2>", ...] | ||
+ | }, | ||
+ | }, | ||
+ | "blacklist": { | ||
+ | "addresses": ["<ip_address_1>", "<ip_address_2>", ...], | ||
+ | "countries": ["<country_code_1>", "<country_code_2>", ...], | ||
+ | "groups": ["<group_1>", "<group_2>", ...] | ||
+ | }, | ||
+ | "whitelist": { | ||
+ | "addresses": ["<ip_address_1>", "<ip_address_2>", ...], | ||
+ | "countries": ["<country_code_1>", "<country_code_2>", ...], | ||
+ | "groups": ["<group_1>", "<group_2>", ...] | ||
+ | }, | ||
+ | "limit_groups": { | ||
+ | "<group_1>": "30%", | ||
+ | "<group_2>": "10%" | ||
+ | } | ||
+ | }</tt> | ||
+ | |||
+ | Раздел <tt>groups</tt> используется для создания именованных групп, на которые можно ссылать в других разделах файла. | ||
+ | Каждая группа может состоять из массива ip-адресов (<tt>addresses</tt>) либо кодов стран (<tt>countries</tt>). | ||
+ | |||
+ | Массив <tt>addresses</tt> может содержать как адреса отдельных хостов, так и адреса подсетей в формате xx.xx.xx.xx/yy. На данный момент разрешено использовать только подсети /24, /16 и /8. | ||
+ | |||
+ | Массив <tt>countries</tt> должен содержать коды стран в верхнем регистре (согласно базе [https://www.maxmind.com MaxMind]) | ||
+ | |||
+ | Раздел <tt>whitelist</tt> задает белый список. Узел отбивает соединения со всех адресов, которые не входят в белый список. | ||
+ | |||
+ | Раздел <tt>blacklist</tt> задает черный список. Узел отбивает соединения со всех адресов, которые входят в черный список. | ||
+ | |||
+ | Раздел <tt>limit_groups</tt> задает ограничения по максимальному количеству соединений для каждой группы (в процентах от общего максимального количества соединений). |
Latest revision as of 13:00, 17 October 2021
Contents
Где скачать
https://wiki.acestream.media/Download
Changelog
3.0.3
- исправлен баг с падением движка на некоторых трансляциях
- снижена нагрузка на процессор при отдаче на высоких скоростях
- оптимизированы алгоритмы поиска новых пиров
- оптимизировано взаимодействие клиентов со стартовыми серверами
3.0.2
- добавлена возможность фильтровать трафик на спец. узлах (см. Фильтрация трафика)
3.0.1
- проведена масштабная оптимизация работы всех модулей
3.0.0-a18
- исправлен баг, из-за которого узлы поддержки могли потерять связь с источником
- параметр --title стал обязательным (в этом параметре передается "читабельное" название трансляции, которое выводится у пользователей в плеере при просмотре)
- добавлены два обязательных параметра для источника:
- --quality - качество канала; возможные значения:
- SD
- HD
- --category - категория канала; возможные значения:
- informational - Информационный
- entertaining - Развлекательный
- educational - Познавательный
- movies - кино
- documentaries - Документалистика
- sport - Спортивный
- fashion - Мода
- music - Музыкальный
- regional - Региональный
- ethnic - Этнический
- religion - Религиозный
- teleshop - Телемагазин
- erotic_18_plus - Эротический 18+
- other_18_plus - Другие 18+
- cyber_games - Cyber Games
- amateur - Любительский
- webcam - вебкамера
- kids - детский
- series - сериалы
- --quality - качество канала; возможные значения:
3.0.0-a12
- значительно оптимизирована нагрузка на процессор
- ликвидированы утечки памяти
3.0.0-a5
- добавлены стартовые узлы
3.0.0-a2
- добавлены узлы поддержки
- добавлены опции для конфигурации приватных узлов и схемы распределения трафика между узлами поддержки и источником
3.0.0-a1
- первая альфа-версия
Как установить поверх старой версии
- скачать архив для нужной ОС
- распаковать во временную папку (например, в /tmp/acestream)
- скопировать соответствующие файлы из временной папки в корневые папки /usr/bin/ и /usr/share/acestream (все старые файлы и папки можно удалить)
ВАЖНО: для работы новой версии движка должен быть установлен пакет python-setuptools.
Как запустить без удаления старой версии
Альфа-версия может быть запущена на сервере одновременно с любой релизной версией.
Для запуска необходимо:
- скачать архив для нужной ОС
- распаковать архив в любую папку (например, в /opt/acestream/engine_new)
- запустить файл acestreamengine в распакованной папке с параметром --lib-path /path/to/acestream_libraries. Пример:
/opt/acestream/engine_new/acestreamengine --lib-path /opt/acestream/engine_new
Параметр --lib-path задает путь к библиотекам Ace Stream. По умолчанию используется путь /usr/share/acestream. Если на сервере уже установлена релизная версия движка, то без указания параметра --lib-path будет запущена она. Чтобы точно знать, какая версия движка запустилась, можно проверить версию из командной строки. Например, если уже установлена версия 2.1.6, то без указания --lib-path результат будет такой:
# /opt/acestream/engine_new/acestreamengine --version version: 2.1.6 revision: 293
С указанием --lib-path запустится новая версия:
# /opt/acestream/engine_new/acestreamengine --lib-path /opt/acestream/engine_new --version version: 3.0.0-a1 revision: 565
Запуск на CentOS
На CentOS есть некоторые особенности запуска движка.
Стандартная библиотека openssl на CentOS не поддерживает некоторый необходимый для движка функционал. В связи с этим в комплекте с движком для CentOS идет пересобранная библиотека openssl и модуль python-m2crypto, являющийся надстройкой над openssl. Эти библиотеки находятся в папке usr в архиве с движком. Для их использования необходимо скопировать папки lib64 и local из папки usr в соответствующие папки в /usr. Если на сервере уже установлен движок предыдущей версии, то эти библиотеки уже есть в вашей системе и их копировать не нужно.
Для запуска движка под CentOS вместо acestreamengine используется скрипт start.sh в папке с движком.
Этот скрипт устанавливает переменную среды LD_LIBRARY_PATH=/usr/local/ssl/lib перед запуском движка, чтобы использовалась пересобранная версия библиотеки openssl.
Также этот скрипт автоматически передает движку путь к библиотекам через параметр --lib-path, поэтому указывать его дополнительно не нужно.
Изменения в параметрах запуска
В новой версии есть некоторые отличия по параметрам запуска.
Новые флаги для запуска движка в разных режимах
- --stream-source-node (вместо --stream-source)
- --stream-support-node (вместо --stream-node)
Новые параметры для настройки кеша
- --live-cache-type (string) - тип кеша: disk - хранить кеш на диске в папке, указанной параметром --cache-dir, memory - хранить кеш в оперативной памяти (по умолчанию: disk)
- --live-cache-size (integer) - максимальный размер кеша в байтах (по умолчанию: 209715200 байт (200 Мб))
Новые параметры для конфигурации инфраструктуры узлов поддержки
- --private-node (0 or 1) - если указать 1, то узел будет приватным (по умолчанию 0)
- --download-from (string) - добавить адрес к списку узлов, с которых данному узлу разрешено получать данные. Адрес должен задаваться в формате ipv4_address:port. Этот параметр может встречаться несколько раз.
- --upload-to (string) - добавить адрес к списку узлов, которым данному узлу разрешено отдавать данные. Адрес должен задаваться в формате ipv4_address:port. Этот параметр может встречаться несколько раз.
- --monitor-node-ip (string) - ipv4 адрес мониторинг-сервера
Новые параметры для запуска источника
- --metatracker (string) - добавить адрес метатрекера в транспортный файл
- --startup-node (string) - добавить адрес стартового узла в транспортный файл
Эти параметры уже не используются
- --stream-source (изменен на --stream-source-node)
- --stream-node (изменен на --stream-support-node)
- --add-authorized-peers (список авторизированных пиров больше не добавляется в транспортный файл)
- --private-source (заменен на --private-node)
- --support-node
- --source-node
- --allow-source-download
- --allow-support-download
- --allow-peers-download
Новый функционал
Настройка узлов поддержки
В новой версии узлам поддержки необходимо явным образом указывать, с каких узлов они должны скачивать данные. Для этого используется параметр --download-from. Список узлов, с которых разрешено скачивание, может быть изменен без перезапуска узла поддержки через веб-интерфейс узла (см. ниже). Например, если по адресу 192.168.1.2:7764 запущен узел-источник и мы хотим запустить узел поддержки, который будет качать данные только с источника, то команда для запуска узла поддержки будет выглядеть так:
acestreamengine \ --stream-support-node \ --url http://192.168.1.2/transport/test.acelive \ --port 8631 \ --download-from "192.168.1.2:7764"
Оптимизизация распределения трафика
Начиная с версии 3.0.5 узлы поддержки умеют автоматически находить пиров с хорошей скоростью отдачи и подсоединять их к себе. Данный алгоритм позволяет оптимизировать распределение трафика. Во время подключения таких пиров общее кол-во подсоединенных пиров может превысить значение --max-peers. Максимальное кол-во пиров сверх значения --max-peers задается опцией --core-sandbox-max-peers (по умолчанию 5). Если задать --core-sandbox-max-peers равным нулю, то алгоритм оптимизации распределения трафика будет отключен, поэтому делать это крайне не рекомендуется.
Приватные узлы
Приватный узел отдает данные только узлам, которые явным образом добавлены в его список разрешенных. Для того, чтобы сделать узел приватным, нужно запустить его с параметром --private-node 1. Для добавления адреса в список разрешенных на отдачу используется параметр --upload-to. Приватным может быть как узел-источник, так узел поддержки. Приватный узел отбивает входящие соединения со всех адресов, кроме указанных параметрами --download-from, --upload-to и --monitor-node-ip. Для фильтрации используется только ip-адрес (порт не используется). Параметр --monitor-node-ip задает ip-адрес сервера мониторинга и используется в том случае, если нужно обеспечить мониторинг приватного узла (без указание этого параметра приватный узел будет отбивать все запросы от сервера мониторинга).
Пример запуска приватного источника, который будет отдавать данные только узлу поддержки из предыдущего примера:
acestreamengine \ --stream-source-node \ --port 7764 \ --source "http://brodilo.tv/channel.php" \ --name "test" \ --title "test" \ --bitrate 350000 \ --publish-dir /var/www/transport \ --cache-dir /var/cache/acestream \ --private-node 1 \ --upload-to "192.168.1.3:8631"
Стартовые узлы
Стартовый узел предназначен для обеспечения максимально быстрого старта трансляции у пользователей.
Особенность работы стартового узла - постоянная ротация соединений. При получении новых входящих соединений стартовый узел разрывает соединения с узлами, которые подключились ранее и уже скачали определенный объем данных.
Для запуска движка в режиме стартового узла используется параметр --stream-startup-node.
Стартовый узел принимает такой же набор параметров, как и узел поддержки.
Стартовый узел принимает такой же набор параметров, как и узел поддержки, плюс некоторые дополнительные параметры:
- --startup-node-max-connections (integer) - максимальное количество узлов, с которым стартовый узел держит постоянные соединения (если к узлу подключится больше других узлов, чем указано в этом параметре, лишние соединения будут разорваны).
- --startup-node-cleanup-interval (integer) - интервал очистки лишних соединений в секундах (по умолчанию: 1).
- --startup-node-upload-buffer (integer) - минимальный буфер в секундах, который будет отдан каждому подсоединившемуся узлу перед тем, как его можно будет отключить
- --startup-node-time-limit (integer) - максимальная длительность соединения в секундах, после достижения которой соединение может быть разорвано, даже если узел еще не получил необходмый объем данных.
Пример запуска стартового узла:
acestreamengine \ --stream-startup-node \ --url http://192.168.1.2/transport/test.acelive \ --port 8632 \ --download-from "192.168.1.2:7764"
Для того, чтобы стартовый сервер нормально работал, все узлы-клиенты должны знать его адрес и порт. Для этого адрес и порт стартового сервера необходимо либо внести в транспортный файл (опция --startup-node при создании трансляции), либо использовать метатрекер для оповещения клиентов об адресах стартовых серверов.
Пример запуска источника с указанием адреса стартового узла:
acestreamengine \ --stream-source-node \ --port 7764 \ --source "http://brodilo.tv/channel.php" \ --startup-node "192.168.1.3:8632" --name "test" \ --title "test" \ --quality SD \ --category entertaining --bitrate 350000 \ --publish-dir /var/www/transport \ --cache-dir /var/cache/acestream \ --private-node 1 \ --upload-to "192.168.1.3:8632"
Метатрекеры
Метатрекер - это сервер, который сообщает узлам о доступных трекерах и стартовых узлах.
URL метатрекера задается на источнике при создании трансляции и записывается в транспортный файл.
Метатрекеры позволяют динамически добавлять трекеры и/или стартовые узлы для трансляции без необходимости перезапуска трансляции и пересоздания транспортного файла.
Пример запуска источника с метатрекером:
acestreamengine \ --stream-source-node \ --port 7764 \ --source "http://brodilo.tv/channel.php" \ --metatracker "http://example.org/metatracker.php" --name "test" \ --title "test" \ --bitrate 350000 \ --publish-dir /var/www/transport \ --cache-dir /var/cache/acestream \ --private-node 1 \ --upload-to "192.168.1.3:8631"
Метатрекер принимает запросы по протоколу HTTP и выдает ответ в формате JSON, поэтому метатрекер может быть реализован на базе любого веб-сервера.
Каждый узел при запуске трансляции отправляет на метатрекер HTTP GET запрос с параметром infohash (хеш трансляции в виде hex-строки). Пример запроса на метатрекер:
http://example.org/metatracker.php?infohash=a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
Формат ответа:
{ "trackers": ["tracker_url_1", "tracker_url_2", ...], "startup_nodes": ["node1_address", "node2_address", ...], "interval": UPDATE_INTERVAL_IN_SECONDS }
где
- tracker_url_1, tracker_url_2 - URL трекеров
- node1_address, node2_address - адреса стартовых узлов в виде строк в формате ip:port (например, 192.168.1.2:8632)
- UPDATE_INTERVAL_IN_SECONDS - интервал обновления в секундах (как часто каждый клиент должен повторно обращаться на метатрекер)
Пример ответа:
{ "trackers":["udp:\/\/tracker.example.org:2710\/announce"], "startup_nodes":["192.168.1.3:8632"], "interval":3600 }
Пример серверного кода метатрекера на PHP:
<?php $infohash = isset($_GET['infohash']) ? $_GET['infohash'] : ''; $trackers = array( 'udp://tracker.example.org:2710/announce', ); $startup_nodes = array( '192.168.1.3:8632', ); $data = array( 'trackers' => $trackers, 'startup_nodes' => $startup_nodes, 'interval' => 30, ); header('Content-Type: application/json'); echo json_encode($data);
Веб-интерфейс узла
Каждый узел имеет веб-интерфейс для просмотра текущего состояния, а также возможности изменения некоторых параметров "на лету" (без перезапуска узла).
Веб-интерфейс работает на основном порту узла (заданном параметром --port).
По умолчанию веб-интерфейс доступен только с той же машины, на которой запущен узел. Для того, чтобы разрешить удаленный доступ, необходимо запустить узел с опцией --service-remote-access. Также можно задать пароль на веб-интерфейс для предотвращения несанкционированного доступа с помощью опции --service-access-token
Полный список опций для настройки веб-интерфейса:
- --stats-report-interval - частота обновления статистики узла в секундах (по умолчанию 60)
- --stats-report-peers - если данная опция задана, то в мониторинг будет выдаваться список узлов, с которыми в данный момент соединен данный узел (по умолчанию список узлов не выводится)
- --service-remote-access - разрешить удаленный доступ на веб-интерфейс
- --service-access-token - задать пароль на веб-интерфейс
Доступ к веб-интерфейсу осуществляется по HTTP-GET запросом на порт узла:
- мониторинг - http://node.address:PORT/app/TOKEN/monitoring
- управление - http://node.address:PORT/app/TOKEN/update
Если узел запущен без опции --service-access-token, то TOKEN в запросе не указывается.
Ответы выдаются в формате JSON.
Примеры:
- запрос на узел без пароля на веб-интерфейс:
http://192.168.1.3:8640/app/monitor
- запрос на узел с паролем qwerty на веб-интерфейс:
http://192.168.1.3:8640/app/qwerty/monitor
Мониторинг
Интерфейс мониторинга выдает такую информацию:
- version - версия узла
- max_connections - максимальное кол-во TCP-соединений
- max_peers - максимальное кол-во одновременно подсоединенных узлов
- max_upload_slots - максимальное кол-во открытых слотов для раздачи
- download_speed - текущая скорость загрузки данных (байт/с)
- upload_speed - текущая скорость отдачи данных (байт/с)
- connected_peers_count - кол-во подсоединенных узлов
- connected_peers - список подсоединенных узлов (пустой, если не задана опция --stats-report-peers)
- upload_slots - текущее кол-во слотов для раздачи
Управление
Для изменения параметров узла "на лету" нужно отправить запрос такого вида на веб-интерфейс:
http://192.168.1.3:8640/app/update?param1=value1¶m2=value2...
param1 и param2 задают названия параметров, которые необходимо обновить, value1 и value2 - новые значения для параметров.
Доступные для обновления параметры:
- max_peers
- max_upload_slots
Пример:
http://192.168.1.3:8640/app/update?max_peers=100&max_upload_slots=30 (держать соединения с 100 узлами одновременно и открыть 30 слотов на раздачу)
Фильтрация трафика
Начиная с версии 3.0.2 добавлена возможность фильтровать трафик на спец. узлах (источнике, узле поддержки и стартовом узле). Фильтровать можно по ip-адресам либо по геотаргетингу. Правила для фильтрации должны быть вынесены в отдельный конфигурационный файл, путь к которому передается спец. узлу в параметре --ip-filter-config.
Конфигурационный файл представляется собой текстовый файл в формате JSON с такой структурой:
{ "groups": { "<group_1>": { "addresses": ["<ip_address_1>", "<ip_address_2>", ...], "countries": ["<country_code_1>", "<country_code_2>", ...] }, "<group_2>": { "addresses": ["<ip_address_1>", "<ip_address_2>", ...], "countries": ["<country_code_1>", "<country_code_2>", ...] }, }, "blacklist": { "addresses": ["<ip_address_1>", "<ip_address_2>", ...], "countries": ["<country_code_1>", "<country_code_2>", ...], "groups": ["<group_1>", "<group_2>", ...] }, "whitelist": { "addresses": ["<ip_address_1>", "<ip_address_2>", ...], "countries": ["<country_code_1>", "<country_code_2>", ...], "groups": ["<group_1>", "<group_2>", ...] }, "limit_groups": { "<group_1>": "30%", "<group_2>": "10%" } }
Раздел groups используется для создания именованных групп, на которые можно ссылать в других разделах файла. Каждая группа может состоять из массива ip-адресов (addresses) либо кодов стран (countries).
Массив addresses может содержать как адреса отдельных хостов, так и адреса подсетей в формате xx.xx.xx.xx/yy. На данный момент разрешено использовать только подсети /24, /16 и /8.
Массив countries должен содержать коды стран в верхнем регистре (согласно базе MaxMind)
Раздел whitelist задает белый список. Узел отбивает соединения со всех адресов, которые не входят в белый список.
Раздел blacklist задает черный список. Узел отбивает соединения со всех адресов, которые входят в черный список.
Раздел limit_groups задает ограничения по максимальному количеству соединений для каждой группы (в процентах от общего максимального количества соединений).