Антон Фроловanton.frolov@dctua.comSkype: a.f.r.o.l.o.v.
NoSQL (not only)!?!?Первое появление (BigTable, Cassandra…)ПопуляризацияКонференции, семинары…
Почему MongoDB?Масштабируемость (data sharding)Schema-less данныеПроизводительностьБыстрый поиск по индексуMapReduceЗапросы в стиле JSON
Memcached vs MongoDBМеханизм хранения данныхПерезагрузка memcachedСброс кешаРазмер объекта 4 Mb > 1 Mbmain_posts_keypopular_posts_keyПосты на главнойПопулярные постыПост (на блоге)rss_posts_keyПосты в RSS
Репликация данныхMaster-slave replicationReplica set
Consistent hashingКонсистентные хэшиServer 0Server 1Server 2Server 33Hash функция: значение % 41,2,3,4,5,6,7…10,11,12,13Набор целых чисел 0 – 2^32 закручиваем в осьКаждому серверу сопоставляется целое число на кольцеКлюч хэшируется в число в том же диапазоне
Архитектура масштабирования данных
Back upFsync, Write Lock and BackupShutdown and BackupExports (mongodump.exe)Slave Backup
Формат хранения данных – документно-ориентированная база данныхБаза данныхКоллекцияДокументСсылка на другой документIdПростыя поляМассивыДругие объектыB
Вставка данныхНа входеvar person = {	name: “Anton”,	surname: “Frolov”,	isUneta: 1,	hands: [“left”, “right”],	mobile: { name: “nokia”, color: “red”, weight: 100 }}На выходеvar person = {_id: ObjectId("4caf6f41b12e0000000007eb"),	name: “Anton”,	surname: “Frolov”,	isUneta: 1,	hands: [“left”, “right”],	mobile: { name: “nokia”, color: “red”, weight: 100 }}ObjectId – уникальный идентификатор:1). Если не указывать явно, то генерируется значение размером 12 байт2). Если явно указать поле _id,то его значение сохранится
УстановкаУстановить можно двумя способами:Windows serviceЗапуск exe файла – работающий процессСтроки соединения: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/database].net clientMongod.exehttp://localhost:28017Mongo.exeДр. приложения
Первое приложения для MongoDBДрайвера для C# .net:  simple-mongodb, csharp-mongodb, NoRM
Индексы в MongoDBИндексы реализованы с помощью B-treeВсегда создается индекс для _idВиды индексов:Простые индексы
Индексы для встроенных документов(embedded)
Документы в качестве индексов
Покрывающий индексПолнотекстовый индексMultikeys feature(индексирует все значения в массиве)Пример для поиска по тегам:Пример поиска по тексту:Вывод: реализации полнотекстового индекса, которая могла бы применяться в качестве готового решения, нет.
Снова индексыУникальные индексы:Создание индекса блокирует работу базы данных, если не указать доп. параметрbackground:Удаление индексов:	Удаление определенных индексов:
КомандыКоманды - специальные операции по работе с базой данных. Скидывание файлов на диск(flush)
Профилирование системы
http://localhost:27017
mongostat.exeinserts/s    - # количество вставок в секундуquery/s      - # количество запросов в секундуupdate/s     - # количество обновлений в секундуdelete/s     - # количество удаленийcommand/s    - # количество команд в секундуflushes/s    - #  количество скидываний файлов в секундуmapped       - данных, замапленых в память
db.serverStatus()globalLock – время блокированияmem – количество занятой памяти в мегабайтахconnections – кол-во соединенийbackgroundFlushing – информация о скидывании файлов на дискopcounters – информация об операциях
MapReduceMap – обработка информации и формирование пары ключ-значениеReduce – собирает промежуточные значения, обрабатывает и выводит результат

MongoDB первые впечатления