1
2
Яндекс.Диск:
Миллионы пользователей
и MongoDB
Хамидуллин Виталий, Яндекс
3
+1 ТБ
4
Яндекс.Диск — это сервис, который позволяет хранить
файлы и обмениваться ими, а также предоставляет доступ
к файлам с любого устройства, подключѐнного к интернету.
20 млн. зарегистрированных пользователей
7 млрд. файлов
10 млн. загружаемых в сутки файлов
5
Web интерфейс
Windows, Mac OS, Linux
iOS, Android, Windows Phone
WebDAV
6
SDK — http://api.yandex.ru/disk/
SDK Яндекс.Диска предназначен для приложений,
которые работают с файлами пользователей Яндекс.Диска
или хранят на Диске собственные файлы и настройки.
Objective-C — iOS, OS X
Java — Android
C# — Windows, Windows Phone
7
8
MPFS
Распределѐнная система
Все машины равноправны
Python
Flask
uwsgi
nginx
9
Данные в Диске
Содержимое файлов
Mulca
Внутренняя разработка
Key-value сторадж
Синхронная запись
Метаданные
MongoDB
Структура файловой системы
Файлы и каталоги
История изменений
Данные сервиса
10
MySQL Oracle
Своя
разработка
MongoDB
Автоматическое
шардирование - - + +
Документо-
ориентированность - - + +
Транзакции + + + -
Встроенные механизмы
репликации + + + +
Готово и можно
использовать + + - +
11
Кластер MongoDB в Диске
7.5 млрд. объектов
7 ТБ данных
2 ТБ индексов
70 000 rps в базу
6 млрд. операций в день
3 реплики, 1 скрытая, 1 арбитр
30 шардов
12
Вопрос на 1 ТБ
Почему в replica set желательно нечетное количество нод?
13
Практическое использование
14
Принципы хранения
Первичные ключи
Шардирование
Индексы
15
Первичные ключи
Уникальный хэш
UID для данных о пользователе
ObjectId
16
Шардирование
Системные коллекции без шардирования
Пользовательские коллекции по UID
17
Индексы
UID
Поля для сортировки и фильтрации
18
Оптимизация
Сжатие данных
Чтение с реплик
Большие выборки
Инкрементальные обновления
19
Сжатие данных
В коде данные сжимаются библиотекой zlib
В базе хранится в BinData
Сокращает объем хранимых данных в 1,5 раза
20
Чтение с реплик
+ снимает нагрузку с master
− только некритичные данные
db.collection.find({}, slave_okay=True)
21
Большие выборки
for each in db.collection.find({}):
unzip(each)
22
Большие выборки
for each in list(db.collection.find({})):
unzip(each)
Вопрос на 1 ТБ
Какие проблемы могут возникнуть?
23
Большие выборки
processed = 0
count = db.collection.find({}).count()
while processed < count:
for each in db.collection.find({},
skip=processed, limit=10000):
processed+=1
unzip(each)
24
Инкрементальные обновления
db.collection.find_one({"_id" : "1234567890”})
db.collection.update({"_id" : "1234567890"},
{"$set" : {"data" : 1048576}})
25
Инкрементальные обновления
db.collection.update({"_id" : "1234567890"},
{"$inc" : {"data" : 1024}})
26
Преимущества
Производительная
Хорошо документирована
Удобная
Особенности
Нужно мониторить
Требует правильного
проектирования
Практика важнее теории
MongoDB
27
Спасибо за внимание!
28
Хамидуллин Виталий
Разработчик
http://api.yandex.ru/disk/
vikham@yandex-team.ru

CodeFest 2014. Хамидуллин В. — Яндекс.Диск: Миллионы пользователей и MongoDB