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?
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
, Python
o 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
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 mongo
ingrese 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 conmongo --version
– Looi
21 de mayo de 2022 a las 10:44
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 comoMONGODB_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
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.