SlideShare a Scribd company logo
1 of 30
Download to read offline
Сергей	
  Туленцев	
  
       42bytes	
  
twi6er.com/stulentsev	
  
Что	
  это	
  за	
  зверь?	
  
                                      	
  
  база	
  данных	
  
  NoSQL	
  
  документо-­‐ориентированная	
  
  производительная	
  
  масштабирующаяся	
  
Гибкая	
  схема	
  
В	
  базу	
  можно	
  положить	
  любой	
  JSON	
  

db.presenta_ons.insert({	
  _tle	
  :	
  “Доклад”,	
  
	
  	
  	
  	
  author	
  :	
  {	
  name	
  :	
  “Сергей”,	
  
	
  	
  	
  	
  	
  	
  	
  	
  last_name	
  :	
  “Туленцев”},	
  
	
  	
  	
  	
  date	
  :	
  new	
  Date()	
  
});	
  
Нет	
  джойнов	
  
Потому	
  что	
  они	
  вредные	
  и	
  не	
  нужны.	
  	
  

db.users.insert({	
  name	
  :	
  “Ivan	
  Petrov”,	
  
	
  	
  	
  	
  address	
  :	
  {	
  country	
  :	
  “Russia”,	
  
	
  	
  	
  	
  	
  	
  	
  	
  city	
  :	
  “Moscow”},	
  
	
  	
  	
  	
  interests	
  :	
  [“women”,	
  “hun_ng”]	
  
});	
  
Нет	
  транзакций	
  
Штука	
  хорошая	
  
Но	
  страшно	
  мешает	
  масштабируемости	
  
Есть	
  атомарные	
  апдейты	
  

db.users.update({	
  _id	
  :	
  1},	
  	
  
	
  	
  	
  	
  {	
  $set	
  :	
  {	
  status	
  :	
  ‘banned’	
  }});	
  
Есть	
  индексы	
  
db.foo.ensureIndex({	
  a	
  :	
  1	
  });	
  
db.foo.ensureIndex({	
  a	
  :	
  1,	
  b	
  :	
  -­‐1});	
  
db.foo.ensureIndex({c	
  :	
  1},	
  {unique	
  :	
  true});	
  
db.foo.ensureIndex({	
  d	
  :	
  1},	
  {background	
  :	
  true});	
  
db.foo.ensureIndex({e	
  :	
  1},	
  {sparse	
  :	
  true});	
  
Map/Reduce	
  
Raw	
  data	
  

{	
  
	
  	
  	
  	
  username	
  :	
  “Ivan”,	
  
	
  	
  	
  	
  likes	
  :	
  3,	
  
	
  	
  	
  	
  text	
  :	
  “Preved	
  world”	
  
}	
  
Map	
  

var	
  mapper	
  =	
  func_on	
  ()	
  {	
  
	
  	
  	
  	
  emit(	
  this.username,	
  {	
  count	
  :	
  1,	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  likes	
  :	
  this.likes})	
  
}	
  
Reduce	
  
var	
  reducer	
  =	
  func_on(key,	
  values)	
  {	
  
	
  	
  	
  	
  var	
  result	
  =	
  {count	
  :	
  0,	
  likes	
  :	
  0};	
  

	
  	
  	
  	
  values.forEach(func_on(value)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  result.count	
  +=	
  value.count;	
  
	
  	
  	
  	
  	
  	
  	
  	
  result.likes	
  +=	
  value.likes;	
  
	
  	
  	
  	
  });	
  
	
  	
  	
  	
  return	
  result;	
  
}	
  
Execute	
  

db.runCommand({mapreduce	
  :	
  “comments”,	
  
	
  	
  	
  	
  map	
  :	
  mapper,	
  
	
  	
  	
  	
  reduce	
  :	
  reducer,	
  
	
  	
  	
  	
  out	
  :	
  “mr_result”	
  
});	
  
PROFIT!	
  

db.mr_result.find();	
  

{_id	
  :	
  1,	
  value	
  :	
  {likes	
  :	
  20,	
  count	
  :	
  3}}	
  
{_id	
  :	
  40,	
  value	
  :	
  {likes	
  :	
  0,	
  count	
  :	
  100}}	
  
{_id	
  :	
  55,	
  value	
  :	
  {likes	
  :	
  100500,	
  count	
  :	
  1}}	
  
Server-­‐side	
  JavaScript	
  
GridFS	
  
Масштабирование	
  
Кластер	
  

config	
  servers	
  
                                                     client	
  
   mongod	
  

   mongod	
                                          mongos	
  

   mongod	
                                                                    replica	
  set	
  

                             mongod	
                               mongod	
  

                           mongod	
  

                                        mongod	
  




                                                                  mongod	
  

                                                                                 mongod	
  
Выбираем	
  shard	
  key	
  
Определяет	
  распределение	
  данных	
  
Очень	
  трудно	
  изменить	
  
Самое	
  важное	
  решение	
  в	
  плане	
  
  производительности 	
                	
  	
  
Примеры	
  
users	
  {email	
  :	
  …,	
  name	
  :	
  …}	
  
twi6er	
  {user_id	
  :	
  …,	
  event_id	
  :	
  …,	
  text	
  :	
  …}	
  
photos	
  {photo_id	
  :	
  ???,	
  photo_blob	
  :	
  …}	
  
Чанки	
  
Лимит	
  –	
  64	
  Мб	
  или	
  100,000	
  объектов	
  
Разделяются	
  по	
  медианному	
  ключу	
  
Хранят	
  диапазон	
  значений	
  

       key	
  from	
     key	
  to	
         shard	
  
       min	
  key	
      M	
                 shard001	
  
       M	
               max	
  key	
        shard002	
  
Балансировка	
  
В	
  фоновом	
  режиме	
  
Данные	
  не	
  блокируются	
  
Чтения	
  –	
  консистентны	
  
Где	
  использовать?	
  
Например,	
  	
  
Статистика	
  
Rich	
  key/value	
  store	
  
Прототипирование	
  
Динамические	
  данные	
  (опросы,	
  CMS)	
  
Tips	
  &	
  Tricks	
  
Iniial	
  data	
  import	
  
Импорт	
  может	
  тормозить	
  

db.runCommand(	
  {	
  split	
  :	
  ‘test.foo’,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  middle	
  :	
  {	
  _id	
  :	
  1000}	
  );	
  

db.runCommand(	
  {moveChunk	
  :	
  ‘test.foo’,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  find	
  :	
  {	
  _id	
  :	
  500	
  },	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  to	
  :	
  “shard001”	
  });	
  
Cached	
  counters	
  
db.users.find()	
  
{	
  _id	
  :	
  “123”,	
  name	
  :	
  “Ivan”,	
  friends	
  :	
  [1,	
  2,	
  3,	
  …]}	
  

db.users.update({	
  _id	
  :	
  “123”,	
  
	
  	
  	
  	
  {$push	
  :	
  {	
  friends	
  :	
  55},	
  
	
  	
  	
  	
  	
  $inc	
  :	
  {	
  friend_count	
  :	
  1}	
  });	
  
Covered	
  indexes	
  
db.users.ensureIndex(	
  {email	
  :	
  1,	
  name	
  :	
  1});	
  
Random	
  access	
  vs	
  right-­‐balanced	
  
Надо	
  держать	
  весь	
  индекс	
  в	
  RAM	
  
Random	
  access	
  vs	
  right-­‐balanced	
  
Нужно	
  держать	
  только	
  небольшую	
  часть	
  
Hot	
  writes	
  
memory	
  mapped	
  files	
  
Документы	
  должны	
  быть	
  в	
  памяти	
  
Спасибо	
  за	
  внимание	
  
     Сергей	
  Туленцев      	
  	
  
           42bytes	
  
sergei.tulentsev@gmail.com	
  
   twi6er.com/stulentsev	
  

More Related Content

What's hot

Новое в Mongodb 2.4
Новое в Mongodb 2.4Новое в Mongodb 2.4
Новое в Mongodb 2.4Gleb Lebedev
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in WikimartRoman Zykov
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7Eugene Fidelin
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaMongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaEvgeniy Kuzmin
 
Одно постоянное соединение на все вкладки сайта (Глеб Арестов)
Одно постоянное соединение на все вкладки сайта (Глеб Арестов)Одно постоянное соединение на все вкладки сайта (Глеб Арестов)
Одно постоянное соединение на все вкладки сайта (Глеб Арестов)Ontico
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьYandex
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьYandex
 
SQL Tricky (Иван Фролков)
SQL Tricky (Иван Фролков)SQL Tricky (Иван Фролков)
SQL Tricky (Иван Фролков)Ontico
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.DrupalCampDN
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyEvgeny Kompaniyets
 
Производительный специализированный поиск: архитектура, область применимости ...
Производительный специализированный поиск: архитектура, область применимости ...Производительный специализированный поиск: архитектура, область применимости ...
Производительный специализированный поиск: архитектура, область применимости ...Ontico
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_schoolITmozg
 
Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011ilyubin
 

What's hot (19)

Новое в Mongodb 2.4
Новое в Mongodb 2.4Новое в Mongodb 2.4
Новое в Mongodb 2.4
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in Wikimart
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7
 
Rose::DB
Rose::DBRose::DB
Rose::DB
 
Avito / SPA Meetup 2
Avito / SPA Meetup 2Avito / SPA Meetup 2
Avito / SPA Meetup 2
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaMongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
 
Одно постоянное соединение на все вкладки сайта (Глеб Арестов)
Одно постоянное соединение на все вкладки сайта (Глеб Арестов)Одно постоянное соединение на все вкладки сайта (Глеб Арестов)
Одно постоянное соединение на все вкладки сайта (Глеб Арестов)
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. Асинхронность
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: Асинхронность
 
SQL Tricky (Иван Фролков)
SQL Tricky (Иван Фролков)SQL Tricky (Иван Фролков)
SQL Tricky (Иван Фролков)
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря Groovy
 
Производительный специализированный поиск: архитектура, область применимости ...
Производительный специализированный поиск: архитектура, область применимости ...Производительный специализированный поиск: архитектура, область применимости ...
Производительный специализированный поиск: архитектура, область применимости ...
 
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кодаSECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011Игорь Любин - PowerShell - ConfeT&QA 2011
Игорь Любин - PowerShell - ConfeT&QA 2011
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 

Similar to MongoDB@addconf

MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...phpdevby
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма Spark13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма SparkRoman Brovko
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...Ontico
 
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется всеОмские ИТ-субботники
 
BigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: PersonalizationBigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: PersonalizationAnton Gorokhov
 
Apache Spark — Егор Пахомов
Apache Spark — Егор ПахомовApache Spark — Егор Пахомов
Apache Spark — Егор ПахомовYandex
 
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Yandex
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?Alexey Tokar
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Ivan Muratov
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. SparkTechnopark
 
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)it-people
 
MongoDB. Как готовить, с чем едят?
MongoDB. Как готовить, с чем едят?MongoDB. Как готовить, с чем едят?
MongoDB. Как готовить, с чем едят?Tim Mironov
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Dmytro Mindra
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptDmytro Mindra
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript Dmytro Mindra
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 

Similar to MongoDB@addconf (20)

MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма Spark13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма Spark
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
 
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все
 
Nosql and Mongodb
Nosql and MongodbNosql and Mongodb
Nosql and Mongodb
 
BigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: PersonalizationBigData Week Moscow 2013 - Case: Personalization
BigData Week Moscow 2013 - Case: Personalization
 
Apache Spark — Егор Пахомов
Apache Spark — Егор ПахомовApache Spark — Егор Пахомов
Apache Spark — Егор Пахомов
 
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?
 
Server optimization
Server optimizationServer optimization
Server optimization
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)
DUMP-2012 - Базы данных - "MongoDB" Тимофей Миронов (Timeliner)
 
MongoDB. Как готовить, с чем едят?
MongoDB. Как готовить, с чем едят?MongoDB. Как готовить, с чем едят?
MongoDB. Как готовить, с чем едят?
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012
 
Ciklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScriptCiklum .NET Saturday - Introduction to TypeScript
Ciklum .NET Saturday - Introduction to TypeScript
 
NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript NetworkUA - 2012 - Introduction TypeScript
NetworkUA - 2012 - Introduction TypeScript
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 

MongoDB@addconf

  • 1. Сергей  Туленцев   42bytes   twi6er.com/stulentsev  
  • 2. Что  это  за  зверь?       база  данных     NoSQL     документо-­‐ориентированная     производительная     масштабирующаяся  
  • 3. Гибкая  схема   В  базу  можно  положить  любой  JSON   db.presenta_ons.insert({  _tle  :  “Доклад”,          author  :  {  name  :  “Сергей”,                  last_name  :  “Туленцев”},          date  :  new  Date()   });  
  • 4. Нет  джойнов   Потому  что  они  вредные  и  не  нужны.     db.users.insert({  name  :  “Ivan  Petrov”,          address  :  {  country  :  “Russia”,                  city  :  “Moscow”},          interests  :  [“women”,  “hun_ng”]   });  
  • 5. Нет  транзакций   Штука  хорошая   Но  страшно  мешает  масштабируемости   Есть  атомарные  апдейты   db.users.update({  _id  :  1},            {  $set  :  {  status  :  ‘banned’  }});  
  • 6. Есть  индексы   db.foo.ensureIndex({  a  :  1  });   db.foo.ensureIndex({  a  :  1,  b  :  -­‐1});   db.foo.ensureIndex({c  :  1},  {unique  :  true});   db.foo.ensureIndex({  d  :  1},  {background  :  true});   db.foo.ensureIndex({e  :  1},  {sparse  :  true});  
  • 8. Raw  data   {          username  :  “Ivan”,          likes  :  3,          text  :  “Preved  world”   }  
  • 9. Map   var  mapper  =  func_on  ()  {          emit(  this.username,  {  count  :  1,                                                                                              likes  :  this.likes})   }  
  • 10. Reduce   var  reducer  =  func_on(key,  values)  {          var  result  =  {count  :  0,  likes  :  0};          values.forEach(func_on(value)  {                  result.count  +=  value.count;                  result.likes  +=  value.likes;          });          return  result;   }  
  • 11. Execute   db.runCommand({mapreduce  :  “comments”,          map  :  mapper,          reduce  :  reducer,          out  :  “mr_result”   });  
  • 12. PROFIT!   db.mr_result.find();   {_id  :  1,  value  :  {likes  :  20,  count  :  3}}   {_id  :  40,  value  :  {likes  :  0,  count  :  100}}   {_id  :  55,  value  :  {likes  :  100500,  count  :  1}}  
  • 16. Кластер   config  servers   client   mongod   mongod   mongos   mongod   replica  set   mongod   mongod   mongod   mongod   mongod   mongod  
  • 17. Выбираем  shard  key   Определяет  распределение  данных   Очень  трудно  изменить   Самое  важное  решение  в  плане   производительности      
  • 18. Примеры   users  {email  :  …,  name  :  …}   twi6er  {user_id  :  …,  event_id  :  …,  text  :  …}   photos  {photo_id  :  ???,  photo_blob  :  …}  
  • 19. Чанки   Лимит  –  64  Мб  или  100,000  объектов   Разделяются  по  медианному  ключу   Хранят  диапазон  значений   key  from   key  to   shard   min  key   M   shard001   M   max  key   shard002  
  • 20. Балансировка   В  фоновом  режиме   Данные  не  блокируются   Чтения  –  консистентны  
  • 22. Например,     Статистика   Rich  key/value  store   Прототипирование   Динамические  данные  (опросы,  CMS)  
  • 24. Iniial  data  import   Импорт  может  тормозить   db.runCommand(  {  split  :  ‘test.foo’,                                                                        middle  :  {  _id  :  1000}  );   db.runCommand(  {moveChunk  :  ‘test.foo’,                                                                      find  :  {  _id  :  500  },                                                                      to  :  “shard001”  });  
  • 25. Cached  counters   db.users.find()   {  _id  :  “123”,  name  :  “Ivan”,  friends  :  [1,  2,  3,  …]}   db.users.update({  _id  :  “123”,          {$push  :  {  friends  :  55},            $inc  :  {  friend_count  :  1}  });  
  • 26. Covered  indexes   db.users.ensureIndex(  {email  :  1,  name  :  1});  
  • 27. Random  access  vs  right-­‐balanced   Надо  держать  весь  индекс  в  RAM  
  • 28. Random  access  vs  right-­‐balanced   Нужно  держать  только  небольшую  часть  
  • 29. Hot  writes   memory  mapped  files   Документы  должны  быть  в  памяти  
  • 30. Спасибо  за  внимание   Сергей  Туленцев     42bytes   sergei.tulentsev@gmail.com   twi6er.com/stulentsev