Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

MongoDB : la base NoSQL qui réinvente la gestion de données

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Chargement dans…3
×

Consultez-les par la suite

1 sur 246 Publicité
Publicité

Plus De Contenu Connexe

Diaporamas pour vous (20)

Publicité

Plus par SOAT (20)

Publicité

Plus récents (20)

MongoDB : la base NoSQL qui réinvente la gestion de données

  1. 1. MongoDB la base NoSQL qui réinvente la gestion de données 11/28/13 @dwursteisen !1
  2. 2. MongoDB Big Database @DWURSTEISEN
  3. 3. http://fr.slideshare.net/soatexpert
  4. 4. WARNING
  5. 5. Il n’y a pas si longtemps que cela, un site internet faisait sensation…
  6. 6. 20:00:00
  7. 7. Ce site déboite
  8. 8. Oups ! Database Error
  9. 9. no more space disk available
  10. 10. IG B TA A D
  11. 11. oat nS tio ima An 013 ce 2 ran xF vox De
  12. 12. Caractéristiques (sous le capot)
  13. 13. Orienté document
  14. 14. {! } ! "enigme1", ! "_id": v e n d r e d i ", du e": "Enigme "titr e! a t i o n ": t r u "activ
  15. 15. {! ! "enigme1", ! "_id": v e n d r e d i ", du e": "Enigme "titr e! a t i o n ": t r u "activ } {! }! "_id": "enig me1", ! "activation" : true, ! "joueurs": [ ! { "email": " john@doe.com ], ! ", " s c o r e ": 20 }! "indices": [ ! {! "contenu": " je suis ton p è r e ", ! " f l a s h c o d e ": "111-111-111 1 ", ! "joueurs": [ { "email": " } john@doe.com ]! " } ]!
  16. 16. Sans schéma
  17. 17. CREATE TABLE example_default_now ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100), created TIMESTAMP DEFAULT NOW() );
  18. 18. CREATE TABLE example_default_now ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100), created TIMESTAMP DEFAULT NOW() );
  19. 19. Sans transaction
  20. 20. Transaction
  21. 21. Transaction
  22. 22. Transaction
  23. 23. Transaction
  24. 24. Transaction
  25. 25. Transaction
  26. 26. Sans transaction
  27. 27. Sans transaction
  28. 28. Sans transaction
  29. 29. Sans transaction
  30. 30. Update atomique
  31. 31. Sans jointure
  32. 32. {! }! "_id": "enig me1", ! "activation" : true, ! "joueurs": [ ! { "email": " john@doe.com ], ! ", " s c o r e ": 20 }! "indices": [ ! {! "contenu": " je suis ton p è r e ", ! " f l a s h c o d e ": "111-111-111 1 ", ! "joueurs": [ { "email": " } john@doe.com ]! " } ]!
  33. 33. {! }! "_id": "enig me1", ! "activation" : true, ! "joueurs": [ ! { "email": " john@doe.com ], ! ", " s c o r e ": 20 }! "indices": [ ! {! "contenu": " je suis ton p è r e ", ! " f l a s h c o d e ": "111-111-111 1 ", ! "joueurs": [ { "email": " } john@doe.com ]! " } ]! jointure ?
  34. 34. Distribué
  35. 35. Document = 16Mb Hard Limit
  36. 36. Design des structures des données
  37. 37. Type Exemple Int / Double / … { a: 1 } Boolean { b: true } String { c: ‘hello’ } Array { d: [1, 2, 3] } Date {e: ISODate("2012-12-19T06:01:17.171Z") ObjectId {f: ObjectId(‘123456’)} Object {g: {a: 1, b: true}} … http://docs.mongodb.org/manual/reference/bson-types/
  38. 38. Organiser les données selon leurs Utilisations
  39. 39. ci gît la 
 4ème forme 
 normale
  40. 40. Question : Structure de donnée pour l’affichage d’un message ?
  41. 41. 2
  42. 42. Auteur 2
  43. 43. Auteur 2 Contenu
  44. 44. Auteur Contenu 2 Recouicoui
  45. 45. { _id: ObjectId(11),
  46. 46. { _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. »,
  47. 47. { _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla »,
  48. 48. { _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », …
  49. 49. { _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: [ObjectId(22), ObjectId(33)] 
  50. 50. { ! _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: 2, // compteur
  51. 51. { ! _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: [{user: {…}, {user: {…}]
  52. 52. { ! _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: [{user: {…}, {user: {…}]
  53. 53. { ! _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: [{user: {…} * 789013]
  54. 54. { ! _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: [{user: {…} * 789013] > 16Mb
  55. 55. 2
  56. 56. 2 Information partielle
  57. 57. { _id: ObjectId(11), user: {mail: « user1 », avatar: « http://…. », content: « blabla », … recouicoui: { users: [{user: {…} * 5], compteur: 789013 }
  58. 58. Le design d’une bonne complexe structure de donnée est
  59. 59. Query language s u o v z e l ? r a s i P a ç n a r F select * from table
  60. 60. Le shell : mongo
  61. 61. Lecture
  62. 62. Sélection d’un document db.collection.findOne(…)
  63. 63. Query Sélection d’un document db.collection.findOne(…)
  64. 64. Sélection de documents db.collection.find(…)
  65. 65. Sélection et mise à jour de document db.collection.findAndModify(…)
  66. 66. Champ unique {_id: ‘azerty’}
  67. 67. Champ unique {_id: ‘azerty’} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "activation": true! } ✓
  68. 68. Champ unique {_id: ‘azerty’} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "activation": true! ✓ "_id": "azerty", ! "activation": true,! "titre": "Enigme du vendredi"! ✓ } {! }
  69. 69. Champ unique {_id: ‘azerty’} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "activation": true! ✓ "_id": "azerty", ! "activation": true,! "titre": "Enigme du vendredi"! ✓ "_id": "azerty12345", ! "activation": true,! "titre": "Enigme du vendredi"! ✗ } {! } {! }
  70. 70. Sous document spécifique {auteur: {nom: ‘Wursteisen’}}
  71. 71. Sous document spécifique {auteur: {nom: ‘Wursteisen’}} {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen"}! } ✓
  72. 72. Sous document spécifique {auteur: {nom: ‘Wursteisen’}} {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen"}! } ✓ {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen", "prénom":"David"}! } ✗
  73. 73. Sous document spécifique {auteur: {prénom: ‘David’, nom: ‘Wursteisen’}}
  74. 74. Sous document spécifique {auteur: {prénom: ‘David’, nom: ‘Wursteisen’}} {! "_id": "azerty", ! "auteur": {"prénom":"David", "nom":"Wursteisen"}! } ✓
  75. 75. Sous document spécifique {auteur: {prénom: ‘David’, nom: ‘Wursteisen’}} {! "_id": "azerty", ! "auteur": {"prénom":"David", "nom":"Wursteisen"}! } ✓ {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen", "prénom":"David"}! } ✗
  76. 76. Sous champ {‘auteur.nom’: ‘Wursteisen’}
  77. 77. Sous champ {‘auteur.nom’: ‘Wursteisen’} {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen"}! } ✓
  78. 78. Sous champ {‘auteur.nom’: ‘Wursteisen’} {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen"}! } ✓ {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen", "prénom":"David"}! } ✓
  79. 79. Sous champ {‘auteur.nom’: ‘Wursteisen’} {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen"}! } ✓ {! "_id": "azerty", ! "auteur": {"nom":"Wursteisen", "prénom":"David"}! ✓ } {! "_id": "azerty", ! "auteur": {"nom":"Bob", "prénom":"David"}! } ✗
  80. 80. Champ unique {recouicoui: {$gt: 20}}
  81. 81. Champ unique {recouicoui: {$gt: 20}} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "recouicoui": 50! } ✓
  82. 82. Champ unique {recouicoui: {$gt: 20}} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "recouicoui": 50! ✓ "_id": "azerty", ! "titre": "Enigme du vendredi", ! "recouicoui": 10! ✗ } {! }
  83. 83. Champ unique {recouicoui: {$gt: 20}} {! "_id": "azerty", ! "titre": "Enigme du vendredi", ! "recouicoui": 50! ✓ "_id": "azerty", ! "titre": "Enigme du vendredi", ! "recouicoui": 10! ✗ "_id": "azerty", ! "titre": "Enigme du vendredi", ! ✗ } {! } {! ! }
  84. 84. Écriture
  85. 85. Insertion d’un document db.collection.insert(…)
  86. 86. Insertion d’un document db.collection.insert(…) Document
  87. 87. Update d’un document db.collection.update(<query>, <update>)
  88. 88. Update d’un document db.collection.update(<query>, <update>) modifier
  89. 89. Update de documents db.collection.update(…, …, {multi: true})
  90. 90. Écrire un document db.collection.update(…, {prénom:’David’})
  91. 91. Écrire un document db.collection.update(…, {prénom:’David’}) {! "_id": "azerty", ! "nom": "wursteisen", ! "prénom": "bob"! }
  92. 92. Écrire un document db.collection.update(…, {prénom:’David’}) {! "_id": "azerty", ! "nom": "wursteisen", ! "prénom": "bob"! } {! "_id": "azerty", ! "prénom": "David"! }
  93. 93. Modifier un champ db.collection.update(…, {$set: {prénom:’David’}})
  94. 94. Modifier un champ db.collection.update(…, {$set: {prénom:’David’}}) {! "_id": "azerty", ! "nom": "wursteisen", ! "prénom": "bob"! }
  95. 95. Modifier un champ db.collection.update(…, {$set: {prénom:’David’}}) {! "_id": "azerty", ! "nom": "wursteisen", ! "prénom": "bob"! } {! "_id": "azerty", ! "nom": "wursteisen", ! "prénom": "David"! }
  96. 96. Incrémentation db.collection.update(…, {$inc: {recouicoui: 2 }})
  97. 97. Incrémentation db.collection.update(…, {$inc: {recouicoui: 2 }}) {! "_id": "azerty", ! "nom": "wursteisen", ! "recouicoui": 5! }
  98. 98. Incrémentation db.collection.update(…, {$inc: {recouicoui: 2 }}) {! "_id": "azerty", ! "nom": "wursteisen", ! "recouicoui": 5! } {! "_id": "azerty", ! "nom": "wursteisen", ! "recouicoui": 7! }
  99. 99. Ajout dans un tableau db.collection.update(…, {$push: {contact: ‘Robert’ }})
  100. 100. Ajout dans un tableau db.collection.update(…, {$push: {contact: ‘Robert’ }}) {! "_id": "azerty", ! "contact": ["John", "Bob"] } !
  101. 101. Ajout dans un tableau db.collection.update(…, {$push: {contact: ‘Robert’ }}) {! "_id": "azerty", ! "contact": ["John", "Bob"] ! } {! "_id": "azerty", ! "contact": ["John", "Bob", "Robert"] } !
  102. 102. Index
  103. 103. Index simple db.couicoui.ensureIndex({ name:1 })
  104. 104. Index composé db.couicoui.ensureIndex({ name:1, date:-1 })
  105. 105. Géo index db.couicoui.ensureIndex({ geo: ‘2d‘ })
  106. 106. Index avec Time To Live db.couicoui.ensureIndex({ name:1 }, {expireAfterSeconds: 3600})
  107. 107. db.find({…}).explain()
  108. 108. { "cursor" : "<Cursor Type and Index>", "n" : <num>, "nscanned" : <num>, "scanAndOrder" : <boolean>, … }
  109. 109. Replica Set
  110. 110. Driver Primary Secondary Secondary
  111. 111. Driver Écriture Primary Secondary Secondary
  112. 112. Driver Écriture Primary Réplication Secondary Secondary
  113. 113. Driver Écriture Primary Réplication Secondary Réplication Secondary
  114. 114. Driver Écriture Primary Réplication Secondary Lecture Réplication Secondary
  115. 115. Lecture Driver Écriture Primary Réplication Secondary Lecture Réplication Secondary
  116. 116. Primary Secondary Secondary
  117. 117. Primary Heartbeats Secondary Secondary
  118. 118. Primary Heartbeats Secondary Secondary
  119. 119. Primary Secondary Secondary
  120. 120. Primary Secondary Secondary Primary ?
  121. 121. Primary Primary Secondary Primary ?
  122. 122. Réplication Primary Primary Secondary Primary ?
  123. 123. Réplication Primary Primary Secondary Primary ?
  124. 124. Réplication Primary Heartbeats Primary Secondary Primary ?
  125. 125. Réplication Primary Heartbeats Primary Secondary Primary ?
  126. 126. Réplication Secondary Heartbeats Primary Secondary Primary ?
  127. 127. Réplication Secondary Heartbeats Primary Secondary Primary ?
  128. 128. Write Concern notification d’écriture
  129. 129. collection.insert(…, WriteConcern.ACKNOWLEDGED); ! db.getLastError(); (dépendant du driver)
  130. 130. w=1 collection.insert(…, WriteConcern.ACKNOWLEDGED); ! db.getLastError(); (dépendant du driver)
  131. 131. w=1 collection.insert(…, WriteConcern.ACKNOWLEDGED); ! db.getLastError(); bloquant (dépendant du driver)
  132. 132. disable acknowledgment w=0
  133. 133. Driver Mongod
  134. 134. Driver write Mongod
  135. 135. write Mongod getLastError
 w=0 Driver
  136. 136. getLastError response write Mongod getLastError
 w=0 Driver
  137. 137. acknowledgment w=1
  138. 138. Driver Mongod
  139. 139. Driver write Mongod
  140. 140. write Mongod getLastError
 w=1 Driver
  141. 141. write getLastError
 w=1 Driver Mongod apply
  142. 142. Mongod apply getLastError response write getLastError
 w=1 Driver
  143. 143. bloquant Mongod apply getLastError response write getLastError
 w=1 Driver
  144. 144. journal j=1
  145. 145. Driver Mongod
  146. 146. Driver write Mongod
  147. 147. write Mongod getLastError
 w=1,j=1 Driver
  148. 148. write getLastError
 w=1,j=1 Driver Mongod apply
  149. 149. write getLastError
 w=1,j=1 Driver Mongod apply write to journal
  150. 150. write to journal apply getLastError response write getLastError
 w=1,j=1 Driver Mongod
  151. 151. bloquant write to journal apply getLastError response write getLastError
 w=1,j=1 Driver Mongod
  152. 152. replica acknowledgment w=2
  153. 153. Driver Primary Secondary Secondary
  154. 154. Driver write Primary Secondary Secondary
  155. 155. write Primary Secondary Secondary getLastError
 w=2 Driver
  156. 156. write getLastError
 w=2 Driver Primary apply Secondary Secondary
  157. 157. write getLastError
 w=2 Driver apply Secondary Secondary replicate Primary
  158. 158. write getLastError
 w=2 Driver apply Secondary Secondary replicate Primary
  159. 159. apply Secondary replicate Primary getLastError response write Secondary getLastError
 w=2 Driver
  160. 160. apply Secondary replicate Primary getLastError response Driver getLastError
 w=2 write Secondary bloquant
  161. 161. Secondary replicate apply replicate Primary getLastError response Driver getLastError
 w=2 write Secondary bloquant
  162. 162. Sharding Répartition
  163. 163. collection
  164. 164. collection Shard1 Shard2 Shard3
  165. 165. collection Shard1 {x: min} Shard2 {x: -11} Shard3 {x: 50} {x: max}
  166. 166. Avec une clé de sharding
  167. 167. db.collect.find({key: …}) Mongos
  168. 168. db.collect.find({key: …}) Mongos
  169. 169. db.collect.find({key: …}) Mongos
  170. 170. db.collect.find({key: …}) Mongos
  171. 171. db.collect.find({key: …}) Mongos
  172. 172. Avec une clé non shardé
  173. 173. db.collect.find({other: …}) Mongos
  174. 174. db.collect.find({other: …}) Mongos
  175. 175. db.collect.find({other: …}) Mongos
  176. 176. Question : Clé de sharding pour gérer 
 les messages d’un utilisateur ?
  177. 177. Répartition Cardinalité Isolation en écriture _id Fiabilité
  178. 178. ObjectId(« 507f1f77bcf86cd799439011 ») http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  179. 179. Timestamp ObjectId(« 507f1f77bcf86cd799439011 ») http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  180. 180. Timestamp ObjectId(« 507f1f77bcf86cd799439011 ») Host http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  181. 181. Timestamp PID ObjectId(« 507f1f77bcf86cd799439011 ») Host http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  182. 182. Timestamp PID ObjectId(« 507f1f77bcf86cd799439011 ») Host Compteur http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  183. 183. Timestamp ObjectId(« 507f1f77bcf86cd799439011 ») http://www.mongodb.com/presentations/advanced-sharding-features-mongodb-24
  184. 184. Répartition Cardinalité Isolation en écriture _id ✓ ✗ ✗ Fiabilité ✗
  185. 185. db.collect.insert({…}) Mongos
  186. 186. db.collect.insert({…}) Mongos
  187. 187. db.collect.find({…}) Mongos
  188. 188. db.collect.find({…}) Mongos
  189. 189. db.collect.find({…}) Mongos
  190. 190. Répartition Cardinalité Isolation en écriture _id hash(_id) Fiabilité ✓ ✗ ✗ ✓ ✓ ✗ ✗ ✗
  191. 191. db.collect.insert({…}) Mongos
  192. 192. db.collect.insert({…}) Mongos
  193. 193. db.collect.insert({…}) Mongos
  194. 194. db.collect.insert({…}) Mongos
  195. 195. db.collect.find({…}) Mongos
  196. 196. db.collect.find({…}) Mongos
  197. 197. db.collect.find({…}) Mongos
  198. 198. Répartition Cardinalité Isolation en écriture _id hash(_id) user Fiabilité ✓ ✗ ✗ ✗ ✓ ✓ ✗ ✗ ✗ ✓ ✓ ✓
  199. 199. db.collect.insert({…}) Mongos
  200. 200. db.collect.insert({…}) Mongos
  201. 201. db.collect.insert({…}) Mongos
  202. 202. db.collect.insert({…}) Mongos
  203. 203. db.collect.find({…}) Mongos
  204. 204. db.collect.find({…}) Mongos
  205. 205. db.collect.find({…}) Mongos
  206. 206. Répartition Cardinalité Isolation en écriture _id hash(_id) user user, time ✓ ✓ ✗ ✓ ✗ ✓ ✓ ✓ ✗ ✗ ✓ ✓ Fiabilité ✗ ✗ ✓ ✓
  207. 207. db.collect.insert({…}) Mongos
  208. 208. db.collect.insert({…}) Mongos
  209. 209. db.collect.insert({…}) Mongos
  210. 210. db.collect.insert({…}) Mongos
  211. 211. db.collect.find({…}) Mongos
  212. 212. db.collect.find({…}) Mongos
  213. 213. db.collect.find({…}) Mongos
  214. 214. Aller plus loin…
  215. 215. https://education.mongodb.com
  216. 216. http://www.meetup.com/Paris-MongoDB-User-Group/
  217. 217. Demo
  218. 218. https://github.com/dwursteisen/atelier-mongodb
  219. 219. Questions ? @dwursteisen
  220. 220. Crédits photos
  221. 221. http://bit.ly/HNvkfZ http://bit.ly/1hTARzS http://bit.ly/HGb1BO http://bit.ly/1hrvZ7z http://bit.ly/1d5OVTr http://bit.ly/17SGXwC http://bit.ly/1awf0XL http://bit.ly/HNvRP4 http://bit.ly/MMaRr8
  222. 222. http://bit.ly/HGf2Gh http://bit.ly/1967kv2 http://bit.ly/1c6uCUA

×