Mongodb v4.0-Transaktion, MongoError: Transaktionsnummern sind nur auf einem Replikatsatzmitglied oder Mongos zulässig

Lesezeit: 7 Minuten

Benutzeravatar von Jafar Shemshadi
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?

Benutzeravatar von Majid Parvin
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.

Weitere Details dazu finden Sie hier Hier.

  • 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

Benutzeravatar von Oren Hahiashvili
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:

replication:
   oplogSizeMB: <int>
   replSetName: <string>
   enableMajorityReadConcern: <boolean>

Benutze die replSetName Wert auf den nächsten Schritt.

ein Beispiel für diese Einstellungen:

   oplogSizeMB: 2000
   replSetName: rs0
   enableMajorityReadConcern: false

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.

    – Oren Hahiashvili

    4. Januar 2022 um 21:00 Uhr


  • Falls Ihr Mongo-Dienst nach dem Neustart nicht gestartet werden kann, befolgen Sie die folgenden Schritte askubuntu.com/questions/884541/cant-start-mongodb-service

    – Luftig

    16. Februar 2022 um 11:22 Uhr

  • 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


Kirills Benutzeravatar
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:

version: '3.9'

services:
  mongodb:
    image: mongo:5
    command: --replSet rs0
    ports:
      - "28017:27017"
    environment:
      MONGO_INITDB_DATABASE: attachment-api-local-dev
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongo localhost:27017/admin --quiet
      interval: 2s
      timeout: 3s
      retries: 5

  mongo-init:
    image: mongo:5
    restart: "no"
    depends_on:
      mongodb:
        condition: service_healthy
    command: >
      mongo --host mongodb:27017 --eval
      '
      rs.initiate( {
         _id : "rs0",
         members: [
            { _id: 0, host: "localhost:27017" }
         ]
      })
      '

Eine viel einfachere Lösung ist die einfache Verwendung Bitnami MongoDB-Bild:

services:
  mongodb:
    image: bitnami/mongodb:5.0
    ports:
      - "27017:27017"
    environment:
      MONGODB_REPLICA_SET_MODE: primary
      ALLOW_EMPTY_PASSWORD: 'yes'

  • 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

und aktualisieren Sie es wie folgt

ExecStart=/usr/bin/mongod --config "/etc/mongod.conf" --replSet rs0

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

Benutzeravatar von Mohammad Rajabloo
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.

MongoDB-Atlas

1452840cookie-checkMongodb v4.0-Transaktion, MongoError: Transaktionsnummern sind nur auf einem Replikatsatzmitglied oder Mongos zulässig

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy