Compte tenu de l'architecture mise en place et du nombre plus élevé de démons qui entrent en compte dans le fonctionnement d'un cluster Mongodb que dans une installation classique, la maintenance et la résolution des problèmes peut être plus complexes.
Cette page recense et détaille les opérations de maintenance et des recherches/résolutions de problèmes courants
La vérification de l'état d'un cluster Mongo peut se faire de plusieurs manières:
Avant de vérifier l'état détaillé du cluster Mongodb avec la console Mongodb ou les checks Shinken, on peut d'abord commencer par vérifier sur chaque nœud, l'état des services Linux associés aux différents démons Mongo.
La syntaxe à utiliser pour la vérification de ces services dépend de la version de CentOS utilisée:
$ systemctl status mongod
? mongod.service - SYSV: Mongo is a scalable, document-oriented database.
Loaded: loaded (/etc/rc.d/init.d/mongod; bad; vendor preset: disabled)
Active: active (running) since Tue 2019-10-22 16:39:52 CEST; 6min ago
Docs: man:systemd-sysv-generator(8)
Process: 908 ExecStart=/etc/rc.d/init.d/mongod start (code=exited, status=0/SUCCESS)
Main PID: 1037 (mongod)
CGroup: /system.slice/mongod.service
??1037 /usr/bin/mongod -f /etc/mongod.conf --smallfiles
Oct 22 16:39:48 lab-mongo1 systemd[1]: Starting SYSV: Mongo is a scalable, document-oriented database....
Oct 22 16:39:48 lab-mongo1 runuser[979]: pam_unix(runuser:session): session opened for user mongod by (uid=0)
Oct 22 16:39:52 lab-mongo1 runuser[979]: pam_unix(runuser:session): session closed for user mongod
Oct 22 16:39:52 lab-mongo1 mongod[908]: Starting mongod: [ OK ]
Oct 22 16:39:52 lab-mongo1 systemd[1]: Started SYSV: Mongo is a scalable, document-oriented database..
$ systemctl status mongo-configsrv
? mongo-configsrv.service - SYSV: Mongo is a scalable, document-oriented database.
Loaded: loaded (/etc/rc.d/init.d/mongo-configsrv; bad; vendor preset: disabled)
Active: active (running) since Tue 2019-10-22 16:39:51 CEST; 6min ago
Docs: man:systemd-sysv-generator(8)
Process: 906 ExecStart=/etc/rc.d/init.d/mongo-configsrv start (code=exited, status=0/SUCCESS)
Main PID: 1034 (mongod)
CGroup: /system.slice/mongo-configsrv.service
??1034 /usr/bin/mongod -f /etc/mongo-configsrv.conf --smallfiles
Oct 22 16:39:48 lab-mongo1 systemd[1]: Starting SYSV: Mongo is a scalable, document-oriented database....
Oct 22 16:39:48 lab-mongo1 runuser[975]: pam_unix(runuser:session): session opened for user mongod by (uid=0)
Oct 22 16:39:51 lab-mongo1 runuser[975]: pam_unix(runuser:session): session closed for user mongod
Oct 22 16:39:51 lab-mongo1 mongo-configsrv[906]: Starting mongod: [ OK ]
Oct 22 16:39:51 lab-mongo1 systemd[1]: Started SYSV: Mongo is a scalable, document-oriented database..
$ systemctl status mongos
? mongos.service - SYSV: Mongo is a scalable, document-oriented database.
Loaded: loaded (/etc/rc.d/init.d/mongos; bad; vendor preset: disabled)
Active: active (running) since Tue 2019-10-22 16:47:29 CEST; 28s ago
Docs: man:systemd-sysv-generator(8)
Process: 2110 ExecStart=/etc/rc.d/init.d/mongos start (code=exited, status=0/SUCCESS)
Main PID: 2127 (mongos)
CGroup: /system.slice/mongos.service
??2127 /usr/bin/mongos -f /etc/mongos.conf
Oct 22 16:46:47 lab-mongo1 systemd[1]: Starting SYSV: Mongo is a scalable, document-oriented database....
Oct 22 16:46:47 lab-mongo1 runuser[2123]: pam_unix(runuser:session): session opened for user mongod by (uid=0)
Oct 22 16:47:29 lab-mongo1 mongos[2110]: Starting mongos: [ OK ]
Oct 22 16:47:29 lab-mongo1 systemd[1]: Started SYSV: Mongo is a scalable, document-oriented database.. |
$ service mongod status mongod (pid 2498) is running... $ service mongo-configsrv status mongod (pid 2593 2498) is running... $ service mongos status mongos (pid 2690) is running... |
Lorsqu'un démon du cluster n'est pas correctement démarré, on peut commencer les recherches en analysant les logs de chaque démon du cluster Mongodb.
Sur chaque noeud du cluster, on trouve les logs suivants:
La console Mongodb permet de récupérer des informations détaillées sur l'état de chaque démon ainsi que leur statut au sein du cluster (primaire, secondaire, en récupération, injoignable etc...).
Pour accéder à la console Mongodb, il se connecter depuis n'importe quel noeud du cluster sur le démon "mongod" avec la commande suivante:
mongo --port 27018 |
Une fois la console Mongo lancée, on se retrouve avec un invite de commande différent, qui nous permet de vérifier directement l'état du cluster:
rs.status() |
On obtient le résultat suivant:
rs-shinken:SECONDARY> rs.status();
{
"set" : "rs-shinken",
"date" : ISODate("2018-05-04T07:29:15Z"),
"myState" : 2,
"syncingTo" : "node2:27018",
"members" : [
{
"_id" : 0,
"name" : "node1:27018",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2018-05-04T07:29:13Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : 0
},
{
"_id" : 1,
"name" : "node2:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 81988,
"optime" : Timestamp(1525250222, 106),
"optimeDate" : ISODate("2018-05-02T08:37:02Z"),
"lastHeartbeat" : ISODate("2018-05-04T07:29:14Z"),
"lastHeartbeatRecv" : ISODate("2018-05-04T07:29:14Z"),
"pingMs" : 1,
"electionTime" : Timestamp(1525336975, 1),
"electionDate" : ISODate("2018-05-03T08:42:55Z")
},
{
"_id" : 2,
"name" : "node3:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 81988,
"optime" : Timestamp(1525250222, 106),
"optimeDate" : ISODate("2018-05-02T08:37:02Z"),
"self" : true
}
],
"ok" : 1
} |
Avec l'affichage ci-dessus, on tire par exemple les informations suivantes sur notre cluster:
Un cluster Mongo peut être supervisé avec Shinken. Shinken Entreprise met à votre disposition un Pack MongoDB
Le modèle d'hôte "mongodb" prend également en compte les aspects de réplication de la base avec les checks "Mongodb-replicaset" et "Mongodb-replication-lag".
En pratique, pour superviser un cluster Mongo avec Shinken Entreprise, on associe un hôte Shinken à un nœud du cluster. Chaque hôte aura le modèle "mongodb" accroché, ce qui permet de superviser ces 3 nœuds de manière indépendante. On effectue également la supervision sur le port 27018 au lieu du port 27017 utilisé par défaut.
Voici un aperçu du résultat des checks concernant la réplication de Mongo, pour un nœud primaire et pour un nœud secondaire:
|
|
Le modèle mongodb permet d'utiliser un tunnel SSH pour la connexion aux serveurs et l'exécution des checks. L'utilisation du tunnel SSH se fait en modifiant la donnée MONGO_CONNECTION_METHOD. Précisez la valeur "ssh" au lieu de "direct".
L'utilisateur et la clé SSH utilisés pour créer ce tunnel peuvent se configurer en modifiant les données MONGO_SSH_USER et MONGO_SSH_KEY sur l'hôte.
Le modèle mongodb se connecte aux démons mongod pour effectuer les vérifications sur le cluster Mongo. Dans une installation classique, ce démon utilise le port 27017.
Dans le cas du cluster, on a modifié le port que ce démon utilise pour utiliser le port 27018. Il faut donc également modifier le port utilisé dans Shinken en modifiant la donnée MONGO_PORT en 27018 sur l'hôte.
La configuration et le fonctionnement du pack MongoDB sont décrits en détail sur la page de documentation du pack Mongodb: Pack Mongodb.
Les démons du cluster Mongo sont dépendants les uns des autres et doivent être démarrés dans un ordre particulier pour pouvoir fonctionner.
Pour rappel, chaque noeud du cluster contient les démons Mongo suivants:
L'ordre de démarrage des démons est donc le suivant: mongod → mongo-configsrv → mongos
La séquence de démarrage est donc la suivante:
Sur tous les noeuds du cluster, on démarre mongod:
# CentOS 6 service mongod start # CentOS 7 systemctl start mongod |
PID chibrés si le démon crash, il faut les virer à la main avant de redémarrer sinon le script d'init est pas d'accord