Nous avons créé un jeu de réplicas et maintenant le problème est que 2 membres du jeu de réplicas [jeu de 3 membres] sont en mode de récupération à partir de 48 heures. Initialement, la taille des nœuds de récupération augmentait et maintenant même cela s'est arrêté. Ainsi, lors de la récupération des nœuds, ils sont bloqués après 90 Go de données avec plus de 60 Go de données locales.
Comment sortir de ce mode?
dbpath
C'est un peu incertain car on ne sait pas pourquoi les secondaires sont entrés dans l'état de récupération.
Comme ci-dessus, mais arrêtez votre application pendant le processus. Cela évite la possibilité que votre application insère plus de données que les secondaires ne peuvent répliquer. Cependant, le problème peut se produire pendant la production.
dbpath
sur les deux secondairesdbpath
dans les dbpath
des deux secondairesQuelques notes:
Utilisez MMS . C'est gratuit, il est facile à configurer et il vous donne de bonnes informations sur votre jeu de répliques. Essayez de garder la valeur de "retard de réplication" autour de 0 et prenez tous les moyens nécessaires pour que votre retard de réplication ne soit jamais supérieur à la "fenêtre de journal de réplication".
Assurez-vous toujours que vous avez un réseau de 1 Go et une (merde) merde de RAM. Plus c'est mieux. Règle de base supplémentaire: plutôt la moitié des RAM et SSD que de doubler les RAM et aucun SSD (avec RAM restant dans limites raisonnables).
Avis de non-responsabilité: Toujours faites une sauvegarde des données de production avant de les manipuler.
Le processus de réplication échoue même si vous démarrez scratch à partir d'un nouveau dbpath sur le secondaire, donc il faut faire quelques changements dans l'oplog. La taille de l'oplog doit être définie sur une valeur optimale afin qu'il puisse gérer toutes les écritures d'application dans celui-ci.
Augmentation de la taille de l'oplog:
Arrêtez le serveur principal
use admin
db.shutdownServer()
Démarrez le primaire en mode autonome et exécutez sur un port différent, par exemple 37017
Connectez-vous à Mongo dans le port 37017
mongo --port 37017
Supprimer l'ancien contenu de la base de données locale
Pour des raisons de sécurité, recopiez l'ancien oplog avant de le supprimer
mongodump --db local --collection 'oplog.rs' --port 37017
Déposez l'ancien contenu dans la base de données locale
use local
db.oplog.rs.drop()
db.me.drop()
db.replset.election.drop()
db.replset.minvalid.drop()
db.startup_log.drop()
La collection de replset ne peut pas être supprimée, supprimez-la avec l'ID requis:
db.system.replset.remove({ "_id" : "your_replsetname"})
Créez un nouvel oplog de la taille requise, par exemple 50 Go
db.runCommand( { create: "oplog.rs", capped: true, size: (50 * 1024 * 1024 * 1024) } )
Vous pouvez également spécifier la taille de l'oplog en Mo dans le fichier mongod.conf, disons pour 50 Go ses 429496 Mo
replication:
oplogSizeMB: 429496
J'espère que cela t'aides !!!
Modifier:
Comme mentionné par Nicholas Tolley Cottrell dans les commentaires. Dans le MongoDB version 3.6 nous pouvons changer la taille d'oplog en runtime sans redémarrer.
Vérifier la taille actuelle de l'oplog
use local
db.oplog.rs.stats().maxSize
Pour changer la taille de l'oplog en 10 Go
db.adminCommand({replSetResizeOplog: 1, size: 10000})