如何配置支持会话的 MongoDB 集群?

How to configure a MongoDB cluster which supports sessions?

我想探索 MongoDB 的新交易功能并使用 Spring 数据 MongoDB。但是,我收到异常消息“会话不受此客户端连接到的 MongoDB 集群 ” 的支持。任何有关 MongoDB 3.7.9 配置的提示都值得赞赏。

堆栈跟踪以:

开头

com.mongodb.MongoClientException: Sessions are not supported by the MongoDB cluster to which this client is connected at com.mongodb.MongoClient.startSession(MongoClient.java:555) ~[mongodb-driver-3.8.0-beta2.jar:na] at org.springframework.data.mongodb.core.SimpleMongoDbFactory.getSession(SimpleMongoDbFactory.java:163) ~[spring-data-mongodb-2.1.0.DATAMONGO-1920-SNAPSHOT.jar:2.1.0.DATAMONGO-1920-SNAPSHOT]

我禁用了 TLS(在 Spring 数据 MongoDB 中),现在开发版本 3.7.9 的交易功能工作正常。

我在尝试将它连接到单个独立 mongo 实例时遇到了同样的问题,但是正如 official documentation 中所写,Mongo 支持事务功能一个副本集。因此,我随后尝试在 MongoDB 4.0.0 上创建一个包含所有实例的副本集,我能够成功执行代码。 所以, 启动一个副本集(3个成员),然后尝试执行代码,问题将得到解决。

注意:您可以在同一台机器上配置副本集进行测试https://docs.mongodb.com/manual/tutorial/deploy-replica-set-for-testing/

确保您使用的是更新后的 API - 例如:

MongoClient mongoClient = MongoClients.create();
MongoDatabase dataBase = mongoClient.getDatabase("mainDatabase");
MongoCollection<Document> collection = dataBase.getCollection("entities");

还要确保您 mongo.exe 打开了。

副本集肯定是问题的解决方案

但是不强制执行 3 个节点的副本

解决方案 1(独立设置)

对于独立 mongo 安装,您可以按照官方 mongo 文档 here

中的描述跳过配置第二个或第三个节点

并且您需要在配置

中设置一个 replSetName
replication:
   oplogSizeMB: <int>
   replSetName: <string>
   enableMajorityReadConcern: <boolean>

然后 运行 详细信息是 here

rs.initiate()

在此之后,连接字符串将如下所示:-

mongodb://localhost:27017/<database_name>?replicaSet=<replSet_Name>

以上需要替换的键:-

database_name = 数据库名称

replSet_Name = 您在上述配置中设置的副本集的名称

解决方案 2仅适用于基于 docker 的要求

示例Docker图像单节点副本集作为开发环境的主节点如下:-

我在 docker 集线器上托管了 docker 图片

docker pull krnbr/mongo:latest

同一个Docker文件的内容如下:-

FROM mongo
RUN echo "rs.initiate({'_id':'rs0','members':[{'_id':0,'host':'127.0.0.1:27017'}]});" > /docker-entrypoint-initdb.d/replica-init.js
RUN cat /docker-entrypoint-initdb.d/replica-init.js
CMD [ "--bind_ip_all", "--replSet", "rs0" ]

Docker 运行 命令(替换为您自己构建的图像名称或使用上面共享的 on,即 krnbr/mongo): -

无音量


docker run -d --name mongo -p 27017:27017 <Image Name> mongod --replSet rs0 --port 27017

体积


docker run -d --name mongo -p 27017:27017 -v ~/.mongodb:/data/db <Image Name> mongod --replSet rs0 --port 27017

支持任意ip绑定

docker run -d --name mongo -p 27017:27017 -v ~/.mongodb:/data/db <Image Name> mongod --bind_ip_all --replSet rs0 --port 27017

参考@kakabali给出的答案,我有一些不同的场景和配置。

我正在配置 mongo spring 引导并尝试使用事务管理并收到错误:

com.mongodb.MongoClientException: Sessions are not supported by the MongoDB cluster to which this client is connected at

我按照上面答案给出的几个步骤进行了一些添加:

更改 mongo.cfg 并添加此

replication:
   oplogSizeMB: 128
   replSetName: "rs0"
   enableMajorityReadConcern: true

重新启动服务,因为我正在使用 Windows10。

打开 mongo 控制台和 运行 rs.initilize()

我们可以在本地进行如下配置

  • 在 Linux 上,包含默认的 /etc/mongod.conf 配置文件 当使用包管理器安装 MongoDB.

  • 在 Windows,一个 默认 <安装目录>/bin/mongod.cfg 配置文件是 安装期间包含

  • 在 macOS 上,包含默认的 /usr/local/etc/mongod.conf 配置文件 从 MongoDB 的官方 Homebrew tap 安装时。

添加以下配置

replication:
   oplogSizeMB: 128
   replSetName: "rs0"
   enableMajorityReadConcern: true

sudo服务mongod重启;

mongo;

rs.initiate({
      _id: "rs0",
      version: 1,
      members: [
         { _id: 0, host : "localhost:27017" }
      ]
   }
)

检查 以启用配置

rs.conf()

我们可以使用连接URL作为

mongodb://localhost/default?ssl=false&replicaSet=rs0&readPreference=primary

文档:config-options single-instance-replication