MongoDB (Сергей Туленцев, ADD-2011)
Содержание
Аннотация
- Докладчик
- Сергей Туленцев
MongoDB — это современная нереляционная документо-ориентированная БД. В её развитии разработчики делают упор на легкую масштабируемость и высокую производительность.
В некотором смысле, её можно считать «золотой серединой» между реляционными БД (как MySQL) и чистыми хранилищами «ключ-значение» (как memcached). Вот её основные качества:
- документо-ориентированность (нет жестко заданной схемы, документы хранятся в формате типа JSON),
- индексы по любому атрибуту (или нескольким),
- удобная репликация с автоматическим фейловером,
- автомагический шардинг,
- богатый язык запросов,
- быстрые in-place апдейты (в отличие от append only движков),
- Map / Reduce,
- GridFS (подсистема хранения файлов любого размера).
Видео
- Скачать
http://ftp.linux.kiev.ua/pub/conference/peers/addconf/2011/1b8-mongodb-tulentsev.avs.avi
Для этого доклада нужен подкаст (аудиозапись)?
Презентация
Примечания и отзывы
Сергей Туленцев раскрыл сущность одной из NoSQL-платформ. ©
На рассказ Сергея Туленцова по MongoDB немного опоздал, и определенно часть недопонял / упустил, но то что я услышал мне понравилось. По сути, как я помню, они пишут приложения на Вконтакте, которое собирает от пользователей ответы на странные вопросы типа "Как вы думаете, способен ли ваш друг А выпрыгнуть из штанов ради внимания от девушки Б". Короче, приложение по своей полезности как раз под целевую аудиторию контакта. Но доклад был хороший, интересный. Я даже искренне принял докладчика за одного из коммитеров / разработчиков этой MongoDB - что, определенно, для него большой комплимент. ©
Не «много», а «монго». (Не дибил, а диби…) =) MongoDB — это NoSQL-база, хранит хеши, ну в смысле вообще объекты с произвольным набором полей/вложенных структур данных (типа JSON). Был на небольшом кусочке, услышал в основном про автоматический шардинг — то есть масштабирование БД на набор серверов. Заключение — ну, оно это умеет и умеет прекрасно.
В первом рассказывалось про прелести MongoDB. Для своего класса задач — отличная штука. Класс задач, рассмотренный в докладе, можно описать как: «много линейных данных и обработка ложится в Map/Reduce с прозрачным масштабированием». Конкретно у докладчика на Mongo крутится популярное приложение для ВКонтакте, в котором можно отвечать на какие-то вопросы (я не сильно в курсе, но некоторые в зале по описанию поняли о чем речь).
Докладчик очень четко расставил все точки над i. Я раньше уже слушал несколько докладов про NoSQL, но только после этого доклада сильно проникся и многое осознал. Советую посмотреть запись, когда Стас ее выложит.
- MongoDB (Сергей Туленцев, ADD-2011)
Слушал не с начала. Мой интерес к этой теме — представлять уровень развития NoSQL баз данных, их назначение — с тем, чтобы, возможно, начать применять в проектах. В общем, не секрет, что собственно реляционные возможности в реляционной базе данных во многих проектах используются ограниченно. Но их выбирают из-за высокого быстродействия в целом, а также из-за развитых механизмов управления транзакциями, резервного копирования, восстановления, репликаций. И NoSQL базы данных, обеспечив преимущество по скорости за счет своей более простотой организации сейчас наполняются теми механизмами, которые в реляционных БД, например, в Oracle — есть. Уровень зрелости сложно оценить по книгам, тут удобнее доклады тех людей, которые реально используют в своих проектах.
MongoDB очень удобно для прототипирования. Обеспечивает изменение структуры на лету. А еще можно использовать для динамических данных, настраиваемых при конфигурировании продукта. Например, сайт с опросами или CMS. По его оценке сайт для опросов — пара таблиц и 1200 строк, с mysql будет больше.
Очень быстрый доступ по keyvalue. Но не только так — есть 15-20 операций чтобы строить запросы, включая существование элемента в массиве, соответствие всех элементов заданному множеству и т.п. Для конкурентной работы — команда find and modify — документ ищем и сразу меняем, что задано. База данных — кластерная. И в кластер сразу заложено, что есть мастер и дубль, который в случае чего подхватит. А еще есть журнал и лог транзакций — на случай падения. Из инструментов отладки — встроенный профилятор, плюс логирование запросов. К сожалению, есть ограничение — 16М на документ.
При проектирвоании важно правильно расшарить данные, это ключ к масштабированию. Shard key — идентифицирует данные в кластере, он не изменяется — только копирование, а если для коллекции — надо сохранить на диск и загрузить, только так. Пример — user по email. Другой пример — пусть есть ленты пользователей. Можно расшаривать по постам (событиям). А можно — по пользователям. В первом случае лента — распределенная, запрос ленты пользователя пойдет на много серверов. А при падении сервера получается лента с дырками. Во втором случае — вся лента с одного сервера, это эффективно по нагрузке. При проблемах — система не работает с одного сервера. Еще пример с фотками. timestamp в ключе фотки приведет к тому, что все фотографии, загруженные в один момент времени, ложаится в один кластер — не эффективно, потому лучше timestamp+user или timestamp+hash.
Наращиваются механизмы фоновой оптимизации. Например, балансировка чанков в фоновом режиме. Был интересный пример, как сжать таблицу без остановки — включаем вторую ноду-реплику, перелдиваем, сжимаем, переливаем изменения мастера, мастер выключаем.
Рекомендации по быстродействию — в целом понятные, известные и по реляционным базам данных.
- Когда делаете начальный импорт, лучше заранее сделать нужное количество чанков — чтобы это не делать в динамике на импорте.
- Cached Counter. Атрибуты-массивы, но нет операции, выдающей длину. Патерн — храним с каждым списокм counter.
- Covered index — чтобы быстро получать данные из индекса.
- специальные индексы — для более быстрого доступа именно к последним данным.
- Держать часть документов (временные) только в памяти.
- Индексация документов при записи: больше индексов — медленнее.
Интересно, что бывает использование совсем не по назначению — просто Server side jscript…
Еще одна документо-ориентированная СУБД. Про возможности можно почитать на официальном сайте. Докладчик особый упор сделал на архитектуру развертывания, балансировку, примеры выбора shard key.
Интересный рассказ про MongoDB, продвинутую NoSQL базу. У автора доклада на ней крутиться приложение типа [1] для ВКонтакте, в пике — несколько сотен запросов в секунду.
Возможности хранилища
- Документо-ориентированная
- нет схемы
- формат храненич — JSON
- Server-Side JavaScript — «легкие» преобразования перед выдачей/сохранением
- Индексы
- составные
- покрывающие
- уникальные
- разреженные
— создание индекса, однако, блокирует таблицу
- Map/Reduce
- GridFS — подсистема хранения файлов произвольного размера
JOIN’ов нет — нужно денормализовать.
Нет транзакций, только атомарные обновления документов
И, конечно, все это хорошо масштабируется и отказоустойчиво, примем без дополнительного конфигурирования.
Аппаратное
Живет все это дело на двух серверах с 48 гигабайтами оперативной памяти каждый.
- MongoDB (Сергей Туленцев, ADD-2011)
MongoDB — современная нереляционная документо-ориентированная база данных. Eё можно считать золотой серединой между реляционными DB и чистыми хранилищами key-value (как memcached).
Основные качества:
- Документо-ориентированность (документы хранятся в JSON-подобном формате)
- Индексы по любому или нескольким атрибутам
- Удобная репликация с автоматическим failover
- Богатый язык запросов
- Поддержка Map/Reduce
- Подсистема хранения файлов любого размера — GridFS
- Автоматический sharding
Масштабирование:
- Автоматическое (нужно выбрать shard key)
- Определить распределение данных
- Трудно изменить ключ после назначения
Данные разбиваются на блоки (chunks) размером < 64Mb или 100000 объектов. В фоновом режиме работает балансировщик.
Где использовать:
- Статистика
- Богатое key-value хранилище
- Прототипирование
- Динамические данные (CMS, опросы)
Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion».
Репликация: База Знаний «Заказных Информ Систем» → «MongoDB (Сергей Туленцев, ADD-2011)»