!!! ATTENTION !!! Article obsolète pour les versions supérieures à la 2.6. Un nouvel article est en préparation en version 4.
Ce petit tutoriel a pour vocation de créer rapidement et simplement un environnement simili-production MongoDB contenant un cluster de Config Servers, un cluster de ReplicaSet, et un Sharded Cluster s’appuyant sur le ReplicaSet.
La configuration en question a pour but d’éviter les SPOF (Single Point Of Failure) et donc de permettre la haute-disponibilité.
La configuration a été faite sur le noyau MongoDB 2.6 64 bits.
Configuration minimale nécessaire pour cet environnement
La configuration qui suit, tourne sur un portable Toshiba Satellite L70-B-135 équipé d’un processeur Core i7 4710HQ 8 cores en hyper-threading cadencé entre 2,6 et 3,6 GHz, reconfiguré avec 16 Go de RAM SODIMM 1600 MHz DDR3 PC3-12800 et un SSD Samsung 850 EVO Series 1 To assurant quant à lui un débit maintenu d’environ 500 Mo/s en lecture/écriture.
Le système d’exploitation de la machine physique est une distribution Linux Fedora 21.
Les machines virtuelles tournent toute sur la même distribution Linux Fedora 21 et sont posées sur Oracle Virtual Box et disposent chacune d’un processeur virtuel et de 1,5 Go de RAM.
Le réseau global à l’ensemble de ces machines est un réseau privé virtuel avec un petit serveur DNS « named » configuré sur la machine physique pour faciliter la gestion de l’ensemble des IP de toute l’architecture.
Les noms des serveurs tels qu’indiqués dans ce tableau, seront ceux utilisés tout au long du document. Se reporter à ce tableau pour connaître leur fonction au moment des différentes phases de configuration.
Fonction | Nom | Description |
Routeur | mongodb11 | Serveur routeur de requêtes |
Poste client | mongodb12 | Poste client pour accéder à l’ensemble des serveurs de l’architecture |
ReplicaSet 1 | mongodb01 | Conteneur de base de données cluster et aussi de shard |
ReplicaSet 2 | mongodb02 | Conteneur de base de données cluster et aussi de shard |
ReplicaSet 3 | mongodb03 | Conteneur de base de données cluster et aussi de shard |
Config Server 1 | mongodb04 | Serveur de configuration. Contient les métadonnées d’accès aux Replicaset |
Config Server 2 | mongodb05 | Serveur de configuration. Contient les métadonnées d’accès aux Replicaset |
Config Server 3 | mongodb06 | Serveur de configuration. Contient les métadonnées d’accès aux Replicaset |
Environnement Linux
Un utilisateur « mongodb » doit être créé et fait partie du groupe « mongodb » pour chacun des 7 serveurs de la configuration.
Création du cluster de Config Servers
Création des Configs Servers
La création d’un cluster de Config Servers s’avère une opération très aisée.
Créer un répertoire /data/configdb appartenant à « mongodb:mongodb ».
Opérations à réaliser sur chacun des serveurs, mongodb04, mongodb05 et mongodb06
mongod --configsvr --dbpath /data/configdb --port 27019 &
Mise en cluster
Le routeur pourvoit à la mise en cluster des Configs Servers.
La création du routeur se fait de la manière suivante sur le serveur mongodb11 :
mongos --configdb mongodb04:27019,mongodb05:27019,mongodb06:27019 &
A partir de ce moment, le cluster de Config Servers est actif.
Création du cluster de ReplicaSet
Initialisation des ReplicaSet
Les serveurs mongodb01, mongod02 et mongodb03 vont supporter le cluster de ReplicaSet.
Créer un répertoire /data/datadb appartenant à « mongodb:mongodb ».
Sur chaque serveur, exécuter la commande suivante :
mongod --replSet "rs0" --dbpath /data/datadb/ --port 27017 &
Création du ReplicaSet cluster
Sur le serveur primaire, le mongodb01, passer les instructions suivantes :
rs.initiate() rs.conf() rs.add("mongodb02:27017") rs.add("mongodb03:27017") rs.conf() rs.status()
La dernière instruction doit retourner un état comme celui-ci :
rs0:PRIMARY> rs.status() { "set" : "rs0", "date" : ISODate("2015-07-30T08:27:12Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "mongodb01:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 96, "optime" : Timestamp(1438244777, 1), "optimeDate" : ISODate("2015-07-30T08:26:17Z"), "electionTime" : Timestamp(1438244736, 11), "electionDate" : ISODate("2015-07-30T08:25:36Z"), "self" : true }, { "_id" : 1, "name" : "mongodb02:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 60, "optime" : Timestamp(1438244531, 1), "optimeDate" : ISODate("2015-07-30T08:22:11Z"), "lastHeartbeat" : ISODate("2015-07-30T08:27:10Z"), "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"), "pingMs" : 0, "electionTime" : Timestamp(1438244532, 1), "electionDate" : ISODate("2015-07-30T08:22:12Z") }, { "_id" : 2, "name" : "mongodb03:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 55, "optime" : Timestamp(1438244631, 1), "optimeDate" : ISODate("2015-07-30T08:23:51Z"), "lastHeartbeat" : ISODate("2015-07-30T08:27:11Z"), "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"), "pingMs" : 0, "electionTime" : Timestamp(1438244632, 1), "electionDate" : ISODate("2015-07-30T08:23:52Z") } ], "ok" : 1 }
Le cluster de ReplicaSet est créé.
Création du Sharded cluster
A partir de ce point, il n’est plus nécessaire de travailler sur les serveurs.
Le travail sera fait à partir de la machine cliente mongodb12.
Se connecter au routeur :
mongo --host mongodb11 --port 27017
Créer le Sharded cluster sur le ReplicaSet cluster :
mongos> sh.addShard("rs0/mongodb01:27017") { "shardAdded" : "rs0", "ok" : 1 }
Vérifier l’état du Shard :
mongos> db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 4, "minCompatibleVersion" : 4, "currentVersion" : 5, "clusterId" : ObjectId("55b9d8baafcefcc18f8afae3") } shards: { "_id" : "rs0", "host" : "rs0/mongodb01:27017,mongodb02:27017,mongodb03:27017" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" }
Ajouter la base de données achdb au Shard :
mongos> sh.enableSharding("achdb") { "ok" : 1 } mongos> db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 4, "minCompatibleVersion" : 4, "currentVersion" : 5, "clusterId" : ObjectId("55b9d8baafcefcc18f8afae3") } shards: { "_id" : "rs0", "host" : "rs0/mongodb01:27017,mongodb02:27017,mongodb03:27017" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : false, "primary" : "rs0" } { "_id" : "achdb", "partitioned" : true, "primary" : "rs0" }
L’instruction db.printShardingStatus nous permet de voir que la base de données achdb est intégrée au Shard et est partitionnée.