6 Stimmen

Unzugänglichen Mongo-Shard entfernen

Ich habe eine MongoDB-Sharded-Konfiguration mit 3 Shards: Shard0000, Shard0001 und Shard0002. Der Rechner, auf dem Shard0002 läuft, ist jetzt ausgefallen, was dazu führt, dass alle meine Abfragen fehlschlagen. Ich möchte Shard0002 vorübergehend aus meinem Setup entfernen und mit den ersten beiden Shards weiterarbeiten. Das sollte doch machbar sein, vorausgesetzt, ich verwende nur nicht gesharte Sammlungen, die sich in den ersten beiden Shards befinden, oder?

Das habe ich zuerst versucht: db.runCommand({removeshard: 'IP:PORT'}) was natürlich nicht hilft, weil es den Splitter nur in den Entleerungsmodus versetzt, der nie endet (da er am Boden liegt). Dann habe ich versucht, mich mit meinem Config-Server zu verbinden und habe db.shards.remove({_id: 'shard0002'}) auf der Config-DB und starten Sie mongos neu, damit die Config neu geladen wird. Wenn ich jetzt versuche, etwas zu tun, erhalte ich die Meldung "can't find shard for: shard0002".

Gibt es eine Möglichkeit, Mongo mitzuteilen, dass ich mich für diesen Splitter im Moment nicht interessiere, und ihn dann später wieder zu aktivieren, wenn er verfügbar wird?

12voto

mcr Punkte 4503

Ich hatte ein anderes Problem und habe den Splitter manuell mit entfernt:

use config
db.shards.remove({"_id":"shard0002"});

2voto

sdot257 Punkte 9520

Ändern Sie den Shard-Eintrag in der Konfigurationsdatenbank manuell, dann removeshard

1voto

Wernfried Domscheit Punkte 45772

Ich habe in Version 4.2 verschiedene Möglichkeiten ausprobiert.

Am Ende habe ich diese Befehle zur Ausführung auf dem Config Server beendet:

use config

db.databases.updateMany( {primary: "shard0002"}, {$set: {primary: "shard0000"} })
db.shards.deleteOne({_id : "shard0002" })
db.chunks.updateMany( {shard : "shard0002"}, {$set: {shard: "shard0000"} })

while ( db.chunks.updateMany( {"history.shard" : "shard0002"}, 
      {$set: {"history.$.shard": "shard0000"} }).modifiedCount > 0 ) { print("Updated") }

Es funktioniert bis zu einem gewissen Grad, d.h. die CRUD-Vorgänge funktionieren. Wenn Sie jedoch getShardDistribution() dann erhalten Sie eine Fehlermeldung Die Sammlung 'db.collection' ist nicht geshared.

Schließlich sehe ich nur einen zuverlässig und sicher Lösung:

  • Schalten Sie alle Mongoden und Mongos in Ihrem Sharded-Cluster ab.
  • Starten Sie verfügbare Shards als eigenständigen Dienst (siehe Wartung von Replikatsatzmitgliedern durchführen )
  • Erstellen Sie ein Backup von verfügbaren Shards mit mongodump .
  • Datenordner von allen Hosts löschen.
  • Bauen Sie Ihre Anwendung von Grund auf neu auf. Starten Sie alle Mongoden und Mongos
  • Laden der Daten in den neuen Cluster mit mongorestore

Bei großen Clustern muss man vielleicht ein bisschen herumprobieren, wie hier:

  • Bereitstellen von Config-Servern und Mongos-Server mit einem leeren Shard
    1. Einen alten Scherben als eigenständigen Scherben starten
    2. Nehmen Sie diese alte Scherbe als Backup
    3. Reißt diesen alten Scherben ein
    4. einen neuen leeren Scherben aufbauen
    5. einen neuen Shard zu Ihrem neuen Cluster hinzufügen
    6. Wiederherstellung der Daten im neuen Cluster
    7. die Sicherung kann gelöscht und der Splitter in einem neuen Cluster wiederverwendet werden
  • Wiederholen Sie die obigen Schritte für jeden Shard, den Sie in Ihrem Cluster haben (der kaputte Shard wird höchstwahrscheinlich übersprungen)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X