Mongodb v4.0 Transaction, MongoError: los números de transacción solo se permiten en un miembro del conjunto de réplicas o mongos

7 minutos de lectura

avatar de usuario de jafar shemshadi
jafar shemshadi

he instalado MongoDB v4.0 por la característica más sorprendente de ella Transacción en Nodejs con mongodb 3.1 como conductor.

Cuando intento usar una sesión de transacción, me encuentro con este error:

MongoError: Transaction numbers are only allowed on a replica set member or mongos.

¿Qué es eso y cómo puedo deshacerme de él?

Avatar de usuario de Majid Parvin
majid parvin

Transactions son sin duda la característica nueva más emocionante en MongoDB 4.0. Pero desafortunadamente, la mayoría de las herramientas para instalar y ejecutar MongoDB inician un servidor independiente en lugar de un conjunto de réplicas. Si intenta iniciar una sesión en un servidor independiente, obtendrá este error.

Para usar transacciones, necesita un MongoDB conjunto de réplicas, e iniciar un conjunto de réplicas localmente para el desarrollo es un proceso complicado. El nuevo run-rs npm module facilita el inicio de conjuntos de réplicas. Ejecutar run-rs es todo lo que necesita para iniciar un conjunto de réplicas, run-rs incluso instalará la versión correcta de MongoDB para ti.

run-rs no tiene dependencias externas excepto Node.js y npm. no necesitas tener Docker, homebrew, APT, Pythono incluso MongoDB instalado.

Instale run-rs globalmente con npm's -g bandera. También puede enumerar run-rs en su package.json devDependencies del archivo.

npm install run-rs -g

A continuación, ejecute run-rs con el indicador –version. Run-rs descargará MongoDB v4.0.0 por usted. No se preocupe, no sobrescribirá su instalación existente de MongoDB.

run-rs -v 4.0.0 --shell

Entonces usa replicaSet=rs en su cadena de conexión.

Encuentras más detalles al respecto aquí.

  • También es útil la imagen acoplable bitnami/mongodb, que le permite configurar un replicaSet con docker-compose: github.com/bitnami/…

    – mltsy

    4 de febrero de 2019 a las 18:35

  • Desde el documento, parece ejecutar un existente (o uno nuevo) mongod instancia con conjunto de réplicas es bastante trivial: docs.mongodb.com/manual/tutorial/…

    – Marcel Falliere

    18 de febrero de 2019 a las 12:53

  • ¿Alguna idea de por qué la capacidad de usar transacciones requiere un conjunto de réplicas de MongoDB? (En mi caso, tengo una instancia de MongoDb que se ejecuta en Docker para pruebas y no puedo ejecutar transacciones debido a esta limitación)

    – Yohan

    26 de marzo de 2020 a las 22:05

  • ¿Alguna idea de por qué debe instalarse globalmente y no solo como una dependencia de desarrollo?

    – filósofo

    29 oct 2020 a las 18:39

  • ¿Por qué se requiere un conjunto de réplicas? No tiene sentido para mí y parece que fue un error del equipo de mongodb.

    – java-adicto301

    1 de diciembre de 2021 a las 18:18

Avatar de usuario de Oren Hahiashvili
Oren Hahiashvili

Obtuve la solución, y es solo una configuración de tres líneas dentro del archivo de configuración de MongoDB.

Después de cambiar de MongoDB atlas e instalar MongoDB v 4.4.0 en mi CentOS 7 VPS con WHM, también enfrenté ese problema.

el run-rs solución no funciona para mí, pero logré resolver este problema sin ninguna herramienta de terceros, siguiendo estos pasos:

1. apagar mongod.

la forma más eficiente es ingresando al shell de MongoDB con el comando mongo
comprobar el método

db.shutdownServer()

No podrá utilizar el servidor MongoDB. Para mí, el proceso de apagado tomó demasiado tiempo y luego eliminé el proceso con el comando:

systemctl stop -f mongod

si mataste al mongod proceso, probablemente necesitará ejecutar
mongod --dbpath /var/db --repair

El var/db debe apuntar a su directorio de base de datos.

2. establecer la configuración de replicaSet.

para el paso de configuración de replicaSet, consulte el /etc/mongod.conf archivo, busque el replication línea de valor, y debe agregar las siguientes líneas como se muestra a continuación:

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

utilizar el replSetName valor en el siguiente paso.

un ejemplo de esos ajustes:

   oplogSizeMB: 2000
   replSetName: rs0
   enableMajorityReadConcern: false

3. agregue su URL de cadena de conexión.

agregue el valor de replSetName a su URL de conexión &replicaSet=--YourReplicationSetName--

si usaste el nombre rs0 de nuestro ejemplo, entonces debe agregar a su consulta de URL de conexión DB replicaSet=rs0

4. enciende mongod de nuevo

ingrese el comando: systemctl start mongod

5. Acceda a su base de datos replicaSet

ingrese MongoDB shell con el comando mongoingrese el comando rs.initiate()
ahora debería estar en su base de datos replicaSet.

  • La mejor solución para el desarrollo local en mi opinión. Es realmente fácil de hacer y funciona sin ningún software de terceros.

    – Nick

    4 de agosto de 2021 a las 7:43

  • ¿Qué valor debemos dar en replSetName? puedes decir algun ejemplo

    – Kannan T.

    3 de enero de 2022 a las 13:29

  • Hola @KannanT, modifiqué mi respuesta y adjunté un ejemplo.

    – Oren Hahiashvili

    04/01/2022 a las 21:00


  • En caso de que su servicio Mongo no pueda iniciarse después de reiniciar, siga askubuntu.com/questions/884541/cant-start-mongodb-service

    – Aireado

    16 de febrero de 2022 a las 11:22

  • Si usa MongoDB versión 5 y superior, excluya el enableMajorityReadConcern: true línea para el /etc/mongod.conf archivo. Compruebe su versión de instalación de Mongo con mongo --version

    – Looi

    21 de mayo de 2022 a las 10:44


Avatar de usuario de Kirill
cirilo

Para aquellos que quieran desarrollar contra la instancia dockerizada de MongoDB, aquí está el archivo único docker-compose.yaml solución basada en la imagen acoplable oficial de MongoDB:

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" }
         ]
      })
      '

Una solución mucho más fácil es simplemente usar Imagen de Bitnami MongoDB:

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

  • Aparentemente, el MONGODB_REPLICA_SET_KEY También se requiere la variable de entorno. Sin él, el proceso de Mongo se negó a iniciarse en el contenedor con un error que indica que la variable es obligatoria. Acabo de configurarlo en algo como MONGODB_REPLICA_SET_KEY: 123456

    – Booz

    13 de diciembre de 2022 a las 17:52


  • @Boaz nunca tuvo tal problema con Mongo 5. Probablemente use 6+

    – Cirilo

    13/12/2022 a las 18:00

  • En realidad, uso 4.2 🙂

    – Booz

    14 de diciembre de 2022 a las 15:02

Posible solución para el desarrollo local utilizando estibador

Crear archivo Docker

FROM mongo:4.4.7
RUN echo "rs.initiate();" > /docker-entrypoint-initdb.d/replica-init.js
CMD [ "--replSet", "rs" ]

Cree este Dockerfile

docker build ./ -t mongodb:4.7-replset

Ejecutar esta imagen creada

docker run --name mongodb-replset -p 27017:27017 -d mongodb:4.7-replset

Conéctese a la base de datos usando este URI

mongodb://localhost:27017/myDB

Me enfrenté al mismo problema recientemente. En mi caso es porque me estoy conectando a un servidor Mongo remoto con una versión diferente a mi entorno de desarrollo local.

Para resolver el problema rápidamente, agregué el siguiente parámetro a mi cadena de conexión:

?reintentarEscrituras=falso

  • Esto parece bastante sospechoso. ¿Estás seguro de que no solo silencia todos los errores en lugar de corregirlos? ¿Por qué se supone que funciona?

    – Gherman

    19 de julio de 2022 a las 23:14

Cuando ejecuta MongoDB en una máquina Linux, simplemente puede usar la replicación actualizando la cadena de conexión a través del archivo de servicio de edición

/usr/lib/mongod.service   or   /lib/systemd/system/mongod.service

y actualizarlo con lo siguiente

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

dónde --config "/etc/mongod.conf" está apuntando a su archivo de configuración de MongoDB y --replSet rs0 le está diciendo que use la replicación con el nombre de rs0

y luego reiniciar

sudo systemctl daemon-reload     //<--To reload service units
sudo systemctl restart mongod    //<--To Restart MongoDB Server

y luego inicie la replicación a través de su instancia de mongod en la terminal

$ mongosh
$ rs.initiate()

  • Esto parece bastante sospechoso. ¿Estás seguro de que no solo silencia todos los errores en lugar de corregirlos? ¿Por qué se supone que funciona?

    – Gherman

    19 de julio de 2022 a las 23:14

Avatar de usuario de Mohammad Rajabloo
Mohammad Rajabloo

Para usar transacciones, necesita un conjunto de réplicas de MongoDB, y comenzar un conjunto de réplicas localmente para el desarrollo es un proceso complicado.

Puedes usar el run-rs npm module. Corredor MongoDB de configuración cero. Inicia un conjunto de réplicas sin dependencias que no sean Node, ni siquiera MongoDB.

O simplemente puede crear una cuenta en MongoDB Atlas lo que le brinda un clúster MongoDB de recursos limitados para que pueda ejecutar/probar su aplicación.

Mongo DB Atlas

¿Ha sido útil esta solución?