readPreference - MongoDB 副本集读偏好配置
概述
readPreference 用于控制 MongoDB 副本集中读操作的节点选择策略,支持副本集读写分离场景。通过配置 readPreference,可以降低主节点负载、实现全球分布式部署的低延迟读取。
适用场景:
- 副本集部署(Replica Set)
- 读写分离,降低主节点负载
- 全球分布式部署下的低延迟读取
- 可接受最终一致性的分析/报表查询
限制:
config.readPreference设置连接级默认读偏好。- 单次读操作可以在 options 中传入
readPreference覆盖默认值。 - 当前 monSQLize runtime 只支持 MongoDB;该选项对应 MongoDB driver 的读偏好行为。
- 读从节点可能有复制延迟,写后立即读建议使用
primary或primaryPreferred。 - MongoDB 事务内读操作应保持
primary;事务读建议使用连接默认值或显式覆盖为primary。 - 单机模式下只有一个节点,配置读偏好没有实际意义。
核心特性
✅ 5 种读偏好模式
连接级别全局配置
特点:
- 配置一次,所有查询生效
- 少数需要不同读路由的操作可用查询级 options 覆盖
- 默认路径更简单,减少重复配置
API 参数说明
连接配置
可选值:
'primary'- 仅读主节点(默认)'primaryPreferred'- 优先读主节点,主节点不可用时读从节点'secondary'- 仅读从节点'secondaryPreferred'- 优先读从节点,从节点不可用时读主节点'nearest'- 读最近的节点(低延迟)
使用示例
基本用法
示例 1: 默认读偏好(primary)
示例 2: secondaryPreferred(优先读从节点)
适用场景: 读多写少,降低主节点负载
示例 3: secondary(仅读从节点)
适用场景: 分析/报表查询,完全隔离主节点写负载
示例 4: primaryPreferred(优先读主节点)
适用场景: 需要强一致性,但希望主节点故障时有备用方案
示例 5: nearest(就近读取,低延迟)
适用场景: 全球分布式部署,就近读取降低延迟
高级用法
示例 6: 结合其他选项使用
最佳实践
推荐做法
-
读多写少场景使用 secondaryPreferred
-
强一致性场景使用 primary(默认)
-
全球分布式部署使用 nearest
-
分析/报表查询使用 secondary
注意事项
-
复制延迟问题
-
事务内读取
-
单机模式无效
-
副本集 URI 格式
-
跨数据库兼容性
性能影响
读偏好对性能的影响
性能优化建议
- 读多写少场景: 使用
secondaryPreferred将可容忍延迟的读取转移出主节点 - 全球分布式: 当低延迟比固定读主更重要时使用
nearest - 分析/报表: 使用
secondary完全隔离主节点写负载
常见问题
Q: readPreference 是否支持查询级别配置?
A: 支持。config.readPreference 是默认值,传递 MongoDB driver options 的读方法可以在单次操作中覆盖:
建议少量使用查询级覆盖。大多数读操作沿用连接级默认值,仅在写后立即读或分析查询需要不同读路由时覆盖。
Q: 如何验证 readPreference 生效?
A:
- 检查 MongoDB 日志/profile,确认读操作命中从节点
- 在从节点设置延迟,观察查询结果是否有滞后
- 使用
db.currentOp()查看活跃连接的读偏好
Q: 复制延迟多久?
A:
- 局域网副本集:通常 10-100ms
- 跨地域副本集:可能 100ms-1s
- 网络抖动时:可能 1s-5s
- 建议监控
rs.status()中的optimeDate差异
Q: 如何处理复制延迟问题?
A:
- 写入后立即读取: 使用
primary或primaryPreferred - 可接受延迟: 使用
secondaryPreferred或secondary - 混合策略: 关键查询用
primary,分析查询用secondary
Q: 单机模式下如何测试?
A:
单机模式下 readPreference 无效。建议:
- 使用 Docker Compose 搭建本地副本集
- 使用 MongoDB Atlas 免费集群(M0)
- 使用
mongodb-memory-server模拟副本集(需要配置)