在 Spring Boot 中配置 MongoDB 副本集 (Replica Set) 或分片集群 (Sharded Cluster) 非常相似,主要区别在于连接字符串 (URI) 中提供的主机列表和一些特定选项。
最常的方式是使用 spring.data.mongodb.uri
属性配置连接字符串。
副本集提供高可用性。需要提供副本集中至少一个成员的地址,驱动会自动发现当前的主节点 (Primary)。
关键点:
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:
# 基本连接 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
: 推荐启用,允许驱动程序在遇到某些网络错误或副本集选举时自动重试一次写入操作。分片集群提供水平扩展能力。需要连接到 mongos
路由进程,而不是直接连接到分片副本集。
关键点:
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:[email protected]: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:[email protected]:27017,mongos2.example.com:27017/mydatabase?authSource=admin
# 组合选项示例
# uri: mongodb://myuser:[email protected]: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
等)的含义与连接副本集时相同。确保 pom.xml
(Maven) 或 build.gradle
(Gradle) 文件中包含了 Spring Data MongoDB 的 starter 依赖:
Maven:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-mongodbartifactId>
dependency>
Gradle:
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
replicaSet=name
参数并列出副本集成员;连接分片集群则列出 mongos
实例地址,不需要 replicaSet
参数。spring.data.mongodb.uri
是配置 MongoDB 连接最简洁、最标准的方式。mongos
实例)可以提高应用程序启动时的健壮性。即使列表中的某个主机暂时不可用,驱动程序也可以尝试连接其他主机。authSource
。readPreference
, w
(Write Concern), retryWrites
, ssl
等,以满足应用程序的可用性、一致性和性能要求。通过在 application.properties
或 application.yml
中设置 spring.data.mongodb.uri
,Spring Boot 会自动配置 MongoClient
bean,我们可以直接在服务或仓库中注入并使用它。