MongoDB

De DokuWikiExperience.

Replica Set

Pour que le replica set fonctionne il faut au moins trois machines. Des données peuvent être conservé uniquement sur la machine que nous allons configurer les autres il faut que cela sois vierge.

Dans le fichier de config des TROIS il faut ajouter :

replSet = yann

puis restart mongodb. Dans les logs il y a un peu de :

[startReplSets] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG)

Oui pas de config pour le moment. Donc allons-y !

Indiquons le _id (celui défini dans le fichier de config) Puis ensuite pour chaque leurs nom ainsi que le port. Ceci n'est à lancer que sur une seul machine, l'élection sera automatique (ici le destin est forçé via arbiterOnly à true. sur machine1:

cfg = { _id: "yann", members: [{_id: 0, host: "machine1.verry.org:27018"},{_id: 1, host: "machine2.verry.org:27018"},{_id: 2, host: "machine3.verry.org:27018", arbiterOnly: true }]} 

et c'est parti :

rs.initiate(cfg)

Si on regarde les logs de machine1 :

[conn2] replSet replSetInitiate all members seem up
[conn2] replSet info saving a newer config version to local.system.replset
[conn2] replSet replSetInitiate config now saved locally.  Should come online in about a minute.
[conn2] query admin.$cmd ntoreturn:1 command: { replSetInitiate: { _id: "yann", members: [ { _id:0.0, host: "machine1.verry.org:27018" }, { _id: 1.0, host: "machine2.verry.org:27018" },
{ _id: 2.0, host: machine3.verry.org:27018", arbiterOnly: true } ] } } reslen:128 249ms
[startReplSets] replSet STARTUP2
[rs Manager] replSet can't see a majority, will not try to elect self
[ReplSetHealthPollTask] replSet info machine3.verry.org:27018 is now down (or slow to respond)
[ReplSetHealthPollTask] replSet info machine2.verry.org:27018 is now down (or slow to respond)
[initandlisten] connection accepted from ************:54991 #4
[initandlisten] connection accepted from ************:59132 #5
[snapshotthread] cpu: elapsed:4000  writelock: 0%
[ReplSetHealthPollTask] replSet info machine3.verry.org:27018 is now up
[ReplSetHealthPollTask] replSet machine3.verry.org:27018 STARTUP2
[rs Manager] replSet info electSelf 0
[rs Manager] replSet PRIMARY
[ReplSetHealthPollTask] replSet info machine2.verry.org:27018 is now up
[ReplSetHealthPollTask] replSet machine2.verry.org:27018 STARTUP2
[initandlisten] connection accepted from ************:54993 #6
[ReplSetHealthPollTask] replSet machine3.verry.org:27018 ARBITER
[ReplSetHealthPollTask] replSet machine2.verry.org:27018 RECOVERING
[snapshotthread] cpu: elapsed:4000  writelock: 0%
[initandlisten] connection accepted from ************:54994 #7
[conn7] end connection 10.8.42.18:54994
[initandlisten] connection accepted from ************:54995 #8
[conn8] end connection 10.8.42.18:54995
[conn6] end connection 10.8.42.18:54993
[snapshotthread] cpu: elapsed:4000  writelock: 0%
[initandlisten] connection accepted from ************:54996 #9
[slaveTracking] building new index on { _id: 1 } for local.slaves
[slaveTracking] done for 0 records 0.001secs
[ReplSetHealthPollTask] replSet machine2.verry.org:27018 SECONDARY

Comme prévu machine3 est défini comme ARBITER et machine2 comme SECONDARY et machine1 PRIMARY. Que se passe-t-il si je coupe machine1 ? Je regarde les logs de machine2:

[ReplSetHealthPollTask] replSet info machine1:27018 is now down (or slow to respond)
[rs Manager] replSet info electSelf 1
[rs Manager] replSet PRIMARY

machine2 était défini comme SECONDARY il est passé tout de suite PRIMARY. Je fais revenir machine1 qui redeviens PRIMARY:

[conn3] replSet info voting yea for 0
[ReplSetHealthPollTask] replSet machine2:27018 RECOVERING
[ReplSetHealthPollTask] replSet machine1:27018 SECONDARY
[conn3] replSet info voting yea for 0
[ReplSetHealthPollTask] replSet machine1:27018 PRIMARY
[ReplSetHealthPollTask] replSet machine2:27018 SECONDARY

Tout est redevenu dans l'ordre, nous avons 3 machines en master/slave avec éléction automatique en cas de défaillance. Il n'y a pas de configuration supplémentaire, de VIP à basculé etc ... J'y reviendrais à la config cliente.

Sharding

Ah la scalabilité horizontal nous voila !

Outils personnels