Top Banner
1
28

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

Apr 16, 2017

Download

Internet

CodeFest
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CodeFest 2014. Хамидуллин В. — Яндекс.Диск: Миллионы пользователей и MongoDB

1

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

2

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

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

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

3

+1 ТБ

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

4

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

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

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

5

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

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

6

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

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

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

7

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

8

MPFS

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

Flaskuwsginginx

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

9

Данные в Диске

Содержимое файловMulca

Внутренняя разработка

Key-value сторадж

Синхронная запись

МетаданныеMongoDB

Структура файловой системы

Файлы и каталоги

История изменений

Данные сервиса

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

10

MySQL Oracle Своя разработка MongoDB

Автоматическое шардирование - - + +

Документо-ориентированность - - + +

Транзакции + + + -

Встроенные механизмы репликации + + + +

Готово и можно использовать + + - +

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

11

Кластер MongoDB в Диске

7.5 млрд. объектов7 ТБ данных2 ТБ индексов70 000 rps в базу6 млрд. операций в день

3 реплики, 1 скрытая, 1 арбитр30 шардов

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

12

Вопрос на 1 ТБ

Почему в replica set желательно нечетное количество нод?

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

13

Практическое использование

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

14

Принципы хранения

Первичные ключиШардированиеИндексы

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

15

Первичные ключи

Уникальный хэшUID для данных о пользователеObjectId

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

16

Шардирование

Системные коллекции без шардированияПользовательские коллекции по UID

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

17

Индексы

UIDПоля для сортировки и фильтрации

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

18

Оптимизация

Сжатие данныхЧтение с репликБольшие выборкиИнкрементальные обновления

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

19

Сжатие данных

В коде данные сжимаются библиотекой zlibВ базе хранится в BinDataСокращает объем хранимых данных в 1,5 раза

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

20

Чтение с реплик

+ снимает нагрузку с master− только некритичные данные

db.collection.find({}, slave_okay=True)

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

21

Большие выборки

for each in db.collection.find({}):unzip(each)

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

22

Большие выборки

for each in list(db.collection.find({})):unzip(each)

Вопрос на 1 ТБ

Какие проблемы могут возникнуть?

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

23

Большие выборки processed = 0 count = db.collection.find({}).count() while processed < count:

for each in db.collection.find({}, skip=processed, limit=10000):

processed+=1unzip(each)

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

24

Инкрементальные обновленияdb.collection.find_one({"_id" : "1234567890”})

db.collection.update({"_id" : "1234567890"}, {"$set" : {"data" : 1048576}})

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

25

Инкрементальные обновленияdb.collection.update({"_id" : "1234567890"},

{"$inc" : {"data" : 1024}})

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

26

ПреимуществаПроизводительнаяХорошо документированаУдобная

ОсобенностиНужно мониторитьТребует правильного проектированияПрактика важнее теории

MongoDB

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

27

Спасибо за внимание!

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

28

Хамидуллин ВиталийРазработчик

http://api.yandex.ru/disk/

[email protected]