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



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

堆栈跟踪以以下开头:

com.mongodb.MongoClientException:会话不受 此客户端连接到的 MongoDB 集群 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]

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

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

我们能够在本地配置

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

  • 在 Windows 上,一个 默认

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

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

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

    对于独立的 mongo 安装,您可以跳过配置第 2 个或第 3 个节点,如官方 mongo 文档中所述 此处

    您需要在配置中设置replSetName

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

    然后运行其中的详细信息 这里

    rs.initiate()
    

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

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

    您需要替换的上述键:-

    database_name= 数据库的名称

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

    解决方案 2(仅适用于基于 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 run 命令(替换为您构建的映像名称或使用上面共享的,即 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,并尝试使用事务管理并收到错误:

com.mongodb.MongoClientException:会话不受 此客户端连接到的 MongoDB 集群

我遵循上述答案给出的几个步骤,并添加了一些步骤:

更改 mongo.cfg并添加了这个

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

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

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

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

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

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

还要确保你有mongo.exe打开。

最新更新