ML-модели 4 • сетевой канал не безлимитный • мешаем другим приложениям в кластере • много раз скачиваем одно и то же • при масштабировании растет нагрузка на сеть и хранилище Проблемы:
то, что уже скачано из источника • Снижение нагрузки на кеширующий слой • Меньше ресурсов на кеширующий слой • Возможность дальнейшего масштабирования • Скорее всего, мы не первые, кто об этом задумывается Инстанс поиска Инстанс поиска Инстанс поиска Инстанс поиска
Декларативное задание состояния • Ретеншн • При падении должно раздавать уже частично скачанные файлы • Использование кеша при операции с файлами • Минимум точек отказа • Локализация трафика • Ограничение скорости в байтах в секунду • Сжатие трафика между пирами • Использование существующих CDN • Возможность делиться данными непосредственно на файловой системе ноды • Скачивание должно как можно меньше влиять на остальной трафик
API, ServiceAccount, ClusterRole, ClusterRoleBinding и вот это вот все… 3. Собственное решение под конкретную задачу Исследование похожих инструментов 4. Исследование похожих инструментов: • github.com/dragon fl yoss/Dragon fl y2 — решение для распределенной загрузки файлов и Docker- образов (Alibaba) • github.com/uber/kraken — решение, преймущественно созданное для ускорения загрузки Docker образов (Uber)
• Интерфейс в виде HTTP-прокси на нодах • Помимо файлов работает с Docker-образами • Официальные helm-чарты • Веб-интерфейс • Оба решения написаны преимущественно для репликации Docker-образов • Много «движущихся частей» • Много точек отказа • Зависимость от MySQL • Много лишнего функционала • Огромный набор настроек • Нет экспертизы – +
• Использование платформенных инструментов • Полностью контролируемое решение • Контроль над локализацией трафика • Разработка займет много времени • Много времени на отладку и допиливание • Простого решения не получается
спецификация • Целостность скаченных файлов • Спецификация webseed позволяет скачивать файлы по HTTP • Дискавери-фичи • Нет единой точки отказа • Нет внешних зависимостей • Есть библиотеки на Go
изменений • Активное сообщество • Де-факто основная библиотека для работы с протоколом • Достаточно расширяемая • Автор старается покрывать все тестами • Используется большинством torrent- проектов на Go • Очень много кода, часто ближайшие теги не совместимы • У автора свое мнение на то, как писать большие проекты • Документация: код и тикеты на гитхабе
изменений • Хороший, структурированный код • Тесты • Нет активного сообщества, документации • Не выглядит библиотекой на все случаи жизни • Сложно расширяется • Весь основной функционал в internal
Не знает про состав раздачи Запрос клиента (анонс): • Infohash (ID раздачи) • Прослушиваемый порт клиента • Количество данных, которыми клиент успел обменяться Ответ сервера: • Список пиров, участвующих в раздаче
в инфраструктуру Ozon • Часть стандарта протокола • Поддерживается Go-библиотеками • Обычный HTTP URL как источник • Вписывается в инфраструктуру Ozon DHT • Пир выступает в роли DHT-узла • Маленькие сообщения по UDP WebSeed
и используется только в поэтическом контексте как обозначение очень большого количества чего-либо • В Древней Греции число 10 000 носило название «мириа́да» (др.-греч. μῡριάς, род.п. μῡριάδος), и было самым большим числом, имевшим название Google: 1 мириад — 2 985 984
на файл 1. Сервис получает идентификатор задачи 2. Myriad ищет рядом с файлом файл метаданных 3. Происходит рандомная приоритизация сегментов 4. По мере скачивания, Myriad делится с другими участниками 5. Поиск Myriad K8S Pod Поиск Myriad K8S Pod Поиск Myriad K8S Pod Кеш (webseed) S3 Warden (discovery)
- gRPC и HTTP интерфейс управления - Отсутствие внешних зависимостей - Локализация трафика в пределах датацентра - Ограничение скорости трафика - Сжатие трафика между пирами с помощью zstd - Автоматическое удаление файлов - Декларативный примитивный API - Автообнаружение соседей - Дашборд с метриками по каждому пиру - Передача данных между пирами с помощью TCP или uTP (поверх UDP)
фреймворк (что является как плюсом, так и минусом) • Чтобы понять причины возникающих проблем, необходимо было потратить много времени, распутывая код библиотеки пошагово, иногда даже при помощи дебаггеров и вспомогательных метрик • Помимо библиотеки, часто приходилось вникать в особенности протокола, что тоже отнимало много времени • Две недели потратили на то, чтобы понять, почему качаем со скоростью 15 Mb/s
трейсах pprof • Ради метрик и оптимизаций пришлось форкнуть библиотеку и дорабатывать ее под наши нужды в оперативном порядке • Метрики в библиотеке сделаны в виде логов и expvar