在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):

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):

yaml 复制代码
spring:
  data:
    mongodb:
      # 基本连接 URI
      uri: 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):

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):

yaml 复制代码
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:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

Gradle:

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,我们可以直接在服务或仓库中注入并使用它。

相关推荐
SailingCoder10 分钟前
MongoDB Memory Server与完整的MongoDB的主要区别
数据库·mongodb
水木石画室12 分钟前
MongoDB 常用增删改查方法及示例
数据库·mongodb
旷世奇才李先生13 分钟前
MongoDB 安装使用教程
数据库·mongodb
qq_3392822316 分钟前
mongodb 中dbs 时,local代表的是什么
数据库·mongodb
Accpdaiyekun17 分钟前
C# 操作mongodb 多次查询快还是使用管道查询速度快
mongodb·c#·lua
gjh120819 分钟前
Easy-excel监听器中对批量上传的工单做错误收集
java·spring boot
绝无仅有28 分钟前
对接三方SDK开发过程中的问题排查与解决
后端·面试·架构
考虑考虑2 小时前
使用jpa中的group by返回一个数组对象
spring boot·后端·spring
十一0829932 小时前
【PDF-XSS攻击】springboot项目-上传文件-解决PDF文件XSS攻击
spring boot·pdf·xss
GiraKoo2 小时前
【GiraKoo】C++11的新特性
c++·后端