Сервис YouTube - видеохостинг, предоставляющий пользователям услуги хранения, доставки и показа видео
Функциональность сервиса
- Просмотр видео
- Загрузка видео
- Комментирование, лайки, подписки на канал
- Рекомендации на главной странице и на странице видео
- Авторизация
- Поиск
- Местоположение - Россия
- Размер аудитории на локальном рынке [1]
- месячный охват 95 млн. человек
- дневной охват 52 млн. человек
- Среднее время просмотра в день - 85 мин [2], хотя по миру это значение намного меньше [3]
- Некоторые факты об аудитории
Статистика для расчетов
Метрика | Аудитория | Значение | Обозначение |
---|---|---|---|
MAU (чел.)[6] | Мир | 2500 млн. | MAU_WORLD |
MAU (чел.)[7] | Россия | 95 млн. | MAU_RUS |
DAU (чел.)[8] | Россия | 52 млн. | MAU_RUS |
Количество просмотров / месяц [9] | Россия | 207 млрд. | VIEWS_MONTH |
Среднее время просмотра / день (мин)[10] | Россия | 86 | VIEW_DURATION_DAY |
Загрузка видео / минута (час)[11] | Мир | 500 | UPLOAD_MINUTE |
Загрузка видео / час (час)[12] | Мир | 30 тыс. | UPLOAD_HOUR |
Загрузка видео / день (час)[13] | Мир | 720 тыс. | UPLOAD_DAY |
Загрузка видео / месяц (час)[14] | Мир | 21.9 млн. | UPLOAD_MONTH |
Загрузка видео / год (час)[15] | Мир | 263 млн. | UPLOAD_YEAR |
Передача видео / минуту (час)[16] | Мир | 694 тыс. | DOWNLOAD_MIN |
Количество комментариев / 1000 просмотров[17] | Мир | 5 | COMMENTS |
Количество лайков / 100 просмотров[18]. | Мир | 4 | LIKES |
Количество новых подписок / день / канал [19] | Мир | 1000 | SUBS |
Количество поисковых запросов / день [20] | Мир | 3.5 млрд. | SEARCH_DAY |
Средняя продолжительность видео (мин)[21] | Мир | 11.7 | DURATION |
Количество посещений страниц / день / пользователь [22] | Мир | 9 | VISITS_DAY_USER |
Средняя продолжительность посещения сайта (мин)[23] [24] | Мир | 20 | VISIT_TIME |
Некоторую метрику на российском рынке приблизительно можно рассчитать относительно мировой метрики
- METRICS (rus) = METRICS (world) * (MAU / MAU)
- METRICS (rus) = METRICS (world) * K
- K = 95 / 2500 = 0.038
Действие пользователя | Количество / месяц |
---|---|
Просмотр видео | 207 млрд. |
Показ рекомендаций | 70 млрд. |
Добавление лайка | 8.3 млрд. |
Посещение сервиса (проверка авторизации) | 6.2 млрд. |
Поиск | 3.9 млрд. |
Подписка на канал | 3.6 млрд. |
Лента подписок | 2 млрд. |
Добавление комментария | 1 млрд. |
Загрузка видеоролика на канал | 4.3 млн. |
- Просмотров видео - VIEWS_MONTH.
- Комментарии - 1 млрд. / мес.
- На каждые 1000 просмотров приходится COMMENTS комментариев.
- Значит, в месяц происходит
VIEWS_MONTH / 1000 * COMMENTS = 207 млрд. / 1000 * 5 = 1 млрд
запросов на добавление комментария.
- Лайки - 8.28 млрд. / мес.
- На каждые 100 просмотров приходится LIKES лайков.
- Значит, в месяц происходит
VIEWS_MONTH / 100 * LIKES = 207 млрд. / 100 * 4 = 8.28 млрд
запросов на установку лайка.
- Подписки - 3.6 млрд. / мес.
- В среднем, каждый канал в день набирает SUBS подписчиков при MAU_WORLD активных пользователей в месяц.
- Приблизительно, каждый канал на локальном рынке в день набирает
SUBS * K = 1000 * 0.038 = 38
. - Значит,
MAU_RUS * 38 = 95 млн * 38 = 3.6 млрд
подписок осуществляется в месяц.
- Загрузка видеоролика на канал - 4.3 млн. / мес.
- В России загружается UPLOAD_MONTH часов контента в месяц.
- Каждое видео в среднем длится DURATION минут.
- Следовательно, 1.6 млн. видеороликов в месяц загружаются на платформу.
(UPLOAD_MONTH * K * 60) мин / DURATION = (21_900_000 час * 0.038 * 60) мин / 11.7 мин = 4.3 млн видеороликов
- Показ рекомендаций на главной странице - 70 млрд. / мес.
- В среднем, каждый пользователь в день посещает VISITS_DAY_USER страниц сервиса.
- Допустим, на каждые 3 посещения страницы видео приходится одно посещение главной страницы
- Тогда, общее количество посещений этих страниц, а, следовательно, и предложенных рекомендаций 276 млрд.
VIEWS_MONTH * 1/3 = 207 * 1/3 = 70 млрд
- Лента подписок - 2.07 млрд. / мес.
- Допустим, что на каждые 100 просмотров видео приходится 1 просмотр ленты подписок.
VIEWS_MONTH * 1/100 = 207 * 1/100 = 2.07 млрд
- Авторизация - 6.24 млрд. / мес
- При каждом пользовательском визите сервиса (при каждой новой вкладке браузера) клиентской стороне необходимо проверить авторизацию пользователя по id сессии.
- Допустим, что в день пользователь заходит на сервис 4 раза (
VIEW_DURATION_DAY / VISIT_TIME = 86 / 20 = 4
) - Тогда
DAU_RUS * 4 = 52 млн * 4 = 208 млн.
запросов на проверку авторизации в день. Значит,208 млн. * 30 = 6.24 млрд.
запросов на авторизацию в месяц.
- Поиск - 3.9 млрд. / мес.
- В день происходит SEARCH_DAY поисковых запросов
SEARCH_DAY * K * 30 = 3.5 млрд. 0.038 * 30 = 3.9 млрд
Хранилище | Стартовый размер (Пб) | Увеличение (Пб/год) |
---|---|---|
Видео | 540 | 540[25] |
Данные пользователя | 4 | 2 |
Сетевой трафик | Потребление |
---|---|
Загрузка видео (Пб / сутки) | 2.4 |
Отдача видео (Пб / сутки) | 133 |
Отдача статики (Пб / сутки) | 25 |
Средний исходящий трафик (Пб / сутки) | 158 (133 + 25) |
Пиковый трафик отдачи видео (Тбит / с) | 44 |
Пиковый исходящий трафик (Тбит / с) | 54 |
Пиковый входящий трафик (Тбит / с) | 0.8 |
Тип запроса | RPS (Статика) |
---|---|
Станица видео | 2.5 млн |
Главная страница | 1351 тыс |
Главная страница | 75 тыс |
Лента подписок | 38 тыс. |
Загрузка видеоролика на канал | 17 |
Тип запроса | RPS (API) |
---|---|
Станица видео | 307 тыс |
Главная страница | 54 тыс |
Добавление лайка | 6.4 тыс |
Проверка авторизации | 4.8 тыс |
Поиск | 3 тыс |
Подписка на канал | 2.8 тыс |
Лента подписок | 1.5 тыс |
Добавление комментария | 800 |
Загрузка видеоролика на канал | 4 |
- Видео
- Во всем мире UPLOAD_DAY часов видео загружается на платформу каждый день. Значит, в России будет загружаться
UPLOAD_DAY * K = 720 тыс. * 0.038 = 27_360 часов
контента в день. - Допустим, все видео имеют разрешения 1080p [26] [27] с частотой кадров 30 fps в формате SDR. В хранилище хранятся все варианты разрешений для обеспечения адаптивного битрейта.
- 2160p (4K) - 40 Mbps [28]
- 1440p (2K) - 16 Mbps
- 1080p - 8 Mbps
- 720p - 5 Mbps
- 480p - 2.5 Mbps
- 360p - 1 Mbps
(27_360 час * 60 * 60) сек * (8 + 5 + 2.5 + 1) Mpbs / 8 / 1024 = 198.4 тыс. Гб
- В день 95 млн. человек загружают 198.4 тыс. Гб видео. Значит, каждый год требуется
198_400 * 365 = 72 Пб
памяти для хранения видео (не включая резервные копии) - Для обеспечения надежности хранения данных в S3 хранилище допустим, что каждое видео имеет 2 резервных копии (хранение разных версий файлов не учитываем). Таким образом, в год необходимо резервировать хранилище размером 216 Пб.
- Так как в современном мире все больше выпускается 4K камер, данные разрешение становится все более и более доступным для пользователя. Поэтому увеличим размер хранилища в 2.5 раза (40 Mbps / 8 Mbps / 2 = 2.5). Выходит, 540 Пб.
- Пусть стартовый объем хранилища на первый год будет таким же.
- Во всем мире UPLOAD_DAY часов видео загружается на платформу каждый день. Значит, в России будет загружаться
- Пользовательские данные
- Рассчитаем размер данных в объектом хранилище на пользователя. Размер данных, хранящихся в СУБД, приведен в разделе Физическая схема БД.
- Допустим, остальные пользовательские данные имеют следующий размер
- Аватар пользователя - 2 Мб
- Превью видео - 10 Мб
- 36 Мб с учетом двух резервных копий необходимо на каждого пользователя.
- MAU_RUS - 95 млн, пользователей интернета в России - 130 млн.
- Допустим, что общее количество аккаунтов 110 млн, значит, стартовый размер хранилища
45 Мб * 110 млн =
4 Пб - Пусть увеличение хранилища в год требует двое меньше объема, т.к. многие данные фиксируются на момент регистрации пользователя.
- Среднее использование трафика (в сутки)
- Отдача видео (download) - 133 Пб / сутки
- В среднем, DOWNLOAD_MIN часов видео транслируется каждую минуту.
(DOWNLOAD_MIN * K * 60 * 60) (сек/мин) / 60 (сек/сек) * 8 Mbps / 8 / 1024 = 1545 Гб / сек
1545 * 60 * 60 * 24 = 133 Пб / сутки
- В среднем, DOWNLOAD_MIN часов видео транслируется каждую минуту.
Другой вариант расчета:
VIEW_DURATION_DAY * 60 * DAY_RUS * 8 Mbps / 8 / 1024 / 1024 / 1024 = 250 Пб / сутки
- Страницы (стартовая, страница видео, лента подписок) - 25 Пб / сутки
- html, js, css - 2 Мб
- Превью в формате WebP - 20 шт. * 50 Кб = 1 Мб
- Выше нами было допущено, что в месяц
- главная страница открывается 1/3 * VIEWS_MONTH раз
- страница видео открывается VIEWS_MONTH раз
- лента подписок открывается 1/100 VIEWS_MONTH раз
(1 + 1/3 + 1/100) * VIEWS_MONTH * 3 Мб / 30 = 1.34 * 207 млрд. * 3 Мб = 25 Пб / сутки
- Загрузка видео (upload) - 2.4 Пб / сутки
- В день загружается UPLOAD_DAY часов видео в день.
UPLOAD_DAY * 60 * 60 * 8 Mbps / 8 / 1024 / 1024 / 1024 = 720 тыс. * 60 * 60 * 8 Mbps / 8 / 1024 / 1024 / 1024 = 2.4 Пб / сутки
- В день загружается UPLOAD_DAY часов видео в день.
- Отдача видео (download) - 133 Пб / сутки
- Пиковое использование трафика (в секунду)
- Отдача видео (download) - 44 Тбит / c
- Допустим, что пиковое (дневное) потребление в 1.8 раза больше среднего [29] (слайд 14), получим
133 Пб/сутки * 1024 Тб * 1.8 / 86400 * 8 = 22 Тбит / c
- Также учтем некоторый запас по потреблению трафика - x2. Таким образом, потребление 44 Тбит/c.
- Допустим, что пиковое (дневное) потребление в 1.8 раза больше среднего [29] (слайд 14), получим
- Общее пиковое потребление (видео и страницы) - 54 Тбит / c
(133 Пб/сутки + 25 Пб/сутки) * 1024 Тб * 1.8 / 86400 * 8 * 2 = 54 Тбит / c
- Загрузка видео (upload) - 0.8 Тбит / c
- С учетом дневного пика и запаса (1.8 * 2 = x3.6) - 0.8 Тбит / c
- Отдача видео (download) - 44 Тбит / c
- Количество подзапросов для каждого действия пользователя
- Страница видео (18 запросов)
- Статика
- Первый видеочанк - 1 запрос
- Превью - 10 запросов
- html, js, css - 5 запросов
- Динамика
- Комментарии, кол-во лайков, просмотров, описание видео - 1 запрос
- Рекомендации - 1 запрос
- Статика
- Поиск / главная страница (26 запросов)
- Статика
- Превью - 20 запросов
- html, js, css - 5 запросов
- Динамика
- Поиск / Рекомендации - 1 запрос
- Статика
- Лента подписок (26 запросов)
- Статика
- Превью - 20 запросов
- html, js, css - 5 запросов
- Динамика
- Список подписок - 1 запрос
- Статика
- Добавление лайка (Динамика - 1 запрос)
- Подписка на канал (Динамика - 1 запрос)
- Добавление комментария (Динамика - 1 запроса)
- Загрузка видеоролика на канал (6 запросов)
- Статика
- html, js, css - 5 запросов
- Динамика
- Отправка параметров загрузки видео - 1 запрос
- Статика
- Проверка авторизации (Динамика - 1 запрос)
- Страница видео (18 запросов)
Увеличим каждое значение RPS в 2 раза для отказоустойчивости в случае пиковых нагрузок
Тип запроса | RPS (Статика) |
---|---|
Станица видео | 207 млрд / 30 / 86400 * 16 * 2 = 2.5 млн |
Главная страница | 70 млрд / 30 / 86400 * 27 * 2 = 1351 тыс |
Поиск | 3.9 млрд / 30 / 86400 * 27 * 2 = 75 тыс |
Лента подписок | 2 млрд / 30 / 86400 * 25 * 2 = 38 тыс. |
Загрузка видеоролика на канал | 4.3 млн / 30 / 86400 * 5 * 2 = 17 |
Тип запроса | RPS (API) |
---|---|
Станица видео | 207 млрд / 30 / 86400 * 2 * 2 = 307 тыс |
Главная страница | 70 млрд / 30 / 86400 * 1 * 2 = 54 тыс |
Поиск | 70 млрд / 30 / 86400 * 1 * 2 = 3 тыс |
Лента подписок | 2 млрд / 30 / 86400 * 1 * 2 = 1.5 тыс. |
Добавление лайка | 8.3 млрд / 30 / 86400 * 1 * 2 = 6.4 тыс |
Проверка авторизации | 6.2 млрд / 30 / 86400 * 1 * 2 = 4.8 тыс |
Подписка на канал | 3.6 млрд / 30 / 86400 * 1 * 2 = 2.8 тыс |
Добавление комментария | 1 млрд / 30 / 86400 * 1 * 2 = 800 |
Загрузка видеоролика на канал | 4.3 млн / 30 / 86400 * 1 * 2 = 4 |
Схема глобальной балансировки включает следующее:
- Кэши в локальных ISP.
- CDN подключены к крупным IX.
- GeoDNS выбирает ближайшую группу CDN.
- BGP Anycast до ближайшего CDN.
- CDN кэширует статику и ускоряет динамику с ЦОДов
Пояснения:
- Предложение всем локальным ISP использовать специальные Storage сервера сервиса YouTube[30] (уменьшение трафика с внешних линков ISP, ускорение доставки контента пользователям).
- Сеть CDN подключена к крупным точкам обмена трафика Internet Exchange (Cloud-IX объединяет в себе крупные Российские и не только IX [31])
- GeoDNS сервера определяют локацию пользователя и возвращают IP адрес, за которым находится группа CDN. CDN, в свою очередь, знают об адресах ЦОДов.
- Узлы сети в России распределены неравномерно [32], поэтому, если назначить всем CDN один IP адрес, BGP Anycast может выбрать оптимальный маршрут с точки зрения топологии (метрика - количество хопов), но географически неоптимальный [33]. Необходимо кластеризовать сервера CDN на локальные группы и назначить каждой группе один IP адрес. Маршрут до ближайшего к пользователю CDN в рамках группы будет выбран BGP роутером. Текущая конфигурация называется "Региональный Anycast" [34]. Преимущества и недостатки BGP Anycast [35].
- CDN, близкий к пользователю сервер, держит с граничными маршрутизаторами ЦОДов постоянные "прогретые" соединения (увеличенное окно передачи) для ускорения доставки динамического контента и статики. Статика кэшируется на CDN.
- Наибольшая плотность населения России приходится на западную и юго-западную часть [36].
- Расположим сервера в следующих городах: в Москве в двух зонах доступности и в Новосибирске (расположение ЦОДов в России [37][38])
- Сеть CDN будет состоять из 100 серверов, расположенных по всей стране.
- Сервера можно арендовать в ЦОДах существующих компаних, например, Selectel [39] имеет 2 AZ в Москве и 1 AZ в Новосибирске, или построить свои ЦОДы. Этот вопрос необходимо согласовать с бизнесом.
- CDN держит "прогретые" соединения с граничными маршрутизаторами в ЦОДах. Для обеспечения доступности и отказоустойчивости зарезервируем второй маршрутизатор (резервирование N+1). Используем для этого протокол BGP, который анонсирует одинаковую метрику другим AS и, соответственно, запросы балансируются хэшам.
- Многоуровневая балансировка. После граничного маршрутизатора следует слой коммутаторов, далее - слой L7 балансировщиков. Симметричная топология позволяет балансировать трафик посредством стека BGP, ECMP.
- на каждом балансере программный роутер (для BGP Anycast)
- режим ECMP per-flow для "закрепления" одной tcp сессии за одним сервером
- для избавления от поляризации в ECMP добавление соли в хэш каждым узлом.
- ECMP балансирует на основе 5-tuple hashing. Расширим реализацию добавлением consistent hashing для минимизации расщепления tcp сессий в случае добавления или удаление из балансировки L7 балансировщиков.
- L7 балансировщики - serive load balancer-ы вне кластера k8s. Сервисы расположены на отдельных bare-metal серверах из соображений безопасности, доступности, отказоустойчивости.
- реализация L7 balancer - envoy
- динамическое конфигурирование upsteram-ов через Service Discovery, который находится в кластере k8s
- функциональная балансировка по субдоменам и префиксам.
- rate limiting
- cache
- ssl termination. Оптимизация: session cache, session tickets
- Балансировка Service-ом запросов между подами в рамках одного replicaset. Т.к. сервис - это правила iptables, то балансировка примитивная - случайное распределение.
На рисунке представлена нормализованная ER диаграмма логического уровня, показывающая все сущности, связи между ними и атрибуты (ER-диаграмма)
Видеофайлы, превью видео, аватарки будут храниться в объектом хранилище. В соответствующих таблицах присутствуют ссылки на хранилище.
- Много чтений, мало записей (см. сводную таблицу продуктовых метрик)
- Чтение может отставать от записи (not consistency)
- Только что вышедший ролик может не сразу появляться на странице
- Лайк одного пользователя может не сразу инкрементировать счетчик лайков у другого
- Есть блогеры, у которых много контента (hot spot)
- Не толерантны к задержке
- Главная страница с рекомендациями должна загружаться быстро
- Видео на странице видео должно сразу воспроизводиться
- Большинство запросов селективные по ключу
Тип запроса | RPS (API) | Характер запроса |
---|---|---|
Станица видео | 307 тыс | Селективный запрос по video_id |
Главная страница | 54 тыс | Селективные запросы по video_ids (video_ids от рекомендательной системы) |
Добавление лайка | 6.4 тыс | Селективный запрос по video_id и инкремент поля |
Проверка авторизации | 4.8 тыс | Селективный запрос по user_id |
Поиск | 3 тыс | Full scan запрос |
Подписка на канал | 2.8 тыс | Селективный запрос по user_id и обновление поле списка подписчиков |
Лента подписок | 1.5 тыс | Селективный запрос по user_id, селективные запросы по video_ids |
Добавление комментария | 800 | Добавление записи по новому comment_id |
Загрузка видеоролика на канал | 4 | Добавление записи по новому video_id, загрузка исходного видео в хранилище, асинхронная обработка видео |
- Онлайн выдача рекомендаций по user_id
- Быстрые атомарные инкременты (количество лайков, подписчиков, комментариев, просмотров)
- Асинхронная многостадийная обработка загружаемых видео
Исходя из характера запросов и особенностей системы схему данных нужно денормализировать (см. физическую схему БД).
Денормализованная БД позволит не обращаться к разным сущностям для сбора всей информации, необходимой для рендера страницы, что уменьшит задержку. Однако вследствие дублирования данных в нескольких таблицах необходимо организовать асинхронные процессы обновления дублируемых полей в одних таблицах при обновлении этих полей в других.
При расчете размера хранения id всех сущностей имеет тип uuid4 (16 байт)
- СУБД
- Cassandra (key - wide columns)
- Индексы
- Partition key - video_id
- Запросы
- Запросы по video_id
- Чтение данных column set-а
- Обновление полей
- Добавление строки
- Запросы по video_id
- Подходы к масштабированию
- Шардирование по video_id
- Резервное копирование
- Присутствует
- Размер хранения - 2.3 Тб / год
- Средний размер строки 660 байт
- Загрузки видео имеет 4 RPS
660 * 4 * 86400 * 30 * 365 = 2.3 Тб / год
Замечания
- Размерность ML фичей фиксирована, поэтому количество столбцов заранее известно
- СУБД
- Mogno (document-oriented)
- Индексы
- btree index: (video_id, count_likes)
- btree index: (video_id, created_at)
- btree index: (video_id, comment_id)
- Запросы
- Топ комментариев по количеству лайков
- Новые комментарии
- Конкретный комментарий (для вложенных комментариев)
- Добавление новых комментариев
- Обновление полей
- count_likes
- text
- likes_user_ids
- username
- Подходы к масштабированию
- Много реплик на чтение (т.к. страница видео имеет большой RPS, каждый раз отображаются топ комментариев)
- Резервное копирование
- Присутствует
- Размер хранения - 227 Тб / год
- СУБД
- Tarantool (in-memory)
- Индексы
- btree index: (user_id, video_id)
- btree index: (user_id, created_at)
- Запросы
- Поиск реакции пользователя на видео (селективный запрос по ключу)
- Понравившиеся и просмотренные видео пользователя (количество лимитировано)
- Добавление строк
- Обновление views.continue по (user_id, video_id)
- Обновление likes.vote по (user_id, video_id)
- Подходы к масштабированию
- Шардинг по user_id
- Репликация master/slave
- Резервное копирование
- Присутствует
- Размер хранения - Лайки 240 Тб/год и просмотра 11 Пб / год
- Средний размер строки 44 байта
- Добавление лайка имеет 6.4 тыс. RPS
- Страница видео (добавление просмотра) имеет 307 тыс. RPS
- Лайки:
44 * 6400 * 86400 * 30 * 365 = 240 Тб / год
- Просмотры:
44 * 307000 * 86400 * 30 * 365 = 11.2 Пб / год
- СУБД
- Cassandra (key - wide columns)
- Инексы
- Partition key - user_id
- Запросы
- Запросы по user_id
- Чтение данных column set-а
- Обновление полей
- Добавление строки
- Запросы по user_id
- Подходы к масштабированию
- Шардирование по user_id
- Резервное копирование
- Присутствует
- Размер хранения - 57 Гб
- Средний размер строки - 530 байт
- В среднем на человека приходится 15 видео (
(UPLOAD_YEAR / MAU_RUS) * 60 / DURAION = 15
)
- В среднем на человека приходится 15 видео (
- MAU в России 95 млн. Берем 110 млн, т.к. необходимо хранить данные не только активных пользователей.
530 * 110_000_000 = 57 Гб
- Средний размер строки - 530 байт
- СУБД
- Redis (key - touple)
- Индексы
- Ключ - session_id
- Запросы
- Чтение по ключу session_id
- Добавление новой сессии
- Подходы к масштабированию**
- Шардирование по session_id
- Репликация master/slave
- Резервное копирование
- Присутствует
- Размер хранения - 3.7 Гб
- Средний размер строки - 40 байт
- MAU в России 95 млн. Сессии хранятся только активных пользователей.
40 * 95_000_000 = 3.7 Гб
- Kafka
- Прием логов, статистики, стриминг consumer-ам
- Очередь на обновление данных в денормализованной схеме
- Обеспечение работы pipeline-а обработки видео
- Буфер запросов
- Публикация событий, происходящих в системе
- S3
- Видеочанки
- Аватарки пользователей
- Превью видео
- ML модели
- Feature store
- Специализированная БД для хранения фич для ML
- Spark streaming
- Прием на потоке данных из kafka
- MapReduce (e.g. определение топ тегов для каждого видео)
- Hadoop
- Хранение данных для рекомендательной системы
- ClickHouse
- Аналитика для аналитиков
- Elastic Search
- Поиск видео по запросу
- Поиск по названию, описанию, тегам, специфике канала
- Новому пользователю рекомендуем самые популярные видео. Это видео за текущий месяц, которые быстро набирают просмотры.
- Подготовка рекомендаций (оффлайн в hadoop)
- Модель совстречаемости (item2item рекомендации): на каждой паре видео сопоставляем взвешенную сумму взаимодействий в рамках одной сессии. Таким образом для каждого видео можно получить список видероликов, которые пользователи смотрели вместе с первым, лайкали вместе с первым и т.д.
- Дешево по ресурсам. Совстречаемость можно пересчитывать не часто.
- Быстрая выдача онлайн.
- Нет учета особенностей пользователя. Однако на веб-сервисе YouTube не требуется в профиле заполнять предпочтения, хобби, любимые тематики видео и т.д.
- Модель совстречаемости (item2item рекомендации): на каждой паре видео сопоставляем взвешенную сумму взаимодействий в рамках одной сессии. Таким образом для каждого видео можно получить список видероликов, которые пользователи смотрели вместе с первым, лайкали вместе с первым и т.д.
- Ответ на запрос, формирование выдачи (онлайн)
- Подбор похожих видеороликов на те, которые пользователь смотрел недавно (последний месяц или неделя)
- Видео, для которых нужно найти похожие по модели совстречаемости, ранжируются исходя из веса взаимодействия с ними пользователя: время просмотра видео, наличие лайка, наличие комментария.
- Походы в БД за метаданными видео по id (превью, название, канал), проверка.
- Чистовое ранжирование
- фильтрация
- разнообразие
- сортировка рекомендуемых видео (по популярности видео, по соотношению лайков / дизлайков, по новизне)
Видео, которые присутствовали в рекомендациях,
- не встречаются больше в рекомендациях
- анализируются на предмет клика по ним пользователя (для валидации модели).
User2item рекомендации дорогие по ресурсам, так как каждый новый просмотр требует пересчета всего списка рекомендаций. Поэтому используем item2item для подготовки рекомендаций и динамическое ранжирование для конкретного пользователя.
Источник [45]
Асинхронный пайплан обработки видео состоит из следующих стадий. Запускается во много потоков на многих нодах.
- Разбиение исходных видеофайлов на чанки
- Фильтрация контента нейросетями (цензура).
- Определение ключевых тегов видео, категории видео нейросетями.
- Транскодирование видеочанка в несколько форматов, чтобы обеспечить доступность для разных типов устройств (MP4, WebM и т.д.)
- Конвертация видеочанка в различные разрешения (1080, 720, 480 и т.д.)
- Загрузка видео на главные сервера CDN и в кластер S3.
Технология | Применение | Обоснование |
---|---|---|
Go | Backend, основной язык сервисов | Простота языка, удобные тулзы из коробки, высокая утилизация CPU |
C | Backend, высоконагруженные сервисы | Оптимизация узких мест, ускорение высоконагруженных частей проекта |
Python | Рекомендательная система, PySpark для запросов в Hadoop, ML задачи | Единый язык для ML задач |
TypeScript, React | Frontend | Типизация, сокращение человеко-часов не отладку, ускорение процесса разработки, компонентный подход |
ELK* | Автоматизация работы с логами. Хранение и поиск данных, обработка и фильтрация, интерфейс для администрирования [46] | Масштабируемость, отказоустойчивость, гибкость поиска, REST API, универсальность [47]. Конкуренты: Splunk, Graylog |
Vault | Хранилище секретов | Специализированная БД для хранения секретов, поддержка полного жизненного цикла секрета, политики доступа [48] Конкуренты: облачные решения, хранение в репозитории |
Jaeger | Система трассировки | - |
VictoriaMetrics | Хранение метрик и работа с метриками | Производительность, меньший объем для хранения, чем в Prometheus [49] [50]. Конкуренты: Prometheus, graphit [51] |
Grafana | Визуализация графиков, мониторинг и алерты | Конкуренты: Kibana |
Kafka | Стриминговый сервис, брокер сообщений | Партиционирование из коробки, много топиков, сообщения могут быть прочитаны многими consumer-ами. Конкуренты: Pulsar, RabbitMQ [52] |
Envoy | Балансировщик, reverse proxy | Динамическое чтение логов из SD, бОльшая функциональность, чем в nginx, поддержка gRPC [53]. Конкуренты: HAProxy, nginx, traefic |
GitHub | Система контроля версий, командная разработка, CI/CD. | - |
Kubernetes | Deploy | Масштабирование, отказоустойчивость, утилизация ресурсов |
Redis | Кэш сессий | Конкуренты: Tarantool |
Tarantool | Хранение лайков и просмотров | In-memory, persistence. Конкуренты: Redis |
Cassandra | Хранилище метаданных пользователя и видео | Линейная масштабируемость, обработка больших объемов, высокая производительность, доступность, децентрализованная архитектура. Column-Family. [54] Конкуренты: Apache HBase, Bigtable (строгая согласованность), ScyllaDB |
MongoDB | Хранение комментариев | Формат хранения данных json. Конкуренты: PostreSQL |
S3 | Хранение статического контента | Стандартный протокол. Конкуренты: облачные решения |
Hadoop | Big Data | Стандартный утилиты, spark запросы. Конкуренты: YTsaurus |
ClickHouse | Аналитическая БД | Производительность, масштабируемость, сжатие, язык запросов, большие объемы данных, поддержка Golang Конкуренты: Vertica, GreenPlum |
Elastic Search | Поиск видео | Специализированная БД для задач полнотекстового поиска |
HTTP/3 | Протокол L7 | Транспортный протокол Quic поверх UDP, отсутствие проблем TCP (блокировки head-of-line, RTT) |
HESP [55] | Протокол стриминга видео | Адаптивный битрейт, низкие требования к полосе пропускания, поверх HTTP, поддержка онлайн трансляций. [56] Конкуренты: WebRTC, HLS, RTMP, HTTP range requests |
- Резервирование аппаратных ресурсов, серверов, дисков (raid-массивы)
- Использование крупных IX для размещения CDN серверов
- Резервирование CDN, резервирование ДЦ, резервирование граничных роутеров на входе в ДЦ (BGP Anycast)
- Многоуровневая локальная балансировка до k8s кластера
- Граничные роутеры
- Уровень access switch-ей
- Уровень L7 балансировщиков
- Резервные копии файлов в S3 хранилище, tired S3
- Расчеты пикового трафика и размера хранение с коэффициентом запаса
- Взаимодействие между сервисами
- План Б при отказе сервисов, урезанная выдача, fallback реализации на более простую
- Например, топ видео вместо рекомендательной системы
- Рекомендации двухдневной давности
- Circuit breaker (возможность проблемному сервису восстановиться - временное отключение)
- Установка дедлайнов по 99.95 персентилю, deadline propagation
- Re-try requests (повторные запросы в рамках дедлайна для времени обработки исходного запроса)
- План Б при отказе сервисов, урезанная выдача, fallback реализации на более простую
- Rate limiting для клиента (например, алгоритм Token Bucket)
- SIEM-система - анализ трафика на возможность атаки
- Использование k8s
- минимизация отказов, т.к. оркестратор масштабирует сервисы исходя из текущей нагрузки
- эфимерность stateless подов (перезапуск, реплицирование)
- способ деплоя Rolling updates
- замена подов со старой версией один за другим на поды без простоя
- оркестратор дожидается готовности новых pod'ов (readiness пробы) прежде чем приступить к сворачиванию старых
- возникшая проблема - обновление прерывается без простоя кластера.
- liveness и readiness пробы от kubelet
- etcd
- надежность при (n / 2) + 1 живых узлах
- каждый узел хранит копию узла-лидера
- все изменения должны быть приняты большинством перед сохранением
- CQRS
- синхронное чтение из БД
- асинхронная запись через брокер сообщений
- event-driven архитектура (content processor на общей схеме, запись в денормализованную схему, статистика для )
- применения
- content processor
- запись в денормализованную схему
- статистика для сервисов агрегации статистики
- события публикуем в брокер сообщений
- consumer-ы на другой стороне асинхронно обрабатывают события
- применения
- Отказоустойчивость БД
- Используемые БД устойчивы к разделению (P из CAP теоремы)
- Отказоустойчивость - второе имя Cassandra. Отсутствие центрального узла - отсутствие bottleneck. Все узлы непрерывно общаются между собой. Репликация данных на большие число узлов в кластере.
- Реплицирование / шардирование обеспечивают отказоустойчивость при многочисленных транзакциях на чтение / запись
- Резервное копирование, снапшоты и xlog-и (binlog, wal) для восстановительных операций.
- 100 CDN (Для сравнения CDN Selectel - 30 PoP, 300+ Tbit/s)
- Раздача видео, статики
- Пиковый исходящий трафик = 54 Tbit/s
- 54000 Gbit / 100 Gbit = 540 серверов
- 540 серверов / 100 CDN = 6 серверов / CDN в среднем (в центральном округе больше)
- Конфигурация 2U 2x6338/16x32GB/24xNVMe16T/2x100Gb/s
- 2 AZ в Москве и 1 AZ в Новосибирске
- Провайдер датацентров - Selectel
- Пользуемся услугой: Размещение оборудования -> Изолированная зона для серверов
- S3
- Размещение - bare-metal (hdfs)
- 180 Пб / год
- 180000 Тб / (24 * 16) = 470 серверов
- 3 резервные копии: 470 * 3 = 1400 серверов
- Конфигурация 2U 2620v3/16x32GB/24xNVMe16T/2x25Gb/s
- Суммарный RPS API 380 тыс. (табл)
- БД
- Размещение - bare-metal
- Суммарный размер хранения 11 Пб (табл)
- (11 * 1024) / (24 * 16) = 30 серверов
- min количество реплик 2 (master, slave, slave) = 90 серверов
- Конфигурация 2U 2620v3/16x32GB/24xNVMe16T/2x25Gb/s
- Сервисы - k8s
- 100 RPS / CPU (табл)
- Виртуальная сеть 100 RPS / 2 = 50 RPS
- 380 000 RPS / 50 RPS = 7600 CPU / 64 = 120 серверов
- Конфигурация 1U 2x6338/16x128GB/2xNVMe8T/2x40Gb/s
- Balancers, API Gateway
- Размещение - виртуальные машины
- 500 RPS / CPU (табл)
- 380 000 / 500 = 750 / 64 = 12 сервера
- Конфигурация 1U 2x6338/16x128GB/2xNVMe8T/2x40Gb/s
- 3100 U / 48 U/Rack = 65 стоек (4 ряда в машинном зале)
- 3 AZ: 3100 U * 3 = 9300 U (резервирование N + 2 по ДЦ)