CodeFest 2014. Хамидуллин В. — Яндекс.Диск: Миллионы...

28
1

Transcript of CodeFest 2014. Хамидуллин В. — Яндекс.Диск: Миллионы...

1

2

Яндекс.Диск: Миллионы пользователей и MongoDB

Хамидуллин Виталий, Яндекс

3

+1 ТБ

4

Яндекс.Диск — это сервис, который позволяет хранить файлы и обмениваться ими, а также предоставляет доступ к файлам с любого устройства, подключённого к интернету.

20 млн. зарегистрированных пользователей7 млрд. файлов10 млн. загружаемых в сутки файлов 

5

Web интерфейсWindows, Mac OS, LinuxiOS, Android, Windows PhoneWebDAV

6

SDK — http://api.yandex.ru/disk/ SDK Яндекс.Диска предназначен для приложений, которые работают с файлами пользователей Яндекс.Диска или хранят на Диске собственные файлы и настройки.

Objective-C — iOS, OS XJava — AndroidC# — Windows, Windows Phone

7

8

MPFS

Распределённая системаВсе машины равноправныPython

Flaskuwsginginx

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+=1unzip(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/

[email protected]