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

  1. Быстрый старт
  2. How To
  3. Потоковое вещание
    1. Публикация
    2. Прием мультикаста
    3. Варианты источников
    4. Переключение источников
    5. Плейлисты
    6. Наложение логотипа
    7. Миксер
    8. WebRTC публикация
    9. SDI
    10. Отправка на другие сервера
    11. Распознавание DVB субтитров
  4. Транскодер
    1. Логотип
    2. Hardware
    3. Скриншоты
    4. Мозаика
  5. DRM
    1. Simple CAS
    2. Conax DRM
    3. BuyDRM (KeyOS)
  6. Авторизация
    1. Конструктор бэкендов
    2. Сервис сбора статистики
    3. Domain lock
    4. Middleware
    5. Secure links
    6. Ограничение сессий
    7. Мультиавторизация
    8. Бан IP адресов
    9. DVR
    10. Aliaser
  7. API
    1. HTTP API
    2. Events API
    3. MySQL API
    4. SQL API для кластеров
    5. SNMP
  8. Кластер
    1. Ретрансляция
    2. Кластерный захват
    3. Балансировщик нагрузки
    4. Пиринг
    5. Организация CDN
  9. VOD
    1. Кэш
    2. Облако
    3. Транскодирование файлов
  10. DVR
    1. Настройка
    2. Timeshift
    3. Catchup
    4. Проигрывание
    5. Экспорт в MP4
    6. Доступ по протоколам
    7. Timelapse
    8. API
    9. Кластеризация DVR
    10. Репликация
    11. Облако
  11. Воспроизведение
    1. HLS
    2. embed.html
    3. HTML5 с низкой задержкой
    4. Плеер HTML5 с низкой задержкой
    5. MPEG-TS
    6. RTMP
    7. DASH
    8. HDS
    9. RTSP
    10. multicast, CBR UDP
    11. WebRTC проигрывание
    12. H.265
  12. Администрирование
    1. Установка
    2. Обновление

    3. Конфигурация
    4. Мониторинг
    5. Производительность
    6. Лицензия
    7. LUA скрипты
    8. Безопасность
    9. Let's Encrypt
    10. Миграция
  13. IPTV
    1. Захват спутникового видео
    2. Транскодирование
    3. Middleware в IPTV OTT
    4. Экспорт EPG со спутника
    5. Группы каналов

Управление кластерами при помощи SQL API

Flussonic Media Server позволяет управлять потоками (создавать, обновлять, удалять и выбирать) по всему кластеру серверов через одну точку входа.

В этой статье мы подробно расскажем, как это сделать.

Важно! Не нужно устанавливать MySQL сервер.

Flussonic Media Server не работает с MySQL сервером.

Flussonic Media Server ведет себя так, как будто он и является MySQL сервером. Когда вы укажете mysql 3306; в конфигурационном файле /etc/flussonic/flussonic.conf, Flussonic Media Server привяжется к этому порту и будет работать в качестве сервера MySQL (с определенными функциональными возможностями).

Не устанавливайте MySQL сервер!

Обычно клиент MySQL пытается подключиться к серверу MySQL через сокет домена Unix. Когда вы скажете ему подключиться к localhost, он попытается открыть что-то вроде /tmp/mysql.sock или что-то еще. Flussonic слушает строго сокет TCP, поэтому при попытке сделать это на localhost, вам следует использовать 127.0.0.1. Как правило, это алиас, но в случае с клиентом MySQL существует разница.

Серверы в кластере Anchor Anchor x2

Сначала расскажем о концепции сервера в кластере. Каждый Flussonic Media Server знает о себе, а о наличии других серверов в кластере вы можете узнать с помощью директивы peer.

Серверы в кластере используют cluster_key для авторизации друг у друга. Чтобы настроить ключ кластера на текущем Flussonic Media Server, необходимо заявить cluster_key в конфигурационном файле. Добавив cluster_key в директиву сервера, вы сообщаете Flussonic Media Server, какой cluster_key следует использовать для подключения к другому серверу. По умолчанию, для соединения с пирами Flussonic Media Server будет использовать свой ключ кластера.

Если у вас есть два сервера: srv01.cdn.local и srv02.cdn.local, то их можно настроить следующим образом:

srv01.cdn.local:

http 80;
mysql 3306;
edit_auth admin secretpass;
cluster_key mcXpNJyZX3mSE3;
peer srv01.cdn.local;
peer srv02.cdn.local {
  cluster_key wjFxSiSG6EC6e2;
}

srv02.cdn.local:

http 80;
cluster_key wjFxSiSG6EC6e2;

Когда вы настроите их таким образом, srv01 будет периодически пинговать srv02 и извлекать информацию о состоянии потоков на нем.

Теперь давайте посмотрим, как получить такую же конфигурацию при помощи SQL API:

$ mysql -u admin -psecretpass -h srv01.cdn.local cluster
mysql> INSERT INTO peers (hostname,cluster_key) VALUES ('srv02.cdn.local','wjFxSiSG6EC6e2');
Query OK, 1 row affected (0.36 sec)

mysql> SELECT * FROM peers;
+----------------------+-----------+--------------------------------------+------+----------------+--------+------+
| hostname             | available | id                                   | port | cluster_key    | uptime | load |
+----------------------+-----------+--------------------------------------+------+----------------+--------+------+
| srv02.cdn.local      |         1 | bcac6edd-46a7-40cc-970a-5da3bec8d94b |   80 | wjFxSiSG6EC6e2 |  78715 | NULL |
| localhost            |         1 | cd30c5a4-3dda-4ac1-a2eb-a9b765918082 |   80 | mcXpNJyZX3mSE3 |   NULL |    0 |
+----------------------+-----------+--------------------------------------+------+----------------+--------+------+

Теперь вы получите такую же конфигурацию, как описано выше. Если вы видите идентификатор, это означает, что данный Flussonic смог подключиться к удаленному Flussonic и установить пиринг. Вы сможете видеть время работы и даже нагрузку (использование выходной полосы пропускания в процентах).

Удалить этот сервер из конфигурации можно так:

mysql> DELETE FROM peers WHERE hostname='srv02.cdn.local';
Query OK, 1 row affected (0.68 sec)

Теперь этот сервер удален и вы не будете видеть потоки с данного сервера.

Управление потоками Anchor Anchor x2

Вы можете получить доступ ко всем потокам на всех серверах из одного места через обычный SQL API.

Flussonic дает возможность хранить некоторые метаданные потока прямо в разделе конфигурации потока в файле flussonic.conf, поэтому вам, возможно, не понадобится вести таблицу streams в системе управления.

Поток идентифицируется по столбцу name и имеет столбец server с именем хоста того сервера, на котором "находится" поток.

Если вы создадите поток без указания сервера, он будет создан на том сервере, к которому вы подключены. Если же вы укажете сервер, поток будет создан на указанном сервере.

Не нужно указывать сервер при обновлении, удалении или выборе потока, потому что Flussonic Media Server автоматически найдет сервер, на котором выполняется поток, и выполнит на этом сервере необходимые действия.

Структура таблицы Peers Anchor Anchor x2

Таблица peers (сервера в кластере) содержит следующие поля:

Поле Тип Описание
hostname string
available bool
id string
port integer
https_port integer
rtmp_port integer
rtsp_port integer
cluster_key string
uptime integer
meta string
bandwidth_usage integer исходящий трафик в процентах от total_bandwidth
cpu_usage integer использование процессора в процентах
memory_usage integer использование памяти в процентах от RAM
total_clients integer
online_streams integer
total_streams integer
version string
build integer
is_remote bool
is_peer bool
is_source bool
error string
fetched_at integer
vsaas bool служебное
vsaas_endpoint string служебное
rproxy bool служебное
rproxy_streampoint_key string служебное
rproxy_endpoint_auth string служебное
camera_alarm integer
camera_alarm_address string
camera_alarm_patterns string

Структура таблицы Streams Anchor Anchor x2

Таблица streams широкая, потому что каждый поток содержит много информации.

Поле Тип Описание
name string имя потока
title string mpegts title
provider string mpegts title
static bool static / ondemand
pulse_off bool не учитывать поток в статистике потребления ресурсов
position integer положение (для vod файлов)
disabled bool
retry_limit integer
source_timeout integer
password string
publish_enabled bool
prefix string http://yourwebsite.com/…
max_bitrate integer
on_publish string
motion_detector_enabled bool
motion_detector_notify string
motion_detector_tags string
transcoder string
dvr_root string
hls_off bool включение / выключение протокола
hds_off bool включение / выключение протокола
rtmp_off bool включение / выключение протокола
rtsp_off bool включение / выключение протокола
dash_off bool включение / выключение протокола
mpegts_off bool включение / выключение протокола
webrtc_off bool включение / выключение протокола
m4s_off bool включение / выключение протокола
m4f_off bool включение / выключение протокола
mseld_off bool включение / выключение протокола
url_prefix string
segment_count integer
segment_duration integer
prepush integer
backup string
add_audio_only bool
max_sessions integer
thumbnails_enabled bool
thumbnails_url string адрес скриншотов (jpeg)
clients_timeout integer
push string
external_cache string служебное
auth_url string
domains string
allowed_countries string
disallowed_countries string
glue_ts bool
vsaas bool служебное
iptv bool служебное
comment string
coordinates string служебное
postal_address string служебное
owner string служебное
auth_token string служебное
mobile_token string служебное
access string служебное
onvif_url string служебное
onvif_profile string служебное
can_ptz bool служебное
dvr_protected bool служебное
agent_id string служебное
agent_pin string служебное
agent_key string служебное
agent_model string служебное
agent_serial string служебное
registered_at integer служебное
program_id integer служебное
stream_id integer служебное
extra string служебное
dvr string
dvr_no_index bool не создавать idx index
urls string
cluster_ingest bool
alive bool
remote bool
source_hostname string
lifetime integer служебное
start_running_at integer
ts_delay integer служебное
retry_count integer
client_count integer
last_dts integer служебное
last_dts_at integer служебное
last_access_at integer
input_error_rate integer служебное
bytes_in integer
bytes_out integer
out_bandwidth integer
bufferings integer служебное
bitrate integer
source_error string ошибка источника
url string
current_agent_id string служебное
agent_status string служебное
server string
published_from string IP адрес источника публикации
published_via string формат публикации
dvr_only bool служебное
running_transcoder bool
dvr_replication integer
dvr_replication_running bool

Здесь находятся не все параметры конфигурации. Мы работаем над заполнением таблицы.

Создание потока Anchor Anchor x2

При первом запуске свежего кластера у вас не будет никаких потоков:

mysql> select * from streams;
Empty set (0.00 sec)

Здесь и далее мы предполагаем, что на всех серверах вы сделали следующие настройки:

file vod {
  path priv;
}

и файл bunny.mp4 находится в пути priv.

Cоздадим потоки:

mysql> insert into streams (name,urls,dvr) values  ('bunny1','file://vod/bunny.mp4','movies 2d 20G');
Query OK, 1 row affected (0.02 sec)
mysql> select name,static,urls,lifetime,server from streams;
+--------+--------+----------------------+----------+-----------+
| name   | static | urls                 | lifetime | server    |
+--------+--------+----------------------+----------+-----------+
| bunny1 |      1 | file://vod/bunny.mp4 |    27029 | localhost |
+--------+--------+----------------------+----------+-----------+
1 row in set (0.01 sec)

Теперь заставим работать кластер:

mysql> insert into streams (name,urls,dvr,server) values  ('bunny2','file://vod/bunny.mp4','movies 2d 20G','srv02.cdn.local');
Query OK, 1 row affected (0.03 sec)

mysql> select name,static,urls,lifetime,server from streams;
+--------+--------+----------------------+----------+-----------------+
| name   | static | urls                 | lifetime | server          |
+--------+--------+----------------------+----------+-----------------+
| bunny1 |      1 | file://vod/bunny.mp4 |   108025 | localhost       |
| bunny2 |      1 | file://vod/bunny.mp4 |     3989 | srv02.cdn.local |
+--------+--------+----------------------+----------+-----------------+
2 rows in set (0.00 sec)

Таким образом, мы можем создавать потоки на всех наших серверах из единой точки входа. При этом нужно явно указать на каком сервере хотим создать поток.

Обновление потока Anchor Anchor x2

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

mysql> update streams set url_prefix='http://srv02.cdn.local' where name='bunny2';
Query OK, 1 row affected (0.02 sec)

mysql> select name,static,urls,lifetime,server,url_prefix from streams;
+--------+--------+----------------------+----------+-----------------+------------------------+
| name   | static | urls                 | lifetime | server          | url_prefix             |
+--------+--------+----------------------+----------+-----------------+------------------------+
| bunny1 |      1 | file://vod/bunny.mp4 |   429009 | localhost       | NULL                   |
| bunny2 |      1 | file://vod/bunny.mp4 |   319980 | srv02.cdn.local | http://srv02.cdn.local |
+--------+--------+----------------------+----------+-----------------+------------------------+
2 rows in set (0.01 sec)

Flussonic Media Server "знает", на каком сервере работает поток, поэтому он не потребует от вас указывать его.

Однако в пределах кластера поле name не уникально. Поэтому если вы дублировали имена потоков на нескольких серверах, то тогда нужно указать сервер, на котором вы собираетесь обновить поток.

Удаление потока Anchor Anchor x2

Давайте избавимся от одного из этих потоков:

mysql> delete from streams where name='bunny1';
Query OK, 1 row affected (0.02 sec)

mysql> select name,static,urls,lifetime,server,url_prefix from streams;
+--------+--------+----------------------+----------+-----------------+------------------------+
| name   | static | urls                 | lifetime | server          | url_prefix             |
+--------+--------+----------------------+----------+-----------------+------------------------+
| bunny2 |      1 | file://vod/bunny.mp4 |   593231 | srv02.cdn.local | http://srv02.cdn.local |
+--------+--------+----------------------+----------+-----------------+------------------------+
1 row in set (0.01 sec)

и удалим все остальные потоки:

mysql> delete from streams where name='bunny2';
Query OK, 1 row affected (0.02 sec)

mysql> select name,static,urls,lifetime,server,url_prefix from streams;
Empty set (0.00 sec)

При удалении потока Flussonic Media Server следует тому же правилу, что и для обновления или выбора. Если у вас в кластере один поток, он обнаружит его и изменит файл конфигурации этого удаленного сервера.

Миграция потоков между серверами Anchor Anchor x2

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

mysql> insert into streams (name,urls,dvr,server) values  ('bunny2','file://vod/bunny.mp4','movies 2d 20G','srv02.cdn.local');
Query OK, 1 row affected (0.03 sec)

mysql> select name,static,urls,lifetime,server from streams;
+--------+--------+----------------------+----------+-----------------+
| name   | static | urls                 | lifetime | server          |
+--------+--------+----------------------+----------+-----------------+
| bunny2 |      1 | file://vod/bunny.mp4 |     3889 | srv02.cdn.local |
+--------+--------+----------------------+----------+-----------------+
1 rows in set (0.00 sec)

mysql> update streams set server='srv03.cdn.local' where name='bunny2';
Query OK, 1 row affected (0.02 sec)

mysql> select name,static,urls,lifetime,server from streams;
+--------+--------+----------------------+----------+-----------------+
| name   | static | urls                 | lifetime | server          |
+--------+--------+----------------------+----------+-----------------+
| bunny2 |      1 | file://vod/bunny.mp4 |     3989 | srv03.cdn.local |
+--------+--------+----------------------+----------+-----------------+
1 rows in set (0.00 sec)

Перемещать потоки можно с любого сервера на любой другой. Flussonic Media Server будет создавать их на новых серверах и удалять старые.

Таблица GPU Anchor Anchor x2

Таблица gpu содержит информацию о текущей загрузке GPU.

Примеры запросов:

  • SELECT * FROM gpu
MySQL [cluster]> select * from gpu;
+---------+------+-------+-------------+--------+---------+---------+------+
| server  | hwid | power | temperature | memory | encoder | decoder | sm   |
+---------+------+-------+-------------+--------+---------+---------+------+
| encoder | nv1  |     8 |          37 |      0 |       0 |       0 |    0 |
| encoder | nv0  |    20 |          41 |      0 |       0 |       0 |    0 |
+---------+------+-------+-------------+--------+---------+---------+------+
2 rows in set (0.00 sec)
  • SELECT * FROM gpu ORDER BY sm DESC - отсортировать gpu по загрузке
mysql> select * from gpu order by sm desc;
+--------+------+-------+-------------+--------+---------+---------+------+
| server | hwid | power | temperature | memory | encoder | decoder | sm   |
+--------+------+-------+-------------+--------+---------+---------+------+
| 4gpu   | nv2  |    46 |          36 |      2 |      11 |       7 |    7 |
| 4gpu   | nv3  |    45 |          32 |      2 |      10 |       7 |    6 |
| 4gpu   | nv0  |    43 |          38 |      2 |       7 |       3 |    4 |
| 4gpu   | nv1  |    44 |          34 |      1 |       2 |       3 |    3 |
+--------+------+-------+-------------+--------+---------+---------+------+

Описание полей:

  • server - имя (hostname) сервера
  • hwid - ID карты, оно же используется в настройках транскодера(deviceid=1)
  • power - текущее потребление карты в ваттах
  • temperature - температура карты в градусах
  • memory - утилизация памяти в %
  • encoder - утилизация энкодера в %
  • decoder - утилизация декодера в %
  • sm - загрузка CUDA в %.