Перейти к содержанию

Централизованный сбор статистики потоков и событий CDN в БД MySQL

Описание

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

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

Архитектура

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

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

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

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

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

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

Поле Тип Описание
serverIp varchar(15) IP адрес WCS
start datetime Время установки соединения
sessionId varchar(300) Идентификатор сессии
status varchar(30) Статус сессии
info varchar(300) Причина, для статуса FAILED
duration int(11) Длительность сессии

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

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

Поле Тип Описание
serverIp varchar(15) IP адрес WCS
start datetime Время начала медиасессии
sessionId varchar(300) Идентификатор сессии
mediaProvider varchar(30) Медиапровайдер
name varchar(300) Имя потока
mediaSessionId varchar(300) Идентификатор медиасессии
duration int(32) Длительность медиасессии
status varchar(30) Статус медиасессии
info varchar(300) Причина, для статуса FAILED
type varchar(100) Тип медиасессии (PUBLISH или SUBSCRIBE)
subscribers int(16) Количество подписчиков
audioLost int(2) Количество потерянных аудиопакетов
audioRate int(4) Битрейт аудио
audioCodec varchar(13) Аудио кодек
videoWidth int(2) Ширина картинки
videoHeight int(2) Высота картинки
videoPLI int(2) Количество PLI запросов
videoNack int(2) Количество NACK
videoRate int(4) Битрейт видео
videoFPS int(2) Частота кадров видео
videoBframes int(2) Количество B-фреймов
videoCodec varchar(4) Видео кодек
localSdp varbinary(1500) SDP на стороне сервера
remoteSdp varbinary(1500) SDP на стороне браузера

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

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

Поле Тип Описание
serverIp varchar(15) IP адрес WCS
date datetime Дата и время фиксации события
ts varchar(30) Метка времени CDN сигналинга
srcNode varchar(30) Источник CDN сигналинга
dstNode varchar(30) Приемник CDN сигналинга
event varchar(60) Тип события CDN
payload varbinary(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

Database schema file wcs.sql  Expand source

-- 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

Attachments:

FREP-arch.png (image/png)