当前位置: 首页 > news >正文

在Spring Boot 中如何配置MongoDB的副本集 (Replica Set) 或分片集群 (Sharded Cluster)?

在 Spring Boot 中配置 MongoDB 副本集 (Replica Set) 或分片集群 (Sharded Cluster) 非常相似,主要区别在于连接字符串 (URI) 中提供的主机列表和一些特定选项。

最常的方式是使用 spring.data.mongodb.uri 属性配置连接字符串。

1. 连接到 MongoDB 副本集 (Replica Set)

副本集提供高可用性。需要提供副本集中至少一个成员的地址,驱动会自动发现当前的主节点 (Primary)。

关键点:

  • 在 URI 中列出多个副本集成员的主机名和端口,用逗号分隔。
  • 必须指定 replicaSet 参数,其值为在 MongoDB 中配置的副本集名称。

配置示例 (application.properties):

# --- MongoDB Replica Set Configuration ---# 基本连接 URI,包含多个主机节点和副本集名称
# 格式: mongodb://[username:password@]host1[:port1],host2[:port2],...[,hostN[:portN]][/[database][?options]]
spring.data.mongodb.uri=mongodb://mongo-rs1:27017,mongo-rs2:27017,mongo-rs3:27017/mydatabase?replicaSet=myReplicaSet# 如果需要认证
# spring.data.mongodb.uri=mongodb://myuser:mypassword@mongo-rs1:27017,mongo-rs2:27017,mongo-rs3:27017/mydatabase?replicaSet=myReplicaSet&authSource=admin# --- 可选的其他常用选项 ---
# 读取 (例如,从次要节点读取以分散负载)
# spring.data.mongodb.uri=mongodb://.../mydatabase?replicaSet=myReplicaSet&readPreference=secondaryPreferred# 写入安全级别 (Write Concern) - 例如,要求写入大多数节点确认
# spring.data.mongodb.uri=mongodb://.../mydatabase?replicaSet=myReplicaSet&w=majority# 连接超时 (毫秒)
# spring.data.mongodb.uri=mongodb://.../mydatabase?replicaSet=myReplicaSet&connectTimeoutMS=5000# 套接字超时 (毫秒)
# spring.data.mongodb.uri=mongodb://.../mydatabase?replicaSet=myReplicaSet&socketTimeoutMS=10000# 启用 TLS/SSL
# spring.data.mongodb.uri=mongodb://.../mydatabase?replicaSet=myReplicaSet&ssl=true

配置示例 (application.yml):

spring:data:mongodb:# 基本连接 URIuri: mongodb://mongo-rs1:27017,mongo-rs2:27017,mongo-rs3:27017/mydatabase?replicaSet=myReplicaSet# 带认证的 URI# uri: mongodb://myuser:mypassword@mongo-rs1:27017,mongo-rs2:27017,mongo-rs3:27017/mydatabase?replicaSet=myReplicaSet&authSource=admin# 组合选项示例# uri: mongodb://myuser:mypassword@mongo-rs1:27017,mongo-rs2:27017,mongo-rs3:27017/mydatabase?replicaSet=myReplicaSet&authSource=admin&readPreference=secondaryPreferred&w=majority&retryWrites=true
  • mydatabase: 要连接的默认数据库名称。
  • myReplicaSet: 在 MongoDB 中设置的副本集的名称。
  • mongo-rs1, mongo-rs2, mongo-rs3: 副本集成​​员的主机名或 IP 地址。
  • 27017: 副本集成​​员的端口号(默认)。
  • myuser, mypassword: 用于认证的用户名和密码。
  • authSource=admin: 指定用于验证用户凭据的数据库( admin 数据库,除非用户是在特定数据库中创建的)。
  • retryWrites=true: 推荐启用,允许驱动程序在遇到某些网络错误或副本集选举时自动重试一次写入操作。

2. 连接到 MongoDB 分片集群 (Sharded Cluster)

分片集群提供水平扩展能力。需要连接到 mongos 路由进程,而不是直接连接到分片副本集。

关键点:

  • 在 URI 中列出一个或多个 mongos 实例的主机名和端口,用逗号分隔。
  • 不需要指定 replicaSet 参数,因为是连接到 mongos 而不是特定的副本集。

配置示例 (application.properties):

# --- MongoDB Sharded Cluster Configuration ---# 连接到多个 mongos 实例
# 格式: mongodb://[username:password@]mongos1[:port1],mongos2[:port2],...[,mongosN[:portN]][/[database][?options]]
spring.data.mongodb.uri=mongodb://mongos1.example.com:27017,mongos2.example.com:27017/mydatabase# 如果需要认证 (在 admin 数据库进行认证)
# spring.data.mongodb.uri=mongodb://myuser:mypassword@mongos1.example.com:27017,mongos2.example.com:27017/mydatabase?authSource=admin# --- 可选的其他常用选项 (与副本集类似,但作用于 mongos) ---
# 读取偏好 (mongos 会根据设置将读请求路由到合适的分片节点)
# spring.data.mongodb.uri=mongodb://.../mydatabase?readPreference=nearest# 写入安全级别
# spring.data.mongodb.uri=mongodb://.../mydatabase?w=majority# 启用 TLS/SSL (如果 mongos 配置了 SSL)
# spring.data.mongodb.uri=mongodb://.../mydatabase?ssl=true

配置示例 (application.yml):

spring:data:mongodb:# 连接到多个 mongos 实例uri: mongodb://mongos1.example.com:27017,mongos2.example.com:27017/mydatabase# 带认证的 URI# uri: mongodb://myuser:mypassword@mongos1.example.com:27017,mongos2.example.com:27017/mydatabase?authSource=admin# 组合选项示例# uri: mongodb://myuser:mypassword@mongos1.example.com:27017,mongos2.example.com:27017/mydatabase?authSource=admin&readPreference=nearest&w=majority&retryWrites=true
  • mongos1.example.com, mongos2.example.com: mongos 实例的主机名或 IP 地址。
  • 27017: mongos 实例的端口号(默认)。
  • 其他参数(mydatabase, myuser, mypassword, authSource, readPreference, w, retryWrites, ssl 等)的含义与连接副本集时相同。

3. 依赖项

确保 pom.xml (Maven) 或 build.gradle (Gradle) 文件中包含了 Spring Data MongoDB 的 starter 依赖:

Maven:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

Gradle:

implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'

总结与注意事项

  1. 主要区别: 连接副本集需要 replicaSet=name 参数并列出副本集成员;连接分片集群则列出 mongos 实例地址,不需要 replicaSet 参数。
  2. URI 是首选: 使用 spring.data.mongodb.uri 是配置 MongoDB 连接最简洁、最标准的方式。
  3. 主机列表: 在 URI 中提供多个主机地址(无论是副本集成员还是 mongos 实例)可以提高应用程序启动时的健壮性。即使列表中的某个主机暂时不可用,驱动程序也可以尝试连接其他主机。
  4. 认证: 如果 MongoDB 启用了认证,务必在 URI 中提供用户名、密码,并需要指定 authSource
  5. 安全性: 不要在配置文件中硬编码密码。考虑使用环境变量、Spring Cloud Config、Vault 或其他安全机制来管理敏感凭据。
  6. 网络: 确保 Spring Boot 应用程序可以从其运行环境中访问 URI 中指定的 MongoDB 主机和端口。
  7. 选项:readPreference, w (Write Concern), retryWrites, ssl 等,以满足应用程序的可用性、一致性和性能要求。

通过在 application.propertiesapplication.yml 中设置 spring.data.mongodb.uri,Spring Boot 会自动配置 MongoClient bean,我们可以直接在服务或仓库中注入并使用它。

相关文章:

  • HTTP协议网络读卡器通讯报文
  • WebSoket的简单使用
  • Rice Science∣武汉大学水稻研究团队发现水稻壁相关激酶OsWAKg16和OsWAKg52同时调控水稻抗病性和产量
  • 关系型数据库与非关系型数据库深度对比:从设计哲学到应用场景的全解析
  • 在Star-CCM+中实现UDF并引用场数据和网格数据
  • 【C语言】初阶数据结构相关习题(一)
  • Leetcode 刷题记录 07 —— 链表
  • 小土堆pytorch--transform
  • 关于loadstartcode使用
  • 使用 Poco C++ 库构建轻量级 HTTP 服务器
  • 小微企业SaaS ERP管理系统,SpringBoot+Vue+ElementUI+UniAPP
  • Oracle中游标和集合的定义查询及取值
  • Flutter开发HarmonyOS实战-鸿蒙App商业项目
  • 极速轻量,Rust 网络开发新选择:Hyperlane 框架深度解析
  • C++学习之路,从0到精通的征途:priority_queue类的模拟实现
  • 20250506异形拼图块(圆形、三角、正方,椭圆/半圆)的中2班幼儿偏好性测试(HTML)
  • 高频面试题:设计秒杀系统,用Redis+Lua解决超卖
  • SpringBoot教学管理平台源码设计开发
  • [学习]RTKLib详解:pntpos.c与postpos.c
  • C++【继承】
  • “注胶肉”或已泛滥?这几种肉,再爱吃也要管住嘴
  • 从陈毅杯到小应氏杯,五一长假上海掀起围棋热
  • 铁路五一假期运输旅客发送量累计超1亿人次,今日预计发送2110万人次
  • 牧草之王苜蓿的江南驯化史
  • 伊朗公布新型弹道导弹,“萨德”系统无法拦截
  • 贵州省委省政府迅速组织开展黔西市游船倾覆事故救援工作