MongoDB 的连接字符串(Connection String)是客户端与 MongoDB 服务端建立连接的核心配置,其格式遵循标准的 URI 规范。
一、连接字符串的组成部分
1. 基本格式
mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[database][?options]]
或支持 SRV 记录的简写格式(MongoDB 3.6+):
mongodb+srv://[username:password@]host[:port]/[database][?options]
2. 详细拆解
部分 | 说明 |
---|---|
协议头 | mongodb:// (普通连接)或 mongodb+srv:// (自动发现集群节点,需 DNS SRV 记录支持)。 |
认证信息 | username:password@ (可选,需 URL 编码特殊字符)。 |
主机列表 | host1:port1,host2:port2,... (多个节点用于副本集或分片集群)。 |
认证数据库 | /?authSource=admin (指定认证的数据库,默认为连接的数据库)。 |
数据库名 | /mydb (可选,指定默认数据库)。 |
连接选项 | ?option1=value1&option2=value2 (控制连接行为,如超时、SSL、副本集配置)。 |
二、核心连接选项
1. 基础配置
connectTimeoutMS=30000
:连接超时时间(毫秒)。socketTimeoutMS=360000
:套接字通信超时时间。maxPoolSize=100
:连接池最大连接数(默认 100)。
2. 认证与安全
authMechanism=SCRAM-SHA-256
:认证机制(默认 SCRAM-SHA-1 或 SCRAM-SHA-256)。tls=true
:启用 TLS/SSL 加密。replicaSet=myReplicaSet
:指定副本集名称。
3. 读写行为
readPreference=secondary
:读偏好(主节点、从节点、最近节点等)。retryWrites=true
:自动重试写操作(MongoDB 4.2+ 支持)。
4. 分片与集群
appName=myApp
:标识客户端应用名称(用于监控)。directConnection=true
:强制直连单个节点(禁用自动发现)。
三、典型使用场景
1. 单节点连接
mongodb://localhost:27017/mydb
- 场景:本地开发测试或单机部署。
2. 副本集连接
mongodb://host1:27017,host2:27017,host3:27017/?replicaSet=myReplicaSet
- 场景:高可用生产环境,自动故障转移。
3. 分片集群连接
mongodb://router1:27017,router2:27017/?replicaSet=configRS
- 场景:水平扩展海量数据,通过 Mongos 路由访问分片。
4. 云服务连接(MongoDB Atlas)
mongodb+srv://user:password@cluster0.mongodb.net/mydb?retryWrites=true&w=majority
- 场景:托管云数据库,自动解析 SRV 记录和 TLS 加密。
四、底层原理
1. 连接建立流程
- DNS 解析(仅
mongodb+srv://
):- 通过 SRV 记录获取所有节点地址,通过 TXT 记录获取默认连接选项。
- 认证握手:
- 客户端与服务端协商认证机制(如 SCRAM-SHA-256),验证用户权限。
- 连接池管理:
- 驱动维护连接池,复用 TCP 连接以减少握手开销(由
maxPoolSize
控制)。
- 驱动维护连接池,复用 TCP 连接以减少握手开销(由
2. 协议与网络
- Wire Protocol:MongoDB 使用二进制协议(OP_MSG)传输请求与响应。
- TLS/SSL 加密:通过 OpenSSL 或类似库加密通信(需配置证书)。
3. 副本集发现
- 客户端通过
replicaSet
参数连接到任意节点,自动获取主节点地址和拓扑信息。
4. 负载均衡与路由
- 分片集群:Mongos 路由根据分片键将请求转发到正确分片。
- 读写分离:通过
readPreference
将读请求路由到 Secondary 节点。
五、常见问题与优化
- 特殊字符处理:
- 密码中的
@
、:
等需 URL 编码(如%40
)。
- 密码中的
- 性能优化:
- 调整
maxPoolSize
适配应用并发需求。 - 启用
retryWrites
增强写操作可靠性。
- 调整
- 安全加固:
- 强制
tls=true
并配置 CA 证书验证。
- 强制
总结
MongoDB 连接字符串是应用与数据库交互的“入口”,其设计需兼顾安全性、性能和高可用性。通过合理配置主机列表、认证参数和连接选项,可适配从单机开发到全球分布式集群的复杂场景。理解其底层原理(如连接池、DNS 自动发现)有助于优化资源利用率和故障排查。