Решили мы попробовать для хранения видео файлов использовать 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 часов, а потом удаляла старый снапшот. Но каждый раз при этом размер базы рос и однажды места для снапшота не хватило. Благо гараж может по копманде синкануть метаданные с других нод
lmdb делала снапшоты каждые 6 часов, а потом удаляла старый снапшот. Но каждый раз при этом размер базы рос и однажды места для снапшота не хватило. Благо гараж может по копманде синкануть метаданные с других нод

Документации маловато, но она достаточна. Например про параметр tranquility (спокойствие) нигде описания нет, даже в help'e консольной утилиты. И только в презентации выступления разработчиков на какой то конфе, которая лежит у них в репозитории, в списке действий для повышения производительности есть пункт «поиграйтесь с tranquility и workers»).

Ладно, от гаража в целом положительные впечатления, по крайней мере на таких небольших объемах как у нас (весь кластер до 100тб сырого места). Так в чем проблема?

Домашний интернет

Ох, мы же распихали свои сервера куда только можно — в пике их было 5. Накупили дорогих тарифов у провайдеров, услугу статический IP и думали что щас заживём, но не тут то было.

Скорость нам никто не гарантирует. И тем более не симметричную. На графиках видно, как в 9 часов вечера весь наш кластер просаживается из‑за того, что один из провайдеров снижает скорость отдачи до 10 мбит из 500, которые идут по тарифу.

На графике общая скорость записи в кластер и скорость чтения из кастера. Пишем мы в кластер всегда одинаково (пытаемся), но когда растёт нагрузка на чтение, то запись падает почти до нуля
На графике общая скорость записи в кластер и скорость чтения из кастера. Пишем мы в кластер всегда одинаково (пытаемся), но когда растёт нагрузка на чтение, то запись падает почти до нуля

Связанность. Подняли новую ноду, подключили к кластеру, ее все видят. Но она не видит одну из нод — находящуюся в соседнем доме. Техподдержка провайдеров, кстати, честно пыталась решить проблему. Воронежскому фридому респект. Хотя бы не стали посылать перезагружать роутер, а запросили трассировку и даже сами убедились, что связанности с соседним домом нет. Но дальше решать не стали, отправили к провайдеру на другой стороне, там тоже помочь не смогли. Вывернулись поднятием туннеля, но через неделю пропала связанность ещё двух нод. Теперь уже не односторонняя, а в обе стороны. Не пингуется и всё. Опять подняли туннель, кое как работоспособность восстановили.

Тут двух нод до третьей постоянно потери пакетов и таймауты. Причём в другую сторону всё прекрасно
Тут двух нод до третьей постоянно потери пакетов и таймауты. Причём в другую сторону всё прекрасно

Подозрительный трафик. Мы, все таки, слегка злоупотребляем провайдером. Скорость мы использовали не больше чем типичный пользователь торрентов, точно не на тарифный максимум. Но вот когда мы пустили трафик внешних пользователей, провайдеры начали что то замечать. Один из них просто вырубил нам интернет. Решилось звонком, интернет включили, посоветовали убрать ответ на ping check'и, сказали что какие то хакеры вас пытаются ddos'ить. Ок, с этой ноды видео мы больше не раздавали.

Латенси на ответ. Когда видео лежит в дата центре рядом с точкой обмена трафиком, то туда относительно быстрый доступ есть у всех. Но когда из Санкт Петербурга кто то хочет посмотреть видео, которое лежит на домашнем сервере у кого то в Воронеже, то он сталкивается с большими проблемами. Чаще плеер просто отваливался по таймауту.

Жалобы домашних. Когда сервер в пустой квартире, то это в целом никому не мешает. Но когда он выжирает 100% трафика, а кто то хочет поработать удаленно, или просто посидеть в интернете, то становится совсем неудобно.

Выводы

График общей скорости кластера после переезда на нормальный сервер 2/3 нод. Две домашние заменяются одной серверной.
График общей скорости кластера после переезда на нормальный сервер 2/3 нод. Две домашние заменяются одной серверной.

Мы пошли на компромиссное решение. Физический железный сервер в селектеле с 22тб hdd стоит 25 000р. Дороже чем домашний интернет, конечно, но сильно стабильнее. Все ещё в процессе миграции, все ещё используем garage, но видим как сильно выросла скорость загрузки и отдачи. Теперь мы начинаем упираться в скорость HDD. Видимо следующий шаг — поднятие кеширующих прокси для самых просматриваемых видео.

Комментарии (13)


  1. MountainGoat
    06.12.2024 09:59

    Простите, а вы - это RuTube?


    1. dilap54 Автор
      06.12.2024 09:59

      Возможно RuTube начинал также. Но думаю сейчас они могут себе позволить не хоститься в подвале :)

      Нет, к сожалению, мы не RuTube


      1. anonymous
        06.12.2024 09:59

        НЛО прилетело и опубликовало эту надпись здесь


    1. PereslavlFoto
      06.12.2024 09:59

      Они тот молодой сервер, что сотрёт рутуб с лица земли!


  1. PereslavlFoto
    06.12.2024 09:59

    пропала связанность ещё двух нод

    Удалось найти причину?

    когда мы пустили трафик внешних пользователей,
    провайдеры начали что то замечать

    То есть этот трафик запрещён в договоре?

    он выжирает 100% трафика

    Не для этого ли придуман шейпинг?


    1. dilap54 Автор
      06.12.2024 09:59

      Удалось найти причину?

      Нет, второй раз даже не стали обращаться к провайдерам, приняли решение отказываться от такой схемы. Дебажить сеть на стыке двух домашних провайдеров очень сложно - трассировка показывает, что пакеты пропадают где то на маршрутизаторе одного из них, но техподдержка клянётся, что никаких ограничений на нем нет и отправляет к другому провайдеру.

      То есть этот трафик запрещён в договоре?

      Да, провайдер считает это предпринимательской деятельностью и отправляет на бизнес тариф.

      Не для этого ли придуман шейпинг?

      Да, шейпинг кстати применяли и он помогал. В keenetic giga оказывается очень легко и ограничить скорость и даже выставить приоритет трафика. Но по вечерам, когда весь подъезд сидит в интернете, падала общая скорость и приходилось выбирать - сидеть в интернете через 4g или приостанавливать обслуживание посетителей сайта. Выбирали первое.


      1. PereslavlFoto
        06.12.2024 09:59

        Как интересно! Провайдер считает дармовую деятельность физлица предпринимательской. Этак мы придём к тому, что любая домашняя страничка любого дружеского клуба станет у этого провайдера предпринимательской.

        Обычно провайдер борется с этим, шейпя трафик у себя до того уровня, какой покажется провайдеру оплаченным. Очень странно, что ваш провайдер решил просто отказаться от клиента. Конечно, если это не Ростелеком — ибо для Ростелекома отказываться от клиента стало традицией.


  1. StepanovAlex
    06.12.2024 09:59

    Вот интересно, сколько электричества такой гараж потребляет?


    1. dilap54 Автор
      06.12.2024 09:59

      Не много. Вот график потребления двух домашних серверов, один из которых постоянно под нагрузкой, второй с видеокартой в режиме ожидания - 250Вт


      1. StepanovAlex
        06.12.2024 09:59

        Удивительно.


  1. Furriest
    06.12.2024 09:59

    Ой. Ну Garage тут ни при чем, просто не надо строить продуктивное решение на домашних тарифах интернета. Они именно потому так дешевы, что их расчетное усредненное потребление - 3-4 Mbps на пользователя (и это не ограничение, это реальная загрузка, даже когда вы используете тариф на 500Mbps и в консьюмерской модели иногда генерите такой трафик). Переподписка там достигает огромных значений.

    Не зря тарифы для юрлиц, где полоса хотя бы условно гарантирована, существенно дороже.


    1. slavius
      06.12.2024 09:59

      тариф на 500Mbps

      Ну так и нефиг провайдерам столько обещать и прятать под звёздочками что столько только иногда, и только тем кому столько и не нужно.

      Но да, с ростом объёма трафика такое уже и не очень правильно - они мешают остальным соседям клиентам провайдера.


      1. Furriest
        06.12.2024 09:59

        Почему нефиг? Это нормальная практика. Тариф не "на 500Mbps", а "до 500Mbps".

        Провайдер покупает оптом трафик за единицы-десятки тысяч рублей за гигабит, в зависимости от множества факторов. Почему вы можете рассчитывать на получение выделенной полосы от него в розницу на 1-2 порядка дешевле?