3 votes

L'appel de rs.status immédiatement après rs.initiate provoque une erreur d'authentification.

J'ai mis toutes les étapes pour initier un replica-set dans un shell script. Fondamentalement, j'essaie de convertir une instance autonome A en un replica-set qui comprend un arbitre B et un nœud secondaire C. Ce sont les étapes suivantes dans le script :

  1. Démarrer l'instance standalone sans paramètre d'authentification.

  2. Créez un utilisateur admin pour la base de données mongodb admin avec le rôle suivant :

    Successfully added user: { "user" : "mongodb_admin", "roles" : [ { "role" : "root", "db" : "admin" } ] }

  3. Arrêtez l'instance autonome A.

  4. Démarrer les trois nœuds (A, B, C) avec une option de réplique et un contrôle d'accès aux fichiers clés.

  5. Initialiser le replicaset sur l'instance A en appelant rs.initiate.

  6. Appeler rs.status pour vérifier si la santé de tous les membres est 1 (actuellement il y a seulement A dans le replicaset)

  7. Ajoutez le nœud arbitre B et le nœud secondaire C au replicaset.

  8. Attendez que tous les nœuds soient sains.

Tout va bien jusqu'à l'étape 5. Je suis capable d'initier avec succès un replicaset. Mais à l'étape 6, l'erreur suivante se produit :

2018-08-27T11:43:47.080+0100 E QUERY [thread1] Error: auth failed : 
DB.prototype._authOrThrow@src/mongo/shell/db.js:1608:20 @(auth):6:1 
@(auth):1:2

Lorsque je mets une pause de 15 secondes entre les étapes 5 et 6, cela fonctionne parfaitement bien. Mais je veux quand même m'assurer que je fais les choses correctement. Si la mise en veille est correcte, alors comment puis-je m'assurer que 15 secondes sont suffisantes pour attendre avant de vérifier le statut à l'étape 6. Je n'arrive pas non plus à comprendre pourquoi il y a une erreur d'authentification alors que j'ai utilisé le même utilisateur et le même mot de passe pour initier le replica-set ?

Version de MongoDB : 3.6.2

2voto

IQ_HiGh Points 83

Je sais que cette question date un peu, mais essayez d'exécuter ceci après l'appel à rs.initiate à l'étape 5.

let isPrimary = false;
let count = 0;

while(isPrimary == false && count < 30) {
  const rplStatus = db.adminCommand({ replSetGetStatus : 1 });

  isPrimary = rplStatus.members[0].stateStr === "PRIMARY";
  print("is primary result: ", isPrimary);
  count = count + 1;
  sleep(1000);
}

Il filtrera l'état de l'ensemble de répliques et essaiera toutes les secondes pendant 30 secondes de vérifier que l'état du premier membre de l'ensemble de répliques est passé à "PRIMAIRE", auquel cas il libérera le thread pour la suite de l'exécution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X