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

问题描述 投票:0回答:7

我想探索 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]

spring mongodb spring-boot spring-data spring-data-mongodb
7个回答
15
投票

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

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


8
投票

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

  • 在 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 重新启动;

蒙戈;

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

检查以启用配置

rs.conf()

我们可以使用 连接 URL 作为

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

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


5
投票

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

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

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

对于独立的 mongo 安装,您可以跳过配置第二个或第三个节点,如官方 mongo 文档中所述这里

您需要在配置中设置一个 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

0
投票

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

我使用 Spring Boot 配置 mongo 并尝试使用事务管理并收到错误:

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

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

更改 mongo.cfg 并添加此

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

重新启动服务,因为我使用的是Windows10。

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


0
投票

对于那些在 docker 上部署 mongodb 的人来说,以下链接就是您所需要的。没有 mongosh 或 mongodb CLI。只有 docker-compose.yml 文件。我推荐单节点副本集设置。 mongo-express 也是一个通过简单的 GUI 管理数据库的好工具。

https://medium.com/workleap/the-only-local-mongodb-replica-set-with-docker-compose-guide-youll-ever-need-2f0b74dd8384

我的 docker-compose.yaml 文件如下所示:

version: "3.8"

services:
  mongo1:
    image: mongo:7.0
    command: ["--replSet", "rs0", "--bind_ip_all", "--port", "27017"]
    ports:
      - 27017:27017
    extra_hosts:
      - "host.docker.internal:host-gateway"
    healthcheck:
      test: echo "try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'host.docker.internal:27017'}]}) }" | mongosh --port 27017 --quiet
      interval: 5s
      timeout: 30s
      start_period: 0s
      #start_interval: 1s
      retries: 30
    volumes:
      - "mongo1_data:/data/db"
      - "mongo1_config:/data/configdb"
  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8084:8081
    environment:
      ME_CONFIG_MONGODB_URL: mongodb://mongo1:27017/

volumes:
  mongo1_data:
  mongo1_config:

-1
投票

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


-1
投票

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

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

还要确保 mongo.exe 打开。

© www.soinside.com 2019 - 2024. All rights reserved.