mirroir readonly du Gitit wiki.evolix.org (attention, ne rien commiter/merger sur ce dépôt) https://wiki.evolix.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

849 lines
20 KiB

4 years ago
4 years ago
3 years ago
  1. ---
  2. title: Howto MongoDB
  3. ---
  4. **Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.**
  5. * Documentation (2.4) : <https://docs.mongodb.com/v2.4/>
  6. * Référence de configuration (2.4) : <https://docs.mongodb.com/v2.4/reference/configuration-options/>
  7. * Documentation (3.4) : <https://docs.mongodb.com/manual/>
  8. * Référence de configuration (3.4) : <https://docs.mongodb.com/manual/reference/configuration-options/>
  9. ## Installation
  10. ### Paquet Debian stable
  11. C'est la verison 2.4 qui est disponible dans les paquets stables de Debian :
  12. ~~~
  13. # aptitude install mongodb
  14. ~~~
  15. ### Paquet de 10Gen
  16. L'éditeur de MongoDB fourni des paquets pour Debian, depuis leur dépôt. La version 3.4 est disponible.
  17. ~~~
  18. # apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
  19. # echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.4 main" >> /etc/apt/sources.list.d/mongodb.list
  20. ~~~
  21. Puis :
  22. ~~~
  23. # apt install mongodb-org
  24. ~~~
  25. Tous les détails sont disponibles sur <https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/>.
  26. ## Logrotate
  27. ### 3.4
  28. Les paquets fournis par 10Gen n'ont pas de logrotate !
  29. On peut simplement ajouter cette configuration dans `/etc/logrotate.d/mongodb`
  30. ~~~
  31. /var/log/mongod.log {
  32. daily
  33. missingok
  34. rotate 365
  35. dateext
  36. compress
  37. delaycompress
  38. notifempty
  39. sharedscripts
  40. postrotate
  41. kill -0 $(cat /var/lib/mongodb/mongod.lock) && kill -USR1 $(cat /var/lib/mongodb/mongod.lock)
  42. endscript
  43. }
  44. ~~~
  45. Il faut aussi penser à modifier la configuration (`/etc/mongod.conf`) pour forcer le mode _reopen_ :
  46. ~~~
  47. systemLog:
  48. destination: file
  49. logRotate: reopen
  50. logAppend: true
  51. path: /var/log/mongod.log
  52. ~~~
  53. Il y a tout un chapitre (pas toujours très clair) sur la maière de gérer la rotation de logs : <https://docs.mongodb.com/manual/reference/command/logRotate/>.
  54. > **Note** : Attention, mongodb-org-server 2.4 génère des logs *mongodb.log** mais en 3.2 des logs *mongod.log**
  55. > **Note** : Attention, par défaut mongodb log les requêtes lentes de plus de 100ms. Ça peut générer beaucoup de logs… On pourra les modifier avec [slowOpThresholdMs](https://docs.mongodb.com/manual/reference/configuration-options/#operationProfiling.slowOpThresholdMs).
  56. ## Configuration
  57. ### 2.4
  58. La configuration de MongoDB se trouve dans le fichier `/etc/mongodb.conf` :
  59. ~~~
  60. bind_ip = 127.0.0.1
  61. port = 27017
  62. auth = true
  63. #cpu = true
  64. #verbose = true
  65. #slowms = 42
  66. ~~~
  67. ATTENTION : la configuration de MongoDB est *très* spéciale… si vous voulez désactiver les logs verbose
  68. par exemple, il ne faut pas faire _verbose # false_ car _verbose NIMPORTEQUOI_ active les logs verbeux !!
  69. Il faut donc se méfier et suivre la documentation à la lettre…
  70. ### 3.4
  71. La configuration de MongoDB se trouve dans le fichier `/etc/mongod.conf` et le format a changé.
  72. ## Authentification
  73. ### 2.4
  74. <https://docs.mongodb.com/v2.4/core/security-introduction/>
  75. MongoDB a deux modes de fonctionnement pour l'authentification :
  76. * Un mode sans aucune authentification
  77. * Un mode avec authentification
  78. Info : activer l'authentification génère des logs à chaque requête d'authentification qu'il n'est pas possible de désactiver avant la version 2.8 : voir <https://jira.mongodb.org/browse/SERVER-5952>
  79. #### Mode sans aucune authentification
  80. La configuration sans authentification se fait ainsi :
  81. ~~~
  82. noauth = true
  83. ~~~
  84. Dans ce mode, il n'y a besoin d'aucun login / mot de passe pour accéder à l'ensemble des dbs, données, etc.
  85. Ce mode est donc assez dangereux : il faut s'assurer que seuls des programmes de confiance accèdent
  86. au port TCP de MongoDB.
  87. #### Mode avec authentification
  88. ATTENTION, ce mode doit être correctement configuré (ce qui n'est pas le cas par défaut).
  89. La configuration doit donc être ainsi :
  90. ~~~
  91. auth = true
  92. ~~~
  93. Mais surtout, il faut créer (au moins) un utilisateur "admin" :
  94. ~~~
  95. $ mongo
  96. > use admin
  97. > db.addUser("mongoadmin", "PASS")
  98. {
  99. "user" : "mongoadmin",
  100. "readOnly" : false,
  101. "pwd" : "3882eaa67064707a7a6ae872504f310d"
  102. }
  103. > db.system.users.find()
  104. { "_id" : ObjectId("4e8e132c76a7c48c75393b81"), "user" : "mongoadmin", "readOnly" : false, "pwd" : "3882eaa67064707a7a6ae872504f310d" }
  105. ~~~
  106. C'est seulement une fois ce premier utilisateur "admin" créé que l'authentication est activée !!
  107. Si il n'est pas créé, l'authentification reste inactive...
  108. On peut ensuite se connecter à la base "admin" ainsi :
  109. ~~~
  110. $ mongo admin -u mongoadmin -p PASS
  111. ~~~
  112. Pour les accès aux base, les utilisateurs sont stockés dans la collection _system.users_ propre à chaque base.
  113. Ainsi pour créer un utilisateur pour une base données :
  114. ~~~
  115. > use mydb
  116. > db.addUser("foo","PASS");
  117. ~~~
  118. Les utilisateurs (admin ou associés à une base de données) peuvent n'avoir qu'un accès read-only si
  119. ils sont créés ainsi :
  120. ~~~
  121. > db.addUser("foo","PASS",true);
  122. ~~~
  123. Enfin, pour supprimer un utilisateur :
  124. ~~~
  125. > use mydb
  126. > db.removeUser("foo");
  127. ~~~
  128. ### 3.4
  129. <https://docs.mongodb.com/manual/security/>
  130. ## Utilisation
  131. En ligne de commande :
  132. ~~~
  133. $ mongo
  134. MongoDB shell version: 1.4.4
  135. url: test
  136. connecting to: test
  137. type "help" for help
  138. ~~~
  139. Voici les opérations de base :
  140. ~~~
  141. > show dbs
  142. admin
  143. local
  144. test
  145. > use foo
  146. switched to db foo
  147. > show collections
  148. > db.bar.find()
  149. > db.bar.save( { a : 1 } )
  150. > db.bar.save( { a : 2 } )
  151. > show collections
  152. bar
  153. system.indexes
  154. > db.bar.find()
  155. { "_id" : ObjectId("4e64dbf619a27977131978ad"), "a" : 1 }
  156. { "_id" : ObjectId("4e64dbf919a27977131978ae"), "a" : 2 }
  157. > db.foo.find({a:1})
  158. { "_id" : ObjectId("4e0674a47888d8941034f4e1"), "a" : 1 }
  159. > db.foo.find().limit(1)
  160. { "_id" : ObjectId("4e0674a47888d8941034f4e1"), "a" : 1 }
  161. > exit
  162. bye
  163. ~~~
  164. Quelques commandes utiles :
  165. Voir le compteur des connexions :
  166. ~~~
  167. db.serverStatus().connections
  168. ~~~
  169. Modifier un champ d'un objet existant :
  170. ~~~
  171. > db.bar.save( { a : 4, b : 0 } )
  172. > db.bar.update( { "_id" : ObjectId("4e64de8a19a27977131978b0") } , { $set : {b:1} } )
  173. > db.bar.update( { "_id" : ObjectId("4e64de8a19a27977131978b0") } , { $unset : {b:1} } )
  174. ~~~
  175. Voir uniquement certains champs :
  176. ~~~
  177. > db.bar.find({a:1},{flip:1})
  178. > db.bar.find({a:1},{flip:1,flap:1})
  179. ~~~
  180. Voir plus d'objets (en évitant le _has more_) :
  181. ~~~
  182. > DBQuery.shellBatchSize = 100
  183. > db.foo.find()
  184. ~~~
  185. Requête sur des dates :
  186. ~~~
  187. db.foo.find( { "date": {"$gte": ISODate("2011-12-05T00:21:00Z")} } )
  188. db.foo.find( { "date": {"$lt": ISODate("2011-12-05T04:00:00Z")} } )
  189. db.foo.find( { "date": {"$gte": ISODate("2011-12-05T00:21:00Z"), "$lt": ISODate("2011-12-05T04:00:00Z")} } )
  190. ~~~
  191. En PHP :
  192. ~~~
  193. $m = new Mongo();
  194. $db = $m->foo;
  195. $bar = $db->bar;
  196. $bar->insert(array("a"=>"1","a"=>"2"));
  197. $res = $bar->find();
  198. foreach ($res as $obj) {
  199. echo $obj["a"] . "\n";
  200. }
  201. ~~~
  202. ## Sauvegarde
  203. ### 2.4
  204. <https://docs.mongodb.com/v2.4/core/backups/>
  205. ~~~
  206. # mkdir /home/backup/mongodump
  207. # cd /home/backup/mongodump
  208. # mongodump
  209. ~~~
  210. ### 3.4
  211. Il exise plus de possibilités de sauvegarde dans les versions récentes :
  212. <https://docs.mongodb.com/manual/core/backups/>
  213. ## Restauration
  214. ~~~
  215. cd /home/backup/mongodump/
  216. # mongorestore --db dbname dbname
  217. mongorestore --db admin admin
  218. ~~~
  219. ## Réplication avec replica set
  220. La réplication avec "replica set" nécessite au moins 3 machines : en effet, il va y avoir une élection
  221. du master vers lequel seront faites toutes les écritures.
  222. ### En Version 3.2+
  223. Si vos mongod ne sont pas sur un LAN il est recommandé de mettre en place du TLS avec <https://docs.mongodb.com/manual/tutorial/configure-x509-member-authentication/.>
  224. Sinon on pourra utiliser un keyfile <https://docs.mongodb.com/manual/tutorial/deploy-replica-set-with-keyfile-access-control/>
  225. */!\ Le datadir doit être vierge.*
  226. #### Avec keyfile
  227. Créer le keyfile sur une machine et déployer sur les autres le même fichier.
  228. ~~~
  229. # openssl rand -base64 755 > /etc/mongod.key
  230. # chmod 400 /etc/mongod.key
  231. # chown mongodb: /etc/mongod.key
  232. ~~~
  233. Modifier la configuration :
  234. ~~~
  235. security:
  236. keyFile: /etc/mongod.key
  237. replication:
  238. replSetName: rs0
  239. ~~~
  240. Redémarrer les mongod.
  241. ~~~
  242. # systemctl restart mongod
  243. ~~~
  244. Se connecter et initialiser le RS.
  245. ~~~
  246. # mongo
  247. > rs.initiate(
  248. {
  249. _id : "rs0",
  250. members: [
  251. { _id : 0, host : "mongo1.example.net:27017" },
  252. { _id : 1, host : "mongo2.example.net:27017" },
  253. { _id : 2, host : "mongo3.example.net:27017" }
  254. ]
  255. }
  256. )
  257. ~~~
  258. Se connecter au master (voir avec rs.Status()) et créer un utilisateur admin et clusterAdmin.
  259. ~~~
  260. # mongo
  261. > use admin
  262. use admin
  263. db.createUser(
  264. {
  265. user: "myUserAdmin",
  266. pwd: "abc123",
  267. roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  268. }
  269. )
  270. db.createUser(
  271. {
  272. "user" : "clusteradmin",
  273. "pwd" : "abc123",
  274. roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
  275. }
  276. )
  277. ~~~
  278. Le Replica Set est maintenant en place.
  279. #### Avec X.509
  280. TODO
  281. ### En version 1.8
  282. Soit trois machines de test avec MongoDB 1.8.2 : mongo1 (PRIMARY), mongo2 (SECONDARY), mongo3 (SECONDARY)
  283. Activer le paramètre suivant dans /etc/mongodb.conf :
  284. ~~~
  285. # in replica set configuration, specify the name of the replica set
  286. replSet = foo
  287. # Enable journaling (recommended for replica set)
  288. journal = true
  289. ~~~
  290. À ce stade, on ne peut rien écrire sur les serveurs :
  291. ~~~
  292. > db.test.insert({"coin": "coin"})
  293. not master
  294. > rs.status()
  295. {
  296. "startupStatus" : 3,
  297. "info" : "run rs.initiate(...) if not yet done for the set",
  298. "errmsg" : "can't get local.system.replset config from self or any seed (EMPTYCONFIG)",
  299. "ok" : 0
  300. }
  301. ~~~
  302. Réinitialiser les bases sur chaque machine (attention, opération destructrice !) :
  303. ~~~
  304. /etc/init.d/mongodb stop && mv /var/lib/mongodb/* /tmp && /etc/init.d/mongodb start
  305. ~~~
  306. ### Sur mongo1 (PRIMARY)
  307. Il faut ensuite s'assurer que :
  308. - les machines communiquent bien au niveau réseau en TCP/27017
  309. - que les machines n'ont pas de NAT (ou alors il faudra utiliser des DNS)
  310. Puis on initialise la réplication via le mongo shell :
  311. ~~~
  312. > config = {_id: 'foo' , members: [ {_id: 0, host: '1.2.3.4:27017'},{_id: 1, host: '1.2.3.5:27017'},{_id: 2, host: '1.2.3.6:27017'}]}
  313. > rs.initiate(config);
  314. {
  315. "info" : "Config now saved locally. Should come online in about a minute.",
  316. "ok" : 1
  317. }
  318. > rs.help()
  319. ~~~
  320. On peut aussi le faire étape par étape
  321. ~~~
  322. > rs.initiate()
  323. {
  324. "info2" : "no configuration explicitly specified -- making one",
  325. "info" : "Config now saved locally. Should come online in about a minute.",
  326. "ok" : 1
  327. }
  328. ~~~
  329. Ajout des 2 SECONDARY :
  330. ~~~
  331. setname:PRIMARY> rs.add("mongo2")
  332. { "ok" : 1 }
  333. setname:PRIMARY> rs.add("mongo3")
  334. { "ok" : 1 }
  335. ~~~
  336. Consultation de l'état de la réplication sur le master :
  337. ~~~
  338. setname:PRIMARY> rs.status()
  339. {
  340. "set" : "setname",
  341. "date" : ISODate("2011-08-09T15:42:54Z"),
  342. "myState" : 1,
  343. "members" : [
  344. {
  345. "_id" : 0,
  346. "name" : "mongo1",
  347. "health" : 1,
  348. "state" : 1,
  349. "stateStr" : "PRIMARY",
  350. "optime" : {
  351. "t" : 1312904495000,
  352. "i" : 1
  353. },
  354. "optimeDate" : ISODate("2011-08-09T15:41:35Z"),
  355. "self" : true
  356. },
  357. {
  358. "_id" : 1,
  359. "name" : "mongo2",
  360. "health" : 1,
  361. "state" : 2,
  362. "stateStr" : "SECONDARY",
  363. "uptime" : 76,
  364. "optime" : {
  365. "t" : 1312904495000,
  366. "i" : 1
  367. },
  368. "optimeDate" : ISODate("2011-08-09T15:41:35Z"),
  369. "lastHeartbeat" : ISODate("2011-08-09T15:42:54Z")
  370. },
  371. {
  372. "_id" : 2,
  373. "name" : "mongo3",
  374. "health" : 1,
  375. "state" : 2,
  376. "stateStr" : "SECONDARY",
  377. "uptime" : 70,
  378. "optime" : {
  379. "t" : 1312904495000,
  380. "i" : 1
  381. },
  382. "optimeDate" : ISODate("2011-08-09T15:41:35Z"),
  383. "lastHeartbeat" : ISODate("2011-08-09T15:42:54Z")
  384. }
  385. ],
  386. "ok" : 1
  387. }
  388. ~~~
  389. Sur un slave :
  390. ~~~
  391. SECONDARY> db.printReplicationInfo()
  392. this is a slave, printing slave replication info.
  393. source: 92.243.5.219:27017
  394. syncedTo: Sun Jan 29 2012 22:34:07 GMT+0100 (CET)
  395. = 5744 secs ago (1.6hrs)
  396. source: stampzz-prod01.evolix.net:27017
  397. syncedTo: Mon Jan 30 2012 00:09:47 GMT+0100 (CET)
  398. = 4 secs ago (0hrs)
  399. SECONDARY> use local
  400. switched to db local
  401. SECONDARY> db.oplog.rs.stats()
  402. {
  403. "ns" : "local.oplog.rs",
  404. "count" : 9616448,
  405. "size" : 1166277368,
  406. "avgObjSize" : 121.27943373686418,
  407. "storageSize" : 1320140800,
  408. "numExtents" : 1,
  409. "nindexes" : 0,
  410. "lastExtentSize" : 1320140800,
  411. "paddingFactor" : 1,
  412. "flags" : 0,
  413. "totalIndexSize" : 0,
  414. "indexSizes" : {
  415. },
  416. "capped" : 1,
  417. "max" : 2147483647,
  418. "ok" : 1
  419. }
  420. ~~~
  421. Création d'un enregistrement de test :
  422. ~~~
  423. setname:PRIMARY> db.foo.save({a:1})
  424. setname:PRIMARY>
  425. ~~~
  426. ### Sur mongo2 ou mongo3 (SECONDARY)
  427. Autorise le SECONDARY à traiter des requêtes :
  428. ~~~
  429. setname:SECONDARY> rs.slaveOk()
  430. ~~~
  431. Vérification de la présence de l'enregistrement de test :
  432. ~~~
  433. setname:SECONDARY> db.foo.find()
  434. { "_id" : ObjectId("4e41558da08ccc36090745be"), "a" : 1 }
  435. ~~~
  436. ### Sortir un mongo de la réplication
  437. Voici les étapes pour sortir un mongo de la réplication :
  438. 1. Sauvegarder (mongodump)
  439. 1. Stopper MongoDB
  440. 1. Sauvegarder les datas
  441. 1. Supprimer les fichiers local.*
  442. 1. Désactiver les replica dans la configuration
  443. 1. Relancer MongoDB
  444. ### Resynchroniser un mongo slave
  445. En cas de soucis, il peut être nécessaire de resynchroniser complètement un serveur MongoDB
  446. par rapport à un master. Il suffit de supprimer complètement le _dbpath_ :
  447. ~~~
  448. # /etc/init.d/monogdb stop
  449. # mv /var/lib/mongodb /var/lib/mongodb.old
  450. # mkdir /var/lib/mongodb
  451. # chown mongodb:mongodb /var/lib/mongodb
  452. # chmod 750 /var/lib/mongodb
  453. # /etc/init.d/monogdb start
  454. ~~~
  455. Le serveur slave repassera en RECOVERING puis en SECONDARY :
  456. ~~~
  457. RECOVERING> db.printReplicationInfo()
  458. this is a slave, printing slave replication info.
  459. source: master.example.com:27017
  460. syncedTo: Thu Jan 01 1970 01:00:00 GMT+0100 (CET)
  461. = 1327878874 secs ago (368855.24hrs)
  462. source: otherslave.example.com:27017
  463. syncedTo: Mon Jan 30 2012 00:14:09 GMT+0100 (CET)
  464. = 25 secs ago (0.01hrs)
  465. SECONDARY> db.printReplicationInfo()
  466. configured oplog size: 1025.1384765625MB
  467. log length start to end: 741secs (0.21hrs)
  468. oplog first event time: Mon Jan 30 2012 00:14:09 GMT+0100 (CET)
  469. oplog last event time: Mon Jan 30 2012 00:26:30 GMT+0100 (CET)
  470. now: Mon Jan 30 2012 00:27:26 GMT+0100 (CET)
  471. ~~~
  472. ### Erreurs de synchronisation
  473. En cas d'erreur du type :
  474. ~~~
  475. "optimeDate" : ISODate("2012-01-29T21:34:07Z"),
  476. "lastHeartbeat" : ISODate("2012-01-29T23:02:43Z"),
  477. "pingMs" : 11,
  478. "errmsg" : "syncTail: 0 assertion db/pdfile.cpp:1881, syncing: { ts: Timestamp 1327872847000|109, h: -1582883220170752094, op: \"i\", ns: \"DB_MONGODB.tmp.mr.COLL_MONGODB_396779\", o: { _id: \"#colorsplash\", value: 1.0 } }"
  479. ~~~
  480. Côté slave, on a plus de détails :
  481. ~~~
  482. [rsSync] replHandshake res not: 1 res: { ok: 1.0 }
  483. [rsSync] local.oplog.rs Assertion failure !loc.isNull() db/pdfile.cpp 1881
  484. 0x57eeb6 0x589d6b 0x8a2746 0x82f486 0x821d8d 0x8231d8 0x82439a 0x824820 0xaa4560 0x7f1a33ef08ba 0x7f1a334ac02d
  485. /usr/bin/mongod(_ZN5mongo12sayDbContextEPKc+0x96) [0x57eeb6]
  486. /usr/bin/mongod(_ZN5mongo8assertedEPKcS1_j+0xfb) [0x589d6b]
  487. /usr/bin/mongod() [0x8a2746]
  488. /usr/bin/mongod(_ZN5mongo11_logOpObjRSERKNS_7BSONObjE+0x236) [0x82f486]
  489. /usr/bin/mongod(_ZN5mongo11ReplSetImpl8syncTailEv+0xced) [0x821d8d]
  490. /usr/bin/mongod(_ZN5mongo11ReplSetImpl11_syncThreadEv+0xc8) [0x8231d8]
  491. /usr/bin/mongod(_ZN5mongo11ReplSetImpl10syncThreadEv+0x4a) [0x82439a]
  492. /usr/bin/mongod(_ZN5mongo15startSyncThreadEv+0xa0) [0x824820]
  493. /usr/bin/mongod(thread_proxy+0x80) [0xaa4560]
  494. /lib/libpthread.so.0(+0x68ba) [0x7f1a33ef08ba]
  495. /lib/libc.so.6(clone+0x6d) [0x7f1a334ac02d]
  496. [rsSync] replSet syncTail: 0 assertion db/pdfile.cpp:1881, syncing: { ts: Timestamp 1327872847000|109, h: -1582883220170752094, op: "i", ns: "DB_MONGODB.tmp.mr.COLL_MONGODB_396779", o: { _id: "#colorsplash", value: 1.0 } }
  497. ~~~
  498. Cela semble être une corruption de la base côté slave...
  499. L'une des solutions consiste à resynchroniser complètement la base
  500. (voir plus haut).
  501. ### Forcer à changer de master
  502. ~~~
  503. > rs.stepDown()
  504. ~~~
  505. /!\ à ne faire que si les slaves sont synchros sous peine
  506. d'avoir un état rollback & ennuis...
  507. ### Etat ROLLBACK
  508. Master devient indispo alors que les slaves n'était pas 100% synchro
  509. <http://www.mongodb.org/display/DOCS/Replica+Sets+-+Rollbacks>
  510. <http://dba.stackexchange.com/questions/18020/mongodb-replica-set-secondary-stuck-in-rollback-state>
  511. <http://comerford.cc/2012/05/28/simulating-rollback-on-mongodb/>
  512. <http://comments.gmane.org/gmane.comp.db.mongodb.user/78137>
  513. ROLLBACK -> RECOVERY -> SECONDARY.. ou #FAIL avec Error RS102
  514. <http://www.mongodb.org/display/DOCS/Resyncing+a+Very+Stale+Replica+Set+Member>
  515. ### replicaset lag
  516. <http://docs.mongodb.org/manual/administration/replica-sets/#replica-set-replication-lag>
  517. <http://metabroadcast.com/blog/mongodb-replication-lag-and-the-road-to-recovery>
  518. ## Réparer la base de données en cas de crash
  519. Plusieurs méthodes selon cas.
  520. 1. Si la journalisation est activé, ce qui est le cas par défaut pour les version >1.9.2 et en 64 bits.
  521. MongoDB devrait automatiquement se servir des fichiers journaux, regardez si tout se passe bien dans les logs.
  522. Si malheureusement ce message apparaît :
  523. ~~~
  524. old lock file: mongod.lock. probably means unclean shutdown,
  525. but there are no journal files to recover.
  526. ~~~
  527. Il faut vérifier que le système de fichier est OK !
  528. 1. Si la journalisation n'est pas activé.
  529. Supprimez le verrou et démarrer mongodb avec l'option pour lancer une réparation.
  530. ~~~
  531. rm /var/lib/mongodb/mongod.lock
  532. mongod --dbpath /var/lib/mongodb/ --repairpath /tmp --repair
  533. ~~~
  534. Vérifiez les droits du dbpath !
  535. ~~~
  536. chown -R mongodb:mongodb /var/lib/mongodb
  537. ~~~
  538. Démarrez mongodb, lancez un mongo shell et lancer une réparation de toutes les base de données.
  539. ~~~
  540. db.repairDatabase();
  541. ~~~
  542. ## Mise à jour
  543. ### 1.8 vers 2.0
  544. Voici la procédure pour passer en Mongo 2.0 (version sortie en sept/oct 2011) :
  545. ~~~
  546. # aptitude update
  547. # aptitude install mongodb-10gen
  548. ~~~
  549. La version 2.0 active désormais par défaut la journalisation.
  550. Vous pouvez donc remplacer dans votre configuration :
  551. ~~~
  552. journal = true
  553. ~~~
  554. par :
  555. ~~~
  556. # Disables write-ahead journaling
  557. # nojournal = true
  558. ~~~
  559. Il faut également mettre-à-jour ses indexes ! On le fera via le mongo shell :
  560. ~~~
  561. > use foo
  562. > db.bar.getIndexes()
  563. [
  564. {
  565. "key" : {
  566. "_id" : 1
  567. },
  568. "ns" : "foo.bar",
  569. "name" : "_id_",
  570. "v" : 0
  571. }
  572. ]
  573. ~~~
  574. Le * "v" : 0 * signifie que l'index n'est pas à jour.
  575. ~~~
  576. > db.runCommand({compact : 'bar'})
  577. { "ok" : 1 }
  578. > db.bar.getIndexes()
  579. [
  580. {
  581. "v" : 1,
  582. "key" : {
  583. "_id" : 1
  584. },
  585. "ns" : "foo.bar",
  586. "name" : "_id_"
  587. }
  588. ]
  589. ~~~
  590. Répéter l'opération pour toutes les collections ayant des indexes !
  591. ## CAPPED
  592. <http://www.mongodb.org/display/DOCS/Capped+Collections>
  593. ## Monitoring avec MMS
  594. MMS (MongoDB Monitoring Service) est une service fourni gratuitement par 10gen.
  595. *Déprécié, maintenant c'est payant et ça s'apelle MongoDB Cloud Manager*
  596. ### Installation
  597. Créer un compte sur mms.10gen.com, créer un groupe et télécharger l'archive (qui contient déjà la clé API du groupe).
  598. La décompresser dans un dossier (et donner les droits mongodb).
  599. ~~~
  600. cd /opt
  601. tar zxvf 10gen*.tar.gz
  602. chown -R mongodb:mongodb mms-agent
  603. ~~~
  604. Installer python-bson et python-pymongo (via backports).
  605. /etc/apt/preferences:
  606. ~~~
  607. Package: python-pymongo
  608. Pin: release a=squeeze-backports
  609. Pin-Priority: 999
  610. ~~~
  611. Le lancer via le compte mongodb:
  612. sudo -u mongodb nohup python /opt/mms-agent/agent.py > /var/log/mongodb/agent.log 2>&1 &
  613. ## Monitoring avec Munin
  614. ### Créer un accès
  615. ~~~
  616. use admin
  617. db.createUser(
  618. {
  619. user: "monitoring",
  620. pwd: "XXX",
  621. roles: [ "clusterMonitor" ]
  622. }
  623. )
  624. ~~~
  625. ### Plugin mongo-munin
  626. <https://github.com/comerford/mongo-munin>
  627. ~~~
  628. # git clone <https://github.com/comerford/mongo-munin.git> /tmp/mongo-munin
  629. # mkdir -p /usr/local/share/munin/plugins
  630. # cp /tmp/mongo-munin/mongo_* /usr/local/share/munin/plugins
  631. # cd /etc/munin/plugins/
  632. # ln -s /usr/local/share/munin/plugins/mongo_*
  633. # chmod -R u=rwX,g=rwX,o=rX /usr/local/share/munin/
  634. ~~~
  635. /etc/munin/plugin-conf.d/mongo
  636. ~~~
  637. [mongo_*]
  638. env.MONGO_DB_URI mongodb://monitoring:XXX@localhost:27017/admin
  639. ~~~