Сергей	  Туленцев	         42bytes	  twi6er.com/stulentsev	  
Что	  это	  за	  зверь?	                                        	    база	  данных	    NoSQL	    документо-­‐ориентиров...
Гибкая	  схема	  В	  базу	  можно	  положить	  любой	  JSON	  db.presenta_ons.insert({	  _tle	  :	  “Доклад”,	  	  	  	  	...
Нет	  джойнов	  Потому	  что	  они	  вредные	  и	  не	  нужны.	  	  db.users.insert({	  name	  :	  “Ivan	  Petrov”,	  	  	...
Нет	  транзакций	  Штука	  хорошая	  Но	  страшно	  мешает	  масштабируемости	  Есть	  атомарные	  апдейты	  db.users.upda...
Есть	  индексы	  db.foo.ensureIndex({	  a	  :	  1	  });	  db.foo.ensureIndex({	  a	  :	  1,	  b	  :	  -­‐1});	  db.foo.ens...
Map/Reduce	  
Raw	  data	  {	  	  	  	  	  username	  :	  “Ivan”,	  	  	  	  	  likes	  :	  3,	  	  	  	  	  text	  :	  “Preved	  world”...
Map	  var	  mapper	  =	  func_on	  ()	  {	  	  	  	  	  emit(	  this.username,	  {	  count	  :	  1,	  	  	  	  	  	  	  	 ...
Reduce	  var	  reducer	  =	  func_on(key,	  values)	  {	  	  	  	  	  var	  result	  =	  {count	  :	  0,	  likes	  :	  0};...
Execute	  db.runCommand({mapreduce	  :	  “comments”,	  	  	  	  	  map	  :	  mapper,	  	  	  	  	  reduce	  :	  reducer,	 ...
PROFIT!	  db.mr_result.find();	  {_id	  :	  1,	  value	  :	  {likes	  :	  20,	  count	  :	  3}}	  {_id	  :	  40,	  value	  ...
Server-­‐side	  JavaScript	  
GridFS	  
Масштабирование	  
Кластер	  config	  servers	                                                       client	     mongod	     mongod	          ...
Выбираем	  shard	  key	  Определяет	  распределение	  данных	  Очень	  трудно	  изменить	  Самое	  важное	  решение	  в	  ...
Примеры	  users	  {email	  :	  …,	  name	  :	  …}	  twi6er	  {user_id	  :	  …,	  event_id	  :	  …,	  text	  :	  …}	  photo...
Чанки	  Лимит	  –	  64	  Мб	  или	  100,000	  объектов	  Разделяются	  по	  медианному	  ключу	  Хранят	  диапазон	  значе...
Балансировка	  В	  фоновом	  режиме	  Данные	  не	  блокируются	  Чтения	  –	  консистентны	  
Где	  использовать?	  
Например,	  	  Статистика	  Rich	  key/value	  store	  Прототипирование	  Динамические	  данные	  (опросы,	  CMS)	  
Tips	  &	  Tricks	  
Iniial	  data	  import	  Импорт	  может	  тормозить	  db.runCommand(	  {	  split	  :	  ‘test.foo’,	  	  	  	  	  	  	  	  ...
Cached	  counters	  db.users.find()	  {	  _id	  :	  “123”,	  name	  :	  “Ivan”,	  friends	  :	  [1,	  2,	  3,	  …]}	  db.us...
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.co...
Upcoming SlideShare
Loading in …5
×

MongoDB@addconf

4,280 views

Published on

  • Be the first to comment

  • Be the first to like this

MongoDB@addconf

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

×