Весной в Технократию пришла задача: есть 1500 организаций по всей России, каждая должна уметь автоматически отслеживать активность пользователей. Организации присылают видео со своих офлайн-площадок, а дальше дело за нами: принять, валидировать, вытащить нужные данные. Так начиналась эта история. Меня зовут Руслан Абдуллаев, я DevOps в Технократии, и сейчас расскажу, что мы с этим делали.
Инструменты
Первым делом проспойлерим технологии этого проекта — дань уважения самым нетерпеливым. Для обработки видео остановились на продуктах Visionlabs, а именно Luna Platform и Facestream. Тут обязательно наличие CentOS на серверах и AVX2 инструкций процессора. Система хранения данных — облачное хранилище от Selectel. Ну и весь наш бекенд на питоне. Связка оказалась рабочей, так что переходим к подробностям.
Система хранения
Клубок начали разматывать со стороны организаций. Решили, что им для загрузки видео подойдет FTP — это просто, и с большой долей вероятности каждая из 1500 организаций найдет себе разбирающегося специалиста для настройки.
Но удобно должно быть и нам, а FTP — не лучший вариант для нашего бэкэнда. То ли дело какой-нибудь S3. Тогда мы подумали: хорошо бы найти систему, которая комбинирует оба способа. И такая система нашлась — облачное хранилища от Selectel.
Пришли к выводу, что оптимально заводить один облачный контейнер на каждую организацию, присваивать ей уникальный логин и пароль с доступом для загрузки в свой контейнер. Также назначили суперюзера, которого дали нашему бекэнду для доступа по S3 во все контейнеры.
Осталось всего ничего: завести 1500 контейнеров, прописать 1500 пользователей с правами. Звучит не очень весело, но делать это руками конечно же мы не будем. Раскурили API селектела и проработали структуру вложенных папок-контейнеров. На этой основе написали скрипт.
Фактически мы вытащили id всех организаций из базы и обычным циклом прошлись по ним, создавая облачные контейнеры и их структуру. Очень удобно. Стоит уточнить, что у селектела есть ограничение на 2000 контейнеров, но поддержка идет на встречу и готова расширить лимит.
Дальше мы описали систему аналитикам, а они написали нужные инструкции уже для организаций. По ним любой человек с минимальными знаниями сможет работать с системой.
Сейчас мы получаем 200-300 ГБ данных в день.
Система обработки видео
Со стороны архитектуры внедрение Luna Platform и Facestream довольно простая задача. Поэтому я опишу схему работы всей нашей системы.
Для начала на основе документации и наших тестов этих продуктов мы рассчитали мощности серверов, которые будут быстро обрабатывать данные. Для Luna Platform взяли рекомендованную вендором конфигурацию: 8 ядер, 32 Гб оперативки и 400 Гб быстрого SSD, чтобы выдержать частые обращения к базе.
А вот с Facestream пришлось подумать, потому что основная нагрузка по обработке приходится именно на него. При этом важно, чтобы обработка не затягивалась по времени. Выход — обрабатывать несколько видео параллельно.
Провели тесты и выяснили: для параллельной обработки 20 видео нужно 24 ядра и 36 Гб оперативной памяти. Этого вполне хватает, чтобы обрабатывать все полученные видео в течение дня. Нам этого достаточно.
ВАЖНО! Не забываем уточнять у хостера модель процессора: без AVX2 инструкций ничего работать не будет. Они сейчас есть почти везде, но уточнить надо. И обязательно берем CentOS.
Подняли сервера и накатили туда эти продукты. Задача тривиальная. Главный совет — грамотно рассчитать мощность для параллельной обработки. После осталось подружить наш основной бекэнд со всеми этими облаками и обработчиками видео.
Для этого написали микросервис, который предоставляет собой довольно высокоуровневую абстракцию над Luna Platform и Facestream. По сути это апишка, в которую удобно закидывать задачи на обработку данных нужным нам образом. Добавили в шедулер основного бэкэнда таску, которая обходит данные в облаке и отсылает новые в написанный микросервис.
Кстати, недавно столкнулись с проблемой: Facestream потребляет больше трафика, чем ожидалось. Изначально предполагали, что количество трафика будет сопоставимо количеству данных, которые хранятся в контейнерах Но в один из дней Facestream неожиданно потребил в 3 раза больше, чем мы ожидали. Это было странно и причину мы пока до конца не выяснили.
Какие советы мы можем дать?
Используйте лицензии на основе доменного имени машины, а не fingerprint сервера: она работает куда стабильнее.
При закладывании бюджета на хранилище селектела учитывайте стоимость трафика. Не всегда трафик равен количеству данных.
Про мониторинг и бекапы думаю и говорить нечего.
Также подписывайтесь на наш телеграм-канал «Голос Технократии». Каждое утро мы публикуем новостной дайджест из мира ИТ, а по вечерам делимся интересными и полезными мастридами.
Комментарии (5)
DeeZ
05.12.2021 20:29+1Извините, а о чем статья?
Смогу я развернуть такую же систему по вашей статье? нет.
Есть ли какие то аргументированные советы? нет. Обязательно берите центось.
Зачем 1500 контейнеров? почему нельзя использовать 1?
Что такое Facestream? я так понял какой то продукт сторонний?
Какой результат получили? что дало\что показало видео?
Рассказ о том, что вы купили и установили какую то софтину, получается?
Daar
Сейчас мы получаем 200-300 ГБ данных в день.
Это со всех 1500 организаций??? Это где-то по 200Мб на нос, как-то маловато для видео. Или на точке 1 камера с частотой 5 кадров в секунду? И думаю врядли она лица выдергивает из кадра 320х240.
И обязательно берем CentOS.
А какая причина? На других тестировали?
И если не такая страшная тайна, то сколько вы заплатили за лицензии? Хотя бы грубые цифры, порядок цен что бы понимать.
technokratiya Автор
Отвечает автор:
Все организации шлют нам данные не синхронно, то есть за день нам могут прийти данные и от 10 и от 500 организаций. Средний размер видео это 2-3гб. Что связанно с CentOS, хоть сама Luna и поставляется в докере, но Visionlabs предоставляет свои бинарники и скрипты развертывания и обслуживания написанные под CentOS. Так же они поставляют свои пакеты, нужные для работы системы в виде rpm.
По ценам не можем сориентировать, к сожалению :(
SkeelzyDarko
EOL CentOS - 31 декабря.
Пора латать дыры.