Как мы 2 гбита видео из гаража пытались раздать
Решили мы попробовать для хранения видео файлов использовать Garage. Он казалось бы, идеально подходит для наших целей — запускается на древнем консьюмерском железе, требований к латенси сети у него нет, к ошибкам администрирования устойчив. А ещё файлы отдает с низкой задержкой, причем даже если запросить кусок из середины файла. Вроде бы красота, но мы ошиблись.
Никогда не пытайтесь сделать домашний интернет своей опорной инфраструктурой.
Что мы вообще делаем?
И так, я начну с начала. Ютуб замедлили, работать было скучно, хотелось навести суеты. И возникла гениальная идея — сделать свой видеохостинг, на который можно импортировать видео из ютуба. Проблема конечно решается другими, более популярными способами, и необязательно делать свой видеохостинг, но в них есть фатальный недостаток, который двигал нас вперёд.
Идея простая — пользователь заходит на страницу, вводит url видео которое он хочет посмотреть, и ему либо выводится готовое к просмотру видео, либо страница с ожиданием импорта.
Про трудности парсинга ютуба и генерирования hls манифеста напишу как нибудь в другой статье, а пока — мы сходили за видео файлом в источник, конвертировали его в удобный формат, и нам как то надо отдать его пользователю. Как?
Первое, что приходит на ум, это раздавать оттуда, куда скачали. Но вариант сразу отметается, как минимум потому что у нас очень быстро закончится место на жёстком диске. Да и вообще хранение файлов и обработка это разные вещи, для обработки нужен быстрый диск, процессор и возможно видеокарта. А для хранения и раздачи нужна быстрая сеть, средний по скорости диск и, желательно, избыточность данных.
Вторая мысль это положить файл в s3! Не в амазоновский, конечно, но в s3 совместимое хранилище на территории России. И решение, в общем, довольно правильное. Если не считать маленького косяка со стороны Яндекса, когда на 20тб у нас скорость закачки упала до 50 кб/с (решили созданием нового бакета, а через сутки ребята из Яндекса и старый починили) проблем больше не было. Кроме одной — счета за потребление. Ух, он рос каждый день. Даже не так — скорость роста росла каждый день! Наверно для компаний с большим бюджетом допустимо, но для нас это pet‑project, в который мы не готовы много инвестировать.
Третий вариант — сделать s3 самим. И сервера сделать самим (собрать из старого железа). Расчет был не плох — наша пиковая скорость раздачи к тому моменту это 2Gbit/s. Раздавать столько через s3 это много сотен тысяч рублей в месяц. Через Yandex CDN это несколько сотен тысяч рублей в месяц. А раздавать столько с домашнего интернета для провайдера не тяжелее торрентов, это две тысячи рублей в месяц — аж в сто раз дешевле. И сервер особо мощный не нужен, справится любой старый комп.
Garage
Если поискать способы сделать self hosted s3, то сразу всплывает minio. Его постоянно используют для интеграционных тестов к большому s3, но в кластерном режиме его готовить сложно и где то в доках я видел серьезные требования к надёжности сети между узлами.
Есть ещё китайский seaweedfs. Отпугнуло большое количество компонентов. На каждый слой абстракции — свой компонент. S3 это самый высокий уровень абстракции, для него нужно много писать конфигов и продумывать схему деплоя — отпугнуло сложностью.
Garage. Своим названием он показывает, что это то что нам нужно. Один бинарник, он сразу и gateway, он и хранит/синхронизирует метаданные, он отдает/принимает файлы, он периодически проверяет их на консистентность, связывается с другими нодами и т. д.
Garage просит вас запустить его на всех серверах которые будут участвовать в хранении /передачи файлов и указать сколько у вас места, на каких серверах и сгруппировать их по зонам доступности, чтобы распихать копии блоков максимально в разные зоны.
А ещё выставить в конфиге желаемый уровень репликации и требование наличия кворума для доступа к файлам и всё, можно пользоваться! Гараж делит ваше место на 256 партиций, а потом каждую партицию закрепляет за несколькими нодами. Отсюда кстати ограничение, что больше 256 нод в одной зоне доступности держать нельзя.
Если добавить новую ноду, то он бережно перераспределит партиции на нее и в фоновом режиме перенесёт туда данные, а со старой ноды уберёт. Мы уже раз 5 добавляли и убирали ноды (а для кластера из трёх нод это прям под кластера надо переместить) — все проходит успешно.
Процесс синхронизации новой ноды, её поставили взамен старой. Занятое место в старой ноде уменьшается медленно, потому что она почти потеряла связанность с другими нодами и не достигала кворума, необходимого для удаления. Но это не мешает новой ноде засинкаться.
Отдавать файлы напрямую гараж кстати почему то не умеет, анонимный доступ запрещен, пришлось прикручивать s3-proxy. А ещё медленно синхронизирует ноды, если кластер нагружен, а параметр «спокойствие» стоит по умолчанию. Надо его опускать в 0, тогда нормально. Ну и ещё lmdb которая под капотом хранит метаданные, во время периодического снятия снапшотов внезапно начинает жрать память (на диске) и убивает свободное место. Пришлось отключить эту фичу.
lmdb делала снапшоты каждые 6 часов, а потом удаляла старый снапшот. Но каждый раз при этом размер базы рос и однажды места для снапшота не хватило. Благо гараж может по копманде синкануть метаданные с других нод
Документации маловато, но она достаточна. Например про параметр tranquility (спокойствие) нигде описания нет, даже в help’e консольной утилиты. И только в презентации выступления разработчиков на какой то конфе, которая лежит у них в репозитории, в списке действий для повышения производительности есть пункт «поиграйтесь с tranquility и workers»).
Ладно, от гаража в целом положительные впечатления, по крайней мере на таких небольших объемах как у нас (весь кластер до 100тб сырого места). Так в чем проблема?
Домашний интернет
Ох, мы же распихали свои сервера куда только можно — в пике их было 5. Накупили дорогих тарифов у провайдеров, услугу статический IP и думали что щас заживём, но не тут то было.
Скорость нам никто не гарантирует. И тем более не симметричную. На графиках видно, как в 9 часов вечера весь наш кластер просаживается из‑за того, что один из провайдеров снижает скорость отдачи до 10 мбит из 500, которые идут по тарифу.
На графике общая скорость записи в кластер и скорость чтения из кастера. Пишем мы в кластер всегда одинаково (пытаемся), но когда растёт нагрузка на чтение, то запись падает почти до нуля
Связанность. Подняли новую ноду, подключили к кластеру, ее все видят. Но она не видит одну из нод — находящуюся в соседнем доме. Техподдержка провайдеров, кстати, честно пыталась решить проблему. Воронежскому фридому респект. Хотя бы не стали посылать перезагружать роутер, а запросили трассировку и даже сами убедились, что связанности с соседним домом нет. Но дальше решать не стали, отправили к провайдеру на другой стороне, там тоже помочь не смогли. Вы вернулись поднятием туннеля, но через неделю пропала связанность ещё двух нод. Теперь уже не односторонняя, а в обе стороны. Не пингуется и всё. Опять подняли туннель, кое как работоспособность восстановили.
Тут двух нод до третьей постоянно потери пакетов и таймауты. Причём в другую сторону всё прекрасно
Подозрительный трафик. Мы, все таки, слегка злоупотребляем провайдером. Скорость мы использовали не больше чем типичный пользователь торрентов, точно не на тарифный максимум. Но вот когда мы пустили трафик внешних пользователей, провайдеры начали что то замечать. Один из них просто вырубил нам интернет. Решилось звонком, интернет включили, посоветовали убрать ответ на ping check’и, сказали что какие то хакеры вас пытаются ddos’ить. Ок, с этой ноды видео мы больше не раздавали.
Латенси на ответ. Когда видео лежит в дата центре рядом с точкой обмена трафиком, то туда относительно быстрый доступ есть у всех. Но когда из Санкт Петербурга кто то хочет посмотреть видео, которое лежит на домашнем сервере у кого то в Воронеже, то он сталкивается с большими проблемами. Чаще плеер просто отваливался по таймауту.
Жалобы домашних. Когда сервер в пустой квартире, то это в целом никому не мешает. Но когда он выжирает 100% трафика, а кто то хочет поработать удаленно, или просто посидеть в интернете, то становится совсем неудобно.
Выводы
График общей скорости кластера после переезда на нормальный сервер 2/3 нод. Две домашние заменяются одной серверной.
Мы пошли на компромиссное решение. Физический железный сервер в селектеле с 22тб hdd стоит 25 000р. Дороже чем домашний интернет, конечно, но сильно стабильнее. Все ещё в процессе миграции, все ещё используем garage, но видим как сильно выросла скорость загрузки и отдачи. Теперь мы начинаем упираться в скорость HDD. Видимо следующий шаг — поднятие кеширующих прокси для самых просматриваемых видео.