ekbpy'2012 - Данила Штань - Распределенное хранилище

25
История одного pet-project или Как мы строили распределенное хранилище файлов для веба и что из этого вышло Данила Штань, 66.ru [email protected]

Upload: it-people

Post on 16-Jun-2015

2.919 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: ekbpy'2012 - Данила Штань - Распределенное хранилище

История одного pet-projectили

Как мы строили распределенное хранилище файлов для веба и что из этого вышло

Данила Штань, [email protected]

Page 2: ekbpy'2012 - Данила Штань - Распределенное хранилище

• Много NFS

• Разные проекты — разные решения, legacy

• Проблемы с деплоем

• Разработчики не всегда понимают, что можно, а чего нельзя• Резервные копии

Было: инфраструктура

Page 3: ekbpy'2012 - Данила Штань - Распределенное хранилище

Задача: инфраструктура

• Унификация• Масштабирование• Резервные копии• Отказаться от NFS

• Постараться не покупать новое оборудование

Page 4: ekbpy'2012 - Данила Штань - Распределенное хранилище

Было: разработка

• У каждого свой подход

• Много раз решаем одну и ту же задачу

• Иногда очень странно решаем одну и ту же задачу

Page 5: ekbpy'2012 - Данила Штань - Распределенное хранилище

Задача: разработка

• “Защита от дурака”

• Унификация подходов• Избавление от рутины

Page 6: ekbpy'2012 - Данила Штань - Распределенное хранилище

О чем мы, собственно?

• 6.5 терабайт

• Файлы от 10кб до 300мб

• 180rps, 200 мегабит — стандартный фон в рабочие часы

• 800rps, 700 мегабит — пиковые нагрузки

Page 7: ekbpy'2012 - Данила Штань - Распределенное хранилище

Пиковые нагрузки это...

Page 8: ekbpy'2012 - Данила Штань - Распределенное хранилище

... это полдень на ekabu.ru...

Page 9: ekbpy'2012 - Данила Штань - Распределенное хранилище

... или ссылка на 66 с lenta.ru

Page 10: ekbpy'2012 - Данила Штань - Распределенное хранилище

Подытожим требования

• Больше одной копии файла• Горизонтально-масштабируемая• Основное предназначение — отдавать файлы по http

Page 11: ekbpy'2012 - Данила Штань - Распределенное хранилище

Подытожим желания

• Прибрать рутинные операции• “Черный ящик”

• Небольшое количество компонентов• Знакомый нам или широко используемый стек технологий

Page 12: ekbpy'2012 - Данила Штань - Распределенное хранилище

Не нужно изобретать велосипед

Page 13: ekbpy'2012 - Данила Штань - Распределенное хранилище

Ditributed File System

• GlusterFS

• CloudStore

• Lustre

• HDFS

• MogileFS

Page 14: ekbpy'2012 - Данила Штань - Распределенное хранилище

Давайте писать своё?

• GlusterFS — в новой версии есть Object Storage, но beta

• MogileFS — похоже на правду, но Perl

• HDFS — совсем не для наших целей и нет HA

• CloudStore — HDFS на C

• Lustre — энтерпрайз такой энтерпрайз

Page 15: ekbpy'2012 - Данила Штань - Распределенное хранилище

Итак, что делаем?приложения сервис DFS http-сервер пользователь

Page 16: ekbpy'2012 - Данила Штань - Распределенное хранилище

Сервис

• Python+MongoDB

• Ограничение доступа• Плюшки для разработчиков — r/o аккаунты к production данным

• RESTful API:

• POST / — добавить файл

• GET /<id> — получить метаданные, ссылку и время жизни ссылки

Page 17: ekbpy'2012 - Данила Штань - Распределенное хранилище

DFS и http-сервер

• nginx — нужны веские причины, чтобы отказаться

• GlusterFS как наиболее вероятный кандидат

• не самая тривиальная настройка• как делать off-site бэкап?

Page 18: ekbpy'2012 - Данила Штань - Распределенное хранилище

DFS и http-сервер

• У нас уже есть MongoDB!

• replica set

• off-site replica

• У MongoDB есть спецификация GridFS

• Для nginx есть модуль nginx_gridfs

Page 19: ekbpy'2012 - Данила Штань - Распределенное хранилище

Тесты, попытки применить

• Стандартный storage-сервер через nginx-gridfs — 600rps

• Проблема не в Mongo, C-драйвер не умеет работать асинхронно

• nginx-gridfs — не очень активно развивается

• nginx-gridfs — не поддерживает HTTP Range запросы

• Мы не готовы использовать собственный C-код в production

Page 20: ekbpy'2012 - Данила Штань - Распределенное хранилище

И снова напишем сами

• WSGI-приложение, 300 строк кода

• Werkzeug

• Берет ObjectID и отдает файл, умеет отвечать 200, 206, 404

• Умеет работать с replica set

• Тесты — 400 rps, двух только-только хватит на пиковые нагрузки

Page 21: ekbpy'2012 - Данила Штань - Распределенное хранилище

nginx наше все

• proxy_pass, proxy_cache

• требует отдельного железа, но у нас уже есть• тесты• 2.5 k rps при размере кэша в 20 gb

• 2.5 k rps при размере кэша в 3 gb

Page 22: ekbpy'2012 - Данила Штань - Распределенное хранилище

nginx наше все

• proxy_pass, proxy_cache

• требует отдельного железа, но у нас уже есть• тесты (после “прогрева” кэша)

• 2.5 k rps при размере кэша в 20 gb

• 2.5 k rps при размере кэша в 3 gb

• 2.5 k rps это гигабит на тестовых данных

Page 23: ekbpy'2012 - Данила Штань - Распределенное хранилище

Получилось хорошо

• Знакомый стек технологий• Достаточно быстро• Достаточно гибко• Достаточно изолировано• Компонент раздающий файлы можно не трогать

Page 24: ekbpy'2012 - Данила Штань - Распределенное хранилище

Что дальше

• Вынести рутинные операции — ресайз картинок, конвертацию• GET /<id>?height=<newheight>

• GET /<id>?encode=png или даже GET /<id>?encode=flv

• Главное вовремя остановиться

Page 25: ekbpy'2012 - Данила Штань - Распределенное хранилище

jobs.66.ru :)