Ce que vous saurez
- MongoDB accepte les connexions. Une vérification de port, envoyée depuis l’intérieur de votre réseau par l’agent, ou depuis l’extérieur si le port est ouvert sur Internet.
- Le serveur répond, et son replica set a un primaire. Un script interroge MongoDB lui-même. Sans primaire, les écritures échouent, et c’est un problème. Un membre qui n’est ni primaire ni secondaire, par exemple parce qu’il est encore en récupération, est un avertissement.
Le script utilise la commande hello de MongoDB, à laquelle tout serveur répond avant toute authentification. Il ne faut donc ni utilisateur MongoDB ni mot de passe, même avec le contrôle d’accès activé.
Ce que cette configuration ne peut pas vous dire : le retard d’un secondaire, ni la lenteur des requêtes. Il faudrait pour cela un utilisateur ayant le rôle clusterMonitor, ce qui dépasse ce que ce guide met en place. Pour les sauvegardes, voyez S’assurer que la sauvegarde de la nuit dernière a bien eu lieu. Cela fonctionne de la même façon avec mongodump.
Avant de commencer
- La machine MongoDB ajoutée comme hôte dans Gryphon, et l’agent Gryphon installé dessus.
mongosh, le shell de MongoDB, sur la même machine. Il est fourni avec les paquets de MongoDB, ou séparément sous le nommongodb-mongosh.
L’exemple suppose que MongoDB écoute sur 127.0.0.1:27017.
Étapes
1Vérifier le port
Ouvrez l’hôte, allez dans Services, choisissez Ajouter le service et sélectionnez Port TCP (agent).
- Nom
- MongoDB
- Hôte
- 127.0.0.1
- Port
- 27017
- Intervalle de vérification
- Fréquence 1 Minutes
Port TCP fait la même chose depuis l’extérieur, sans agent, mais seulement si le port 27017 est ouvert sur Internet. Il ne devrait presque jamais l’être.
2Activer les vérifications par script
L’agent n’exécute que les programmes d’un dossier que vous désignez, et ce dossier doit appartenir à root sans que personne d’autre puisse y écrire :
sudo install -d -o root -g root -m 0755 /etc/gryphon/scripts
GWC_SCRIPTS_DIR=/etc/gryphon/scripts
sudo systemctl restart gryphon-agent
3Ajouter le script
Enregistrez ceci sous /etc/gryphon/scripts/mongodb-state et rendez-le exécutable avec sudo chmod 755 /etc/gryphon/scripts/mongodb-state.
#!/bin/sh
# Whether MongoDB answers, and whether its replica set has a primary.
# Asks with "hello", which every MongoDB answers before anyone signs in.
export MONGO_URI="mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=4000"
export HOME=/tmp # mongosh keeps a log in the home directory; the agent has none
exec mongosh --nodb --quiet --norc --eval '
try {
const h = connect(process.env.MONGO_URI).hello();
if (!h.setName) {
print("OK: MongoDB answers (standalone)");
quit(0);
}
const role = h.isWritablePrimary ? "primary" : h.secondary ? "secondary" : "neither primary nor secondary";
if (!h.primary) {
print("CRITICAL: replica set " + h.setName + " has no primary; this member is " + role);
quit(2);
}
if (!h.isWritablePrimary && !h.secondary) {
print("WARNING: this member of " + h.setName + " is " + role + "; the primary is " + h.primary);
quit(1);
}
print("OK: " + h.setName + " primary is " + h.primary + "; this member is " + role);
quit(0);
} catch (e) {
print("CRITICAL: MongoDB did not answer: " + e.message);
quit(2);
}'
Le code de sortie donne l’état : 0 en bon état, 1 avertissement, 2 problème. La première ligne affichée est le message que vous verrez dans Gryphon et dans l’alerte. L’agent exécute les scripts sous son propre utilisateur, sans dossier personnel. Sans la ligne HOME, la plainte de mongosh à ce sujet deviendrait le message.
Exécutez-le comme le fait l’agent, pour le voir fonctionner :
sudo systemd-run --pipe --wait -q -p DynamicUser=yes -p PrivateTmp=yes /etc/gryphon/scripts/mongodb-state
4Ajouter la vérification par script
- Nom
- Replica set MongoDB
- Script
- mongodb-state
- Intervalle de vérification
- Fréquence 1 Minutes
Dans un replica set, installez l’agent et le script sur chaque membre, et ajoutez les deux vérifications à l’hôte de chaque membre. Chaque membre rapporte son propre point de vue : s’il répond, son propre rôle, et s’il voit un primaire.
Faire un essai
- Utilisez Vérifier maintenant sur la vérification par script. Dans un replica set, le message nomme le replica set, son primaire et le rôle de ce membre.
- Sur une machine de test, arrêtez MongoDB avec
sudo systemctl stop mongod. Les deux vérifications passent en problème en quelques minutes, et l’alerte part. Le message du script indique que MongoDB n’a pas répondu. - Redémarrez-le. Les deux vérifications se rétablissent, et le rétablissement est annoncé comme pour toute autre vérification.
Variantes
Un serveur qui exige TLS
Ajoutez les options TLS de MongoDB à l’adresse dans le script, par exemple &tls=true&tlsCAFile=/etc/gryphon/mongodb-ca.pem, avec une copie de l’autorité de certification que l’agent peut lire. La commande hello n’a toujours besoin d’aucun utilisateur.
Une autre adresse ou un autre port
Modifiez 127.0.0.1:27017 dans MONGO_URI. Gardez directConnection=true : le script ne parle ainsi qu’à ce membre, et la réponse reflète le point de vue de ce membre.
Dans Docker
Si MongoDB est un conteneur sur la machine de l’agent, ajoutez aussi une vérification Docker : conteneur. Elle repère un conteneur qui a planté ou qui redémarre sans cesse. Le script s’exécute tout de même sur la machine elle-même, pointé vers le port que le conteneur publie : mongosh doit donc y être installé.