MongoDB – Configurer un environnement Config Servers + ReplicaSets + Sharded Cluster


!!! 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.