Mongodb v4.0-Transaktion, MongoError: Transaktionsnummern sind nur auf einem Replikatsatzmitglied oder Mongos zulässig
Lesezeit: 7 Minuten
Jafar Shemshadi
Ich habe installiert MongoDB v4.0 für das Erstaunlichste daran Transaktion in Nodejs mit mongodb 3.1 als Fahrer.
Wenn ich versuche, eine Transaktionssitzung zu verwenden, ist dieser Fehler aufgetreten:
MongoError: Transaction numbers are only allowed on a replica set member or mongos.
Was ist das und wie kann ich es loswerden?
Majid Parvin
Transactions sind zweifellos die aufregendste neue Funktion in MongoDB 4.0. Leider starten die meisten Tools zum Installieren und Ausführen von MongoDB einen eigenständigen Server und nicht einen Replikatsatz. Wenn Sie versuchen, eine Sitzung auf einem eigenständigen Server zu starten, wird dieser Fehler angezeigt.
Um Transaktionen nutzen zu können, benötigen Sie eine MongoDB Das Erstellen eines Replikatsatzes und das lokale Starten eines Replikatsatzes für die Entwicklung ist ein aufwändiger Prozess. Das neue run-rs npm module erleichtert das Starten von Replika-Sets. Das Ausführen von run-rs ist alles, was Sie zum Starten eines Replikatsatzes benötigen. run-rs installiert sogar die richtige Version von MongoDB für dich.
Run-rs hat keine externen Abhängigkeiten außer Node.js Und npm. Das müssen Sie nicht haben Docker, homebrew, APT, Pythonoder auch MongoDB Eingerichtet.
Installieren Sie run-rs global mit npm's -g Flagge. Sie können auch run-rs in Ihrem auflisten package.json devDependencies der Datei.
npm install run-rs -g
Führen Sie als Nächstes run-rs mit dem Flag –version aus. Run-rs lädt MongoDB v4.0.0 für Sie herunter. Machen Sie sich keine Sorgen, Ihre bestehende MongoDB-Installation wird dadurch nicht überschrieben.
run-rs -v 4.0.0 --shell
Dann benutze replicaSet=rs in Ihrer Verbindungszeichenfolge.
Nützlich ist auch das Bitnami/Mongodb-Docker-Image, mit dem Sie ein ReplicaSet mit Docker-Compose einrichten können: github.com/bitnami/…
– mltsy
4. Februar 2019 um 18:35 Uhr
Aus dem Dokument geht hervor, dass ein vorhandener (oder ein neuer) ausgeführt wird. mongod Instanz mit Replika-Set ist eher trivial: docs.mongodb.com/manual/tutorial/…
– Marcel Falliere
18. Februar 2019 um 12:53 Uhr
Irgendeine Idee, warum die Fähigkeit, Transaktionen zu verwenden, einen MongoDB-Replikatsatz erfordert? (In meinem Fall habe ich eine MongoDb-Instanz, die zu Testzwecken auf Docker ausgeführt wird und aufgrund dieser Einschränkung keine Transaktionen ausführen kann.)
– Yohan
26. März 2020 um 22:05 Uhr
Irgendeine Idee, warum es global installiert werden muss und nicht nur als Entwicklerabhängigkeit?
– Philosoph
29. Okt. 2020 um 18:39 Uhr
Warum ist ein Replikatsatz erforderlich? Für mich ergibt das keinen Sinn und es scheint, dass das ein Fehler des Mongodb-Teams war.
– java-addict301
1. Dezember 2021 um 18:18 Uhr
Oren Hahiashvili
Ich habe die Lösung gefunden und es handelt sich lediglich um eine dreizeilige Konfiguration in der MongoDB-Konfigurationsdatei.
Nach dem Wechsel vom MongoDB-Atlas und der Installation von MongoDB v 4.4.0 auf meinem CentOS 7 VPS mit WHM war ich ebenfalls mit diesem Problem konfrontiert.
Die run-rs Die Lösung funktioniert bei mir nicht, aber ich habe es geschafft, dieses Problem ohne ein Drittanbieter-Tool zu lösen, indem ich die folgenden Schritte befolgte:
1. Ausschalten mongod.
Am effizientesten ist es, die MongoDB-Shell mit dem Befehl aufzurufen mongo
Schauen Sie sich die Methode an
db.shutdownServer()
Sie können den MongoDB-Server nicht verwenden. Für mich hat der Shutdown-Vorgang zu lange gedauert, und dann habe ich den Vorgang mit dem Befehl abgebrochen:
systemctl stop -f mongod
wenn du das getötet hast mongod Prozess, den Sie wahrscheinlich ausführen müssen mongod --dbpath /var/db --repair
Der var/db sollte auf Ihr Datenbankverzeichnis verweisen.
2. Einstellen der ReplicaSet-Konfiguration.
Informationen zum Schritt „ReplicaSet-Einstellungen“ finden Sie unter /etc/mongod.conf Datei, suchen Sie nach replication Wertzeile, und Sie sollten die folgenden Zeilen wie folgt hinzufügen:
3. Fügen Sie die URL Ihrer Verbindungszeichenfolge hinzu.
Fügen Sie den Wert von replSetName zu Ihrer Verbindungs-URL hinzu &replicaSet=--YourReplicationSetName--
wenn Sie den Namen verwendet haben rs0 aus unserem Beispiel, dann sollten Sie Ihrer DB-Verbindung eine URL-Abfrage hinzufügen replicaSet=rs0
4. Schalten Sie Mongod erneut ein
Geben Sie den Befehl ein: systemctl start mongod
5. Greifen Sie auf Ihre ReplicaSet-Datenbank zu
Rufen Sie die MongoDB-Shell mit dem Befehl auf mongogeben Sie den Befehl ein rs.initiate()
Jetzt sollten Sie sich in Ihrer ReplicaSet-Datenbank befinden.
Meiner Meinung nach die beste Lösung für die lokale Entwicklung. Es ist wirklich einfach und funktioniert ohne Software von Drittanbietern.
– Nick
4. August 2021 um 7:43 Uhr
Welchen Wert müssen wir replSetName geben? Können Sie ein Beispiel nennen?
– Kannan T
3. Januar 2022 um 13:29
Hallo @KannanT, ich habe meine Antwort geändert und ein Beispiel angehängt.
Wenn Sie MongoDB Version 5 und höher verwenden, schließen Sie Folgendes aus enableMajorityReadConcern: true Zeile für die /etc/mongod.conf Datei. Überprüfen Sie Ihre Mongo-Installationsversion mit mongo --version
– Looi
21. Mai 2022 um 10:44
Kirill
Für diejenigen, die mit der dockerisierten MongoDB-Instanz entwickeln möchten, gibt es hier die Einzeldatei docker-compose.yaml Lösung basierend auf dem offiziellen MongoDB-Docker-Image:
Anscheinend ist das MONGODB_REPLICA_SET_KEY Umgebungsvariable ist ebenfalls erforderlich. Ohne sie weigerte sich der Mongo-Prozess, im Container zu starten, mit einem Fehler, der darauf hinwies, dass die Variable obligatorisch ist. Ich habe es einfach auf etwas eingestellt wie MONGODB_REPLICA_SET_KEY: 123456
– Boas
13. Dezember 2022 um 17:52 Uhr
@Boaz hatte noch nie ein solches Problem mit Mongo 5. Sie verwenden wahrscheinlich 6+
– Kirill
13. Dezember 2022 um 18:00 Uhr
Eigentlich verwende ich 4.2 🙂
– Boas
14. Dezember 2022 um 15:02 Uhr
Mögliche Lösung für die lokale Entwicklung mit Docker
Erstellen Sie eine Docker-Datei
FROM mongo:4.4.7
RUN echo "rs.initiate();" > /docker-entrypoint-initdb.d/replica-init.js
CMD [ "--replSet", "rs" ]
Erstellen Sie diese Docker-Datei
docker build ./ -t mongodb:4.7-replset
Führen Sie dieses erstellte Image aus
docker run --name mongodb-replset -p 27017:27017 -d mongodb:4.7-replset
Stellen Sie über diesen URI eine Verbindung zur Datenbank her
mongodb://localhost:27017/myDB
Ich stand kürzlich vor dem gleichen Problem. In meinem Fall liegt es daran, dass ich eine Verbindung zu einem Remote-Mongo-Server mit einer anderen Version als meiner lokalen Entwicklungsumgebung verbinde.
Um das Problem schnell zu lösen, habe ich den folgenden Parameter zu meiner Verbindungszeichenfolge hinzugefügt:
?retryWrites=false
Das sieht ziemlich verdächtig aus. Sind Sie sicher, dass nicht alle Fehler einfach stillgelegt werden, anstatt sie zu beheben? Warum soll es funktionieren?
– German
19. Juli 2022 um 23:14 Uhr
Wenn Sie MongoDB auf einem Linux-Computer ausführen, können Sie einfach die Replikation verwenden, indem Sie die Verbindungszeichenfolge über die Bearbeitung der Servicedatei aktualisieren
/usr/lib/mongod.service or /lib/systemd/system/mongod.service
Wo --config "/etc/mongod.conf" zeigt auf Ihre MongoDB-Konfigurationsdatei und --replSet rs0 weist es an, die Replikation mit dem Namen zu verwenden rs0
und dann neu starten
sudo systemctl daemon-reload //<--To reload service units
sudo systemctl restart mongod //<--To Restart MongoDB Server
und initiieren Sie dann die Replikation über Ihre Mongod-Instanz im Terminal
$ mongosh
$ rs.initiate()
Das sieht ziemlich verdächtig aus. Sind Sie sicher, dass nicht alle Fehler einfach stillgelegt werden, anstatt sie zu beheben? Warum soll es funktionieren?
– German
19. Juli 2022 um 23:14 Uhr
Mohammad Rajabloo
Um Transaktionen nutzen zu können, benötigen Sie einen MongoDB-Replikatsatz, und das lokale Starten eines Replikatsatzes für die Entwicklung ist ein aufwändiger Prozess.
Du kannst den … benutzen run-rs npm module. Null-Konfigurations-MongoDB-Runner. Startet einen Replikatsatz ohne Nicht-Knoten-Abhängigkeiten, nicht einmal MongoDB.
Oder Sie erstellen einfach ein Konto in MongoDB Atlas Dadurch erhalten Sie einen MongoDB-Cluster mit begrenzten Ressourcen und können Ihre Anwendung ausführen/testen.