La réplique Mongo DB est bloquée à l'état RECOVERING
14
Nous avons créé un jeu de réplicas et maintenant le problème est que 2 membres du jeu de répliques [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.
C'est un peu incertain car on ne sait pas pourquoi les secondaires sont entrés dans l'état de récupération.
La manière la plus sécurisée, mais aussi la plus intrusive
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.
Le moyen le plus sécurisé, mais aussi le plus intrusif
Arrêtez l'ensemble de la réplique
Supprimer le contenu de dbpathsur les deux secondaires
Copiez le contenu de dbpathsur les deux secondairesdbpath
Démarrez l'ancien primaire.
Démarrez l'un des anciens secondaires.
Attendez qu'un nouveau primaire soit élu.
Démarrez le secondaire restant.
Quelques 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 d'oplog 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é de la RAM et des SSD que le double de la RAM et aucun SSD (la RAM restant dans des limites raisonnables).
Avertissement: faites toujours une sauvegarde des données de production avant de les manipuler.
Pour l'instant, nous n'avons pas de nœud secondaire dans le jeu de réplicas. L'un est en mode PRIMAIRE et les deux autres sont en mode RÉCUPÉRATION.
Avinash Sahu
1
Secondaires logiques, alors. Le processus est le même.
Markus W Mahlberg
J'ai essayé à plusieurs reprises de démarrer l'instance Mongo et de resynchroniser, chaque fois qu'il commence à copier les données vers un autre nœud jusqu'à une taille fixe (~ 96 Go), puis se bloque. La taille de l'oplog doit-elle en faire quelque chose?
Avinash Sahu
1
Pas vraiment, sauf pour le fait que la resynchronisation peut s'arrêter lorsque vous insérez plus de données que l'oplog ne peut en contenir lors de la resynchronisation initiale. Prenez l'option 2 ou 3 dans ce cas.
Markus W Mahlberg
1
Pouvez-vous expliquer ce peu plus loin? "Plutôt la moitié de la RAM et des SSD que le double de la RAM et aucun SSD (la RAM restant dans des limites raisonnables)."
Stephen Nguyen
1
Le processus de réplication échoue même si vous démarrez scratch à partir d'un nouveau dbpath sur le secondaire, le problème est donc de 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-le 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 plus de sécurité, sauvegardez 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:
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 !!!
Éditer:
Comme mentionné par Nicholas Tolley Cottrell dans les commentaires. Dans la version 3.6 de MongoDB , nous pouvons changer la taille d'oplog en runtime sans redémarrer.
Le processus de réplication échoue même si vous démarrez scratch à partir d'un nouveau dbpath sur le secondaire, le problème est donc de 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
Démarrez le primaire en mode autonome et exécutez-le sur un port différent, par exemple 37017
Connectez-vous à Mongo dans le port 37017
Supprimer l'ancien contenu de la base de données locale
Pour plus de sécurité, sauvegardez l'ancien oplog avant de le supprimer
Déposez l'ancien contenu dans la base de données locale
La collection de replset ne peut pas être supprimée, supprimez-la avec l'ID requis:
Créez un nouvel oplog de la taille requise, par exemple 50 Go
Vous pouvez également spécifier la taille de l'oplog en Mo dans le fichier mongod.conf, disons pour 50 Go ses 429496 Mo
J'espère que cela t'aides !!!
Éditer:
Comme mentionné par Nicholas Tolley Cottrell dans les commentaires. Dans la version 3.6 de MongoDB , nous pouvons changer la taille d'oplog en runtime sans redémarrer.
Vérifier la taille actuelle de l'oplog
Pour modifier la taille de l'oplog à 10 Go
la source