Mongodb v4.0事务,MongoError:事务编号仅在副本集成员或mongos上允许

时间:2018-07-22 04:07:12

标签: javascript node.js mongodb transactions

我已经安装MongoDB v4.0来实现其最神奇的功能,它以mongodb 3.1作为驱动程序在Node.js中提供了 Transaction

当我尝试使用交易会话时,遇到了此错误:

  

MongoError:事务编号仅允许用于副本集成员或mongos。

那是什么,我如何摆脱它?

任何建议都值得赞赏。

6 个答案:

答案 0 :(得分:5)

Transactions无疑是MongoDB 4.0中最令人兴奋的新功能。但是不幸的是,大多数用于安装和运行MongoDB的工具都启动了独立服务器,而不是副本集。如果您尝试在独立服务器上启动会话,则会收到此错误。

为了使用事务,您需要一个 MongoDB 副本集,并且在本地启动副本集进行开发是一个涉及的过程。新的run-rs npm module使启动副本集变得容易。启动副本集只需运行run-rs,run-rs甚至会为您安装正确版本的MongoDB。

Run-rs除Node.js和npm外没有其他依赖项。您不需要安装Docker,自制软件,APT,Python甚至MongoDB。

使用npm's -g标志在全局安装run-rs。您还可以在package.json文件的devDependencies中列出运行库。

npm install run-rs -g

接下来,使用--version标志运行run-rs。 Run-rs将为您下载MongoDB v4.0.0。不用担心,它不会覆盖您现有的MongoDB安装。

run-rs -v 4.0.0 --shell

然后在连接字符串中使用 replicaSet=rs

您可以找到有关here的更多详细信息。

答案 1 :(得分:2)

我最近遇到了同样的问题。就我而言,这是因为我要连接到与本地开发环境版本不同的远程Mongo服务器。

为了快速解决此问题,我在连接字符串中添加了以下参数:

retryWrites = false

答案 2 :(得分:2)

我得到了解决方案,它只是 MongoDB 配置文件中的三行配置。

从 MongoDB atlas 切换并使用 WHM 在 CentOS 7 VPS 上安装 MongoDB v 4.4.0 后,我也遇到了这个问题。

run-rs 解决方案对我不起作用,但我设法在没有任何第三方工具的情况下解决了这个问题,具体步骤如下:

1.关闭mongod

最有效的方法是使用命令 mongo 进入 MongoDB shell 签出方法

db.shutdownServer()

您将无法使用 MongoDB 服务器。 对我来说,关机过程耗时太长,然后我用命令杀掉了进程:

systemctl stop -f mongod

如果你杀死了 mongod 进程,你可能需要运行 mongod --dbpath /var/db --repair

var/db 应该指向您的数据库目录。

2.设置副本集配置。

对于 replicaSet 设置步骤,请查看 /etc/mongod.conf 文件, 查找 replication 值行,您应该添加以下几行:

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

在下一步中使用 replSetName 值。

3.添加您的连接字符串网址。

将 replSetName 的值添加到您的连接 URL &replicaSet=--YourReplicationSetName--

4.再次开启mongod

输入命令:systemctl start mongod

5.访问您的副本集数据库

使用命令mongo进入MongoDB shell,输入命令rs.initiate() 现在你应该在你的 replicaSet 数据库中。

答案 3 :(得分:0)

我一直在与这个问题作斗争几周。我让你我的结论。 为了能够在分片群集上使用事务,您至少需要在群集上运行MongoDB 4.2。如果群集未分片,则从4.0开始。 我使用的库具有作为子依赖项的mongodb NodeJS驱动程序。来自版本3.3.x的该驱动程序无法对具有版本4.0.4的分片MongoDB群集进行故障处理。 对我来说,解决方案是将群集更新为4.2版本。

src:https://www.bmc.com/blogs/mongodb-transactions/

答案 4 :(得分:0)

要使用事务,您需要一个MongoDB副本集,并且在本地启动副本集进行开发是一个复杂的过程。

您可以使用run-rs npm module。零配置MongoDB运行程序。启动一个没有非节点依赖性的副本集,甚至没有MongoDB。

或者您可以简单地在MongoDB Atlas中创建一个帐户,该帐户为您提供了有限的资源MongoDB集群,因此您可以运行/测试您的应用程序。

MongoDB Atlas

答案 5 :(得分:0)

使用 docker

进行本地开发的可能解决方案

创建 Dockerfile

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

构建这个 Dockerfile

docker build ./ -t mongodb:4.7-replset

运行这个创建的图像

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

使用此 URI 连接到数据库

mongodb://localhost:27017/myDB