Описание

При управлении большим количеством WCS серверов, необходим сбор статистики медиа потоков для оценки качества вещания. Если серверы объединены в CDN, сбор информации о событиях в CDN также может быть полезен для последующей отладки.

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

Архитектура

Функцию сервера сбора статистики можно назначить одному из WCS серверов, при этом он продолжает выполнять основные задачи (публикация и воспроизведение медиа потоков). Остальные серверы при этом передают ему данные статистики при помощи специального протокола FREP, основанного на TCP. Полученные данные сервер статистики помещает в БД MySQL.

Роль сервера статистики может быть назначена любому WCS серверу. Теоретически, каждый из WCS серверов в сети может быть сервером сбора статистики, и собирать данные непосредственно на общий MySQL сервер, но в этом случае нагрузка на сеть может сильно возрасти.

Рекомендуется назначать роль сервера статистики на Controller сервер в CDN

Описание таблиц данных

Данные собираются в следующие таблицы

Статистика клиентский сессий

ПолеТипОписание
serverIpvarchar(15)IP адрес WCS
startdatetimeВремя установки соединения
sessionIdvarchar(300)Идентификатор сессии
statusvarchar(30)Статус сессии
infovarchar(300)Причина, для статуса FAILED
durationint(11)Длительность сессии

Данные статистики клиентских сессий высылаются в начале и в конце сессии.

Статистика потоков

ПолеТипОписание
serverIpvarchar(15)IP адрес WCS
startdatetimeВремя начала медиасессии
sessionIdvarchar(300)Идентификатор сессии
mediaProvidervarchar(30)Медиапровайдер
namevarchar(300)Имя потока
mediaSessionIdvarchar(300)Идентификатор медиасессии
durationint(32)Длительность медиасессии
statusvarchar(30)Статус медиасессии
infovarchar(300)Причина, для статуса FAILED
typevarchar(100)Тип медиасессии (PUBLISH или SUBSCRIBE)
subscribersint(16)Количество подписчиков
audioLostint(2)Количество потерянных аудиопакетов
audioRateint(4)Битрейт аудио
audioCodecvarchar(13)Аудио кодек
videoWidthint(2)Ширина картинки
videoHeightint(2)Высота картинки
videoPLIint(2)Количество PLI запросов
videoNackint(2)Количество NACK
videoRateint(4)Битрейт видео
videoFPSint(2)Частота кадров видео
videoBframesint(2)Количество B-фреймов
videoCodecvarchar(4)Видео кодек
localSdpvarbinary(1500)SDP на стороне сервера
remoteSdpvarbinary(1500)SDP на стороне браузера

Данные статистики потоков высылаются в начале публикации или воспроизведения потока и по его окончании.

Статистика событий CDN

ПолеТипОписание
serverIpvarchar(15)IP адрес WCS
datedatetimeДата и время фиксации события
tsvarchar(30)Метка времени CDN сигналинга
srcNodevarchar(30)Источник CDN сигналинга
dstNodevarchar(30)Приемник CDN сигналинга
eventvarchar(60)Тип события CDN
payloadvarbinary(1500)Содержимое сообщения CDN сигналинга

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

Настройка

Настройка MySQL сервера

Установка

Приведем пример установки MySQL на Centos 7

1. Скачайте необходимый репозиторий

wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

2. Установите репозиторий

sudo rpm -ivh mysql57-community-release-el7-9.noarch.rpm

3. Установите MySQL

sudo yum install mysql-server

4. Запустите MySQL

sudo systemctl start mysqld

Настройка

1. Создайте базу данных и пользователя для записи статистики

CREATE DATABASE wcs;
CREATE USER 'wcs'@'localhost' IDENTIFIED BY 'wcs';
GRANT ALL PRIVILEGES ON wcs.* TO 'wcs'@'localhost';
FLUSH PRIVILEGES;

2. Импортируйте схему базы данных

mysql -u wcs -p wcs < wcs.sql
-- MySQL dump 10.13  Distrib 8.0.20, for Linux (x86_64)
--
-- Host: 172.17.0.2    Database: wcs
-- ------------------------------------------------------
-- Server version	5.7.31

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `cdn`
--

DROP TABLE IF EXISTS `cdn`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `cdn` (
  `serverIp` varchar(15) NOT NULL,
  `date` datetime NOT NULL,
  `ts` varchar(30) NOT NULL,
  `srcNode` varchar(30) NOT NULL,
  `dstNode` varchar(30) NOT NULL,
  `event` varchar(60) NOT NULL,
  `payload` varbinary(1500) NOT NULL,
  PRIMARY KEY (`ts`,`srcNode`,`event`,`dstNode`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Table structure for table `conndr`
--

DROP TABLE IF EXISTS `conndr`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `conndr` (
  `serverIp` varchar(15) NOT NULL,
  `start` datetime NOT NULL,
  `sessionId` varchar(300) NOT NULL,
  `status` varchar(30) NOT NULL,
  `info` varchar(300) DEFAULT NULL,
  `duration` int(11) DEFAULT NULL,
  PRIMARY KEY (`sessionId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Table structure for table `sdr`
--

DROP TABLE IF EXISTS `sdr`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `sdr` (
  `serverIp` varchar(15) NOT NULL,
  `start` datetime NOT NULL,
  `sessionId` varchar(300) NOT NULL,
  `mediaProvider` varchar(30) NOT NULL,
  `name` varchar(300) NOT NULL,
  `mediaSessionId` varchar(300) NOT NULL,
  `duration` int(32) DEFAULT NULL,
  `status` varchar(30) NOT NULL,
  `info` varchar(300) DEFAULT NULL,
  `type` varchar(100) DEFAULT NULL,
  `subscribers` int(16) DEFAULT NULL,
  `audioLost` int(2) DEFAULT NULL,
  `audioRate` int(4) DEFAULT NULL,
  `audioCodec` varchar(13) DEFAULT NULL,
  `videoWidth` int(2) DEFAULT NULL,
  `videoHeight` int(2) DEFAULT NULL,
  `videoPLI` int(2) DEFAULT NULL,
  `videoNack` int(2) DEFAULT NULL,
  `videoRate` int(4) DEFAULT NULL,
  `videoFPS` int(2) DEFAULT NULL,
  `videoBframes` int(2) DEFAULT NULL,
  `videoCodec` varchar(4) DEFAULT NULL,
  `localSdp` varbinary(1500) DEFAULT NULL,
  `remoteSdp` varbinary(1500) DEFAULT NULL,
  PRIMARY KEY (`sessionId`,`mediaSessionId`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2020-08-26 11:30:24

Настройка WCS

Поддержка сбора статистики включается настройкой

frep_enabled=true

Роль (клиент или сервер) задается настройкой (по умолчанию CLIENT)

frep_role=CLIENT

Адрес сервера статистики задается настройкой

frep_controller_ip=192.168.1.64

Эта настройка должна быть указана на клиенте.

URI базы данных задается настройкой

frep_database_address=jdbc:mysql://localhost/wcs?user=wcs&password=wcs

Эта настройка должна быть указана на сервере статистики.

Порт для передачи статистики задается настройкой (по умолчанию 8085)

frep_port=8085

Ключ авторизации на сервере статистики задается настройкой

frep_secret_key=dsjfoiewqhriywqtrfewfiuewqiufh

Эта настройка должна быть указана одинаково на клиентах и сервере.

Применение настроек

Все настройки могут быть применены без перезапуска сервера с использованием команды интерфейса командной строки

reload node-settings

В этом случае, рекомендуется изменять эти настройки следующим образом:

1. Отключите сбор статистики на данном сервере

frep_enabled=false

2. Перезагрузите настройки

reload node-settings

3. Установите необходимые значения настроек и включите сбор статистики

frep_enabled=true

4. Перезагрузите настройки

reload node-settings

Фильтрация сбора данных

Высылаемые данные могут быть отфильтрованы при помощи настройки

frep_filter_events=CONNECT,CONNECTION_STATUS_EVENT,STREAM,STREAM_STATUS_EVENT

Возможные значения фильтров

ЗначениеОписание
CONNECTДанные об установке соединений
CONNECTION_STATUS_EVENTДанные статуса сессии
STREAMДанные о захвате/воспроизведении потока
STREAM_STATUS_EVENTДанные статуса потока

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

frep_filter_events=CONNECT,CONNECTION_STATUS_EVENT,STREAM,STREAM_STATUS_EVENT,CDN_EVENT

либо отфильтровать события

ЗначениеОписание
ROLE_REFRESH
Роль узла CDN
NODE_REFRESHИнформация об узле CDN
ROUTE_REFRESHИнформация о маршрутах воспроизведения потоков
ROUTE_UPDATEОбновление маршрутов воспроизведения потоков
EXTENDED_ROUTE_UPDATEРасширенная информация об обновлении маршрутов
EXTENDED_ROUTE_REFRESHРасширенная информация о маршрутах
VERSION_REFRESHИнформация о версии CDN
STATE_REFRESHИнформация о статусе узла CDN
GROUP_REFRESHИнформация о группе CDN
PROFILE_UPDATEОбновление профилей транскодирования
STREAM_ACCESS_LIST_REFRESHОбновление списка ключей доступа к потоку
STREAM_ACCESS_LIST_NODE_ID_UPDATEОбновление идентификатора узла для сопоставления ключей доступа к потоку

Выборки информации из БД

Выборки данных из таблиц MySQL производятся при помощи SQL запросов

SELECT serverIP, start, name, status, audioCodec, videoCodec FROM wcs.sdr WHERE name = 'test';
+---------------+---------------------+-------------+------------+------------+------------+
| serverIP      | start               | name        | status     | audioCodec | videoCodec |
+---------------+---------------------+-------------+------------+------------+------------+
| 95.191.131.64 | 2020-08-10 13:44:00 | test        | PUBLISHING | opus       | H264       |
| 95.191.131.64 | 2020-08-10 13:44:10 | test        | PLAYING    | opus       | H264       |
+---------------+---------------------+-------------+------------+------------+------------+
2 rows in set (0.00 sec)

Выборка данных SDP

Из-за большого объема текста, SDP хранятся в БД в сжатом виде. Для того, чтобы распаковать данные при выборке, используются утилиты xxd и zlib-flate

mysql -u wcs -p -B --disable-column-names -e 'select hex(localSdp) from wcs.sdr where name = "test"' | xxd -r -p | zlib-flate -uncompress