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

Posted

技术标签:

【中文标题】如何配置支持会话的 MongoDB 集群?【英文标题】:How to configure a MongoDB cluster which supports sessions? 【发布时间】:2018-10-19 16:18:22 【问题描述】:

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

堆栈跟踪开始于:

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) ~[spring-data-mongodb-2.1.0.DATAMONGO-1920-SNAPSHOT.jar:2.1.0.DATAMONGO-1920-SNAPSHOT]

【问题讨论】:

您需要一个 MongoDB "Server" 版本 3.6 in order to use sessions。如果没有后端服务器,仅更新的驱动程序无法完成这项工作。这就是错误告诉你的内容。 我的服务器版本为 3.7.9,即最新版本。 没有“服务器”3.7.9 之类的东西。这就是 Java 驱动程序版本。 “服务器”是指通过 mongo shell 连接并键入 db.version() 时看到的内容。即使您使用的是开发分支服务器,当前的“cut”也是 3.7.5。所以你说的是“驱动程序”,我说的是“服务器”。 我在 mongo shell 中下载了 http://downloads.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.7.9.zip?_ga=2.134458040.816321646.1525581231-1505195349.1522993255db.version() 返回 3.7.9 嗯,这是一个开发版本,但驱动程序肯定会说实际连接实际上不是受支持的服务器,因此您可能至少应该检查您是否实际连接到您认为的服务器实例连接到。此外,您可能不应该使用开发版本,直到您实际上拥有针对“稳定”版本的工作代码。如前所述,您“应该”使用 3.6 系列服务器才能使用会话。 “开发”分支中的当前驱动程序和服务器版本处于“变化”状态,API 中的各种内容可能会发生变化。 【参考方案1】:

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

【讨论】:

在我的情况下默认情况下它已经被禁用。然后,错误仍然存​​在。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

这个问题的答案如何? @TundePizzle 他问了一个问题,表明他使用了旧的 API,这也发生在我身上。不要太容易触发:)【参考方案4】:

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

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

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

对于独立的 mongo 安装,您可以跳过配置 2nd 或 3rd 节点,如官方 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 hub 上托管了 docker 映像

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

【讨论】:

@kakabaly 我只是尝试将我的独立设置转换为单节点副本集,因为您现在回答坚果我有ECONNREFUSED ::1:27012 连接到它。在这里打开了一个问题***.com/questions/70322250/…,如果你能检查一下,看看我哪里弄错了,我真的很感激。 PD 我用 Atom 编辑了 mongod.conf 文件并保存了它。非常感谢【参考方案5】:

参考@kakabali给出的答案,我有几个不同的场景并配置它。

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

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

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

更改 mongo.cfg 并添加此

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

在我使用 Windows10 时重启服务。

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

【讨论】:

【参考方案6】:

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

在 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 service mongod restart;

蒙哥;

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-optionssingle-instance-replication

【讨论】:

以上是关于如何配置支持会话的 MongoDB 集群?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置mongodb 3.0.3

zabbix-v4.0系列-zabbix如何监控mongodb-v4.0.13分片集群

MongoDB 配置审计

MongoDB 分片集群实战

在 Azure 虚拟机上快速搭建 MongoDB 集群

mongodb集群监控和运维