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

Jue*_*ann 9 mongodb spring-data spring-data-mongodb

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

stacktrace以以下内容开头:

com.mongodb.MongoClientException:该客户端在com.mongodb.MongoClient.startSession(MongoClient.java:555)〜[mongodb-driver-3.8.0-beta2.jar:na)连接到的MongoDB群集不支持会话] 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-快照]

Piy*_*rma 10

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

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


Muk*_*han 6

我们能够在本地配置如下

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

  • 在 Windows 上,安装过程中包含默认的 <install directory>/bin/mongod.cfg 配置文件

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

添加以下配置

replication:
   oplogSizeMB: 128
   replSetName: "rs0"
   enableMajorityReadConcern: true
Run Code Online (Sandbox Code Playgroud)

须藤服务 mongod 重启;

蒙戈;

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

检查要启用的配置

rs.conf()
Run Code Online (Sandbox Code Playgroud)

我们可以使用连接 URL作为

mongodb://localhost/default?ssl=false&replicaSet=rs0&readPreference=primary
Run Code Online (Sandbox Code Playgroud)

文档:配置选项 单实例复制


kak*_*ali 5

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

但是做 3 个节点的副本不是强制性的

解决方案 1(用于独立设置)

对于独立的 mongo 安装,您可以按照此处的官方 mongo 文档中的描述跳过配置第二个或第三个节点

你需要在配置中设置一个replSetName

replication:
   oplogSizeMB: <int>
   replSetName: <string>
   enableMajorityReadConcern: <boolean>
Run Code Online (Sandbox Code Playgroud)

然后运行这里的详细信息

rs.initiate()
Run Code Online (Sandbox Code Playgroud)

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

mongodb://localhost:27017/<database_name>?replicaSet=<replSet_Name>
Run Code Online (Sandbox Code Playgroud)

上面需要更换的键:-

database_name =数据库名称

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

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

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

我已经在 docker hub 上托管了docker 镜像

docker pull krnbr/mongo:latest
Run Code Online (Sandbox Code Playgroud)

同一个Dockerfile的内容如下:-

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" ]
Run Code Online (Sandbox Code Playgroud)

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

没有音量


docker run -d --name mongo -p 27017:27017 <Image Name> mongod --replSet rs0 --port 27017
Run Code Online (Sandbox Code Playgroud)

有音量


docker run -d --name mongo -p 27017:27017 -v ~/.mongodb:/data/db <Image Name> mongod --replSet rs0 --port 27017
Run Code Online (Sandbox Code Playgroud)

支持绑定任意ip

docker run -d --name mongo -p 27017:27017 -v ~/.mongodb:/data/db <Image Name> mongod --bind_ip_all --replSet rs0 --port 27017
Run Code Online (Sandbox Code Playgroud)