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

时间:2018-05-09 13:55:02

标签: mongodb spring-data spring-data-mongodb

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

stacktrace以:

开头
  

com.mongodb.MongoClientException :不支持会话   此客户端连接到的MongoDB群集           在com.mongodb.MongoClient.startSession(MongoClient.java:555)〜[mongodb-driver-3.8.0-beta2.jar:na]           在org.springframework.data.mongodb.core.SimpleMongoDbFactory.getSession(SimpleMongoDbFactory.java:163)   〜[弹簧数据的mongodb-2.1.0.DATAMONGO-1920-SNAPSHOT.jar:2.1.0.DATAMONGO-1920-快照]

6 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

但是不是必须复制3个节点

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

对于独立的mongo安装,您可以跳过官方mongo文档here

中所述的配置第二个或第三个节点

您将需要在配置中设置replSetName

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

,然后运行其详细信息为here

rs.initiate()

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

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

您需要替换的上方键:-

数据库名称 =数据库名称

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

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

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

我已将 docker映像托管在docker hub上

docker pull krnbr/mongo:latest

相同的 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" ]

Docker运行命令(替换为您构建自己的映像名称或使用上面共享的映像名称,即 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

答案 2 :(得分:3)

我们能够在本地进行如下配置

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

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

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

添加以下配置

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

docs:config-options single-instance-replication

答案 3 :(得分:0)

我禁用了TLS(在Spring Data MongoDB中),现在开发版本3.7.9的事务功能正常工作。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

参考@kakabali给出的答案,我有一些不同的方案并对其进行配置。

我正在使用Spring Boot配置mongo,并尝试使用事务管理并获取错误:

com.mongodb.MongoClientException:会话不支持 该客户端连接到的MongoDB集群

我按照上述答案给出的一些步骤进行操作,并增加了一些内容:

更改mongo.cfg并添加

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

在使用Windows10时重新启动服务。

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