Stellen Sie sicher, dass der Mongos-Server mit den Konfigurationsservern verbunden ist

7

Ich habe ein Backup-Skript für Sharded-Replikatsätze geschrieben und es ist fast fertig, außer dass ich es scheinbar nicht dazu bringen kann, den Balancer erfolgreich wieder zu starten, nachdem alles gesagt und getan ist.

Hier ist der Befehl, mit dem ich versuche, den Balancer wieder zu starten. Beachten Sie, dass dies auf dem eigentlichen Mongos-Server über SSH ausgeführt wird.

sudo -s
mongo -u username -p password --authenticationDatabase db
use config
sh.setBalancerState(true)
exit
exit
exit

Ich erhalte immer dann den folgenden Fehler, wenn das Skript die startBalancerFunktion trifft , die den obigen Code ausführt.

SyncClusterConnection::udpate prepare failed:  mongo-conf-0.foo.bar.com:27019:10276 
DBClientBase::findN: transport error: mongo-conf-0.foo.bar.com:27019 
ns: admin.$cmd query: { resetError: 1 }

Ich habe versucht, den Exit-Status des mongoShell-Prozesses mit etwas wie zu überprüfen

if (code != 0) {
  return next('repeat');
} else {
  return next();
}

Unabhängig davon, was tatsächlich in der Mongo-Shell vorkommt, scheint der Exit-Code immer 0 zu sein.

Ideen, wie ich überprüfen kann, ob der Mongos-Prozess tatsächlich mit allen drei Konfigurationen verbunden ist, bevor ich versuche, den Balancer wieder zu aktivieren - ich gehe davon aus, dass dies das Problem ist, dass der Mongos-Server vor dem versucht, eine Verbindung zum Konfigurationsserver herzustellen Der Mongod-Prozess hatte die Möglichkeit, den Startvorgang abzuschließen (ein Teil des Sicherungsprozesses für Sharded-Replikatsätze besteht darin , einen der Konfigurationsserver herunterzufahren ).

Alexej Magura
quelle
HINWEIS : Während ich (als letztes Mittel) die Ausgabe überprüfen kann, die der Befehl erzeugt, möchte ich lieber nicht ... obwohl ich gerade festgestellt habe, dass ich überprüfen kann, ob die Ausgabe wie erwartet ist, und dann die Funktion wiederholen kann, wenn es ist nicht.
Alexej Magura
Warum fahren Sie den Konfigurationsserver herunter? Ich denke nicht, dass dieser Schritt notwendig ist.
Antonios

Antworten:

0

Haben Sie stattdessen versucht, den sh.startBalancer()Helfer zu verwenden?

Anstelle eines direkten Updates dauert es ein Timeout-Argument, wie lange auf den Start des Ausgleichs gewartet werden muss, sowie ein Schlafintervall in Bezug auf die Schlafdauer zwischen dem Warten. Hier ist der Code aus der Shell zur Erklärung:

mongos> sh.startBalancer
function ( timeout, interval ) {
    sh.setBalancerState( true )
    sh.waitForBalancer( true, timeout, interval )
}

Sie können es also sogar auflösen und den waitForBalancerHelfer verwenden, wenn Sie möchten. Als Referenz ist hier der entsprechende stopBalancerBefehl, der beim Versuch, ihn mit einem heruntergefahrenen Konfigurationsserver zu stoppen, fehlerhaft ausgeführt wurde:

mongos> sh.stopBalancer(2000, 100)
Waiting for active hosts...
Waiting for active host adamc-mbp.local:30999 to recognize new settings... (ping : Tue Dec 31 2013 19:51:32 GMT+0000 (GMT))
Waiting for the balancer lock...
Waiting again for active hosts after balancer is off...
Tue Dec 31 19:51:39.243 error: {
    "$err" : "error creating initial database config information :: caused by :: SyncClusterConnection::udpate prepare failed:  localhost:29000:9001 socket exception [FAILED_STATE] server [localhost:29000] ",
    "code" : 8005
} at src/mongo/shell/query.js:128
Adam C.
quelle
0

Es ist einfacher, Ihren Mongo zu "befehlen" als das, was Sie tun.

mongo -u username -p password --authenticationDatabase db --eval="sh.stopBalancer()"

mongo -u username -p password --authenticationDatabase db --eval="sh.startBalancer()"

Keine Notwendigkeit für Sudo-Befehle oder mehrere Exits. Der Befehl wird zurückgegeben, wenn er fertig ist.

Sie können den Status des Balancers mit überprüfen

mongo -u username -p password --authenticationDatabase db --eval="sh.isBalancerRunning()"
JJussi
quelle