连接串是什么
MongoDB 连接串(URI)用一行字符串描述如何连接:协议前缀、认证信息、主机列表、目标库与一串查询参数。驱动据此完成拓扑发现、认证与读偏好选择。4.2 起支持 mongodb+srv 形式,通过 DNS SRV 记录解析集群地址,云托管实例基本都用这种写法,好处是主机变更不需要改配置。
基本信息
| 格式 | mongodb://[用户:密码@]主机[:端口][/库][?参数] |
|---|---|
| 常用参数 | authSource / replicaSet / tls / readPreference / maxPoolSize |
| SRV 写法 | mongodb+srv:// 走 DNS SRV 记录解析集群地址 |
| 多主机 | 主机之间用逗号分隔,驱动自动发现主节点 |
| 必填项 | 协议与至少一个主机;其余都有默认值 |
| 编码规则 | 用户名与密码按 RFC 3986 做百分号编码 |
典型使用场景
- 应用配置里声明数据库地址与认证方式
- 多环境区分:开发、测试、生产使用不同连接串
- 读写分离:用 readPreference 指定从节点读
- 副本集连接:列出多个成员让驱动自动发现主节点
- 云数据库接入:用 mongodb+srv 简化地址维护
- 限流保护:用 maxPoolSize 控制连接数上限
示例
示例
mongodb://app:secret@m1:27017,m2:27017/app?replicaSet=rs0&authSource=app&readPreference=secondaryPreferred
mongodb+srv://app:secret@cluster0.example.mongodb.net/app
mongodb://app:secret@m1:27017/app?tls=true&tlsCAFile=/etc/ssl/ca.pem&maxPoolSize=50
mongodb://app:secret@m1:27017/app?authSource=admin&retryWrites=true&w=majority
# 密码含特殊字符要编码:p@ss/w0rd → p%40ss%2Fw0rd常用参数读法
| 参数 | 作用 | 注意点 |
|---|---|---|
| authSource | 认证所在库 | 账号建在哪个库就写哪个 |
| replicaSet | 复制集名称 | 写错会卡在拓扑发现 |
| tls | 启用加密连接 | 云实例通常强制要求 |
| readPreference | 读偏好 | secondaryPreferred 可能读到旧数据 |
| maxPoolSize | 连接池上限 | 过大反而压垮数据库 |
| retryWrites | 可重试写入 | 需要写关注与拓扑支持 |
参数名区分大小写;密码按 RFC 3986 做百分号编码,拼装时用语言自带的 URL 编码函数最省事。
readPreference 设为 secondaryPreferred 能分担主节点压力,但复制延迟期间可能读到旧数据;强一致场景应使用 primary。
连接串里不写库名时默认落到 test;只写主机不写端口时默认 27017,容易在迁移环境时漏掉端口差异。
把含密码的连接串直接写进代码仓库是凭据外泄风险,生产环境应通过环境变量或密钥管理注入,并配置只读或最小权限账号。
配置与安全实践
- 连接串放环境变量或配置中心,代码仓库里不出现明文密码
- 按环境使用不同账号,生产账号只给必要权限
- maxPoolSize 与数据库承压能力匹配,过大反而拖慢整体
- 云实例强制 TLS 时确认证书链文件路径与主机名匹配
- 开启 retryWrites 提升瞬时故障下的写入成功率
- 定期轮换密码,轮换期间用双账号过渡避免业务中断
连不上排查顺序
- 先用 mongosh 用同一条连接串连接,排除应用侧配置差异
- 核对账号的认证库与 authSource 是否一致
- 确认主机端口可达,排除网络策略与安全组拦截
- 复制集场景确认 replicaSet 名称与成员地址无误
- TLS 报错时检查证书与主机名是否匹配
- 查看数据库侧日志的认证失败记录,确认请求是否到达服务端
replicaSet 与 directConnection 混用会改变拓扑发现方式,只在明确要直连单个节点的场景才使用 directConnection。
把连接串原样写进日志或监控上报会长期留存密码,输出前务必脱敏,这是很常见的信息泄露路径。
同一环境不要在不同应用里各自维护一套连接串:地址或参数变更时容易漏改,统一由配置中心下发能避免这类不一致。