readPreference - MongoDB 副本集读偏好配置
📑 目录
概述
readPreference 用于控制 MongoDB 副本集中读操作的节点选择策略,支持副本集读写分离场景。通过配置 readPreference,可以降低主节点负载、实现全球分布式部署的低延迟读取。
适用场景:
- ✅ 副本集部署(Replica Set)
- ✅ 读写分离(降低主节点负载)
- ✅ 全球分布式部署(低延迟读取)
- ✅ 分析/报表查询(隔离主节点写负载)
限制:
- ⚠️ 仅全局配置(连接级别),不支持查询级别覆盖
- ⚠️ MongoDB 专属特性(PostgreSQL/MySQL 无对应概念)
- ⚠️ 读从节点可能有复制延迟(数据不是最新的)
- ⚠️ 单机模式下无效(需要副本集环境)
核心特性
✅ 5 种读偏好模式
✅ 连接级别全局配置
特点:
- 配置一次,所有查询生效
- 无需在每个查询方法中重复配置
- 简化代码,降低出错概率
API 参数说明
连接配置
可选值:
'primary'- 仅读主节点(默认)'primaryPreferred'- 优先读主节点,主节点不可用时读从节点'secondary'- 仅读从节点'secondaryPreferred'- 优先读从节点,从节点不可用时读主节点'nearest'- 读最近的节点(低延迟)
使用示例
基本用法
示例 1: 默认读偏好(primary)
示例 2: secondaryPreferred(优先读从节点)
适用场景: 读多写少,降低主节点负载
示例 3: secondary(仅读从节点)
适用场景: 分析/报表查询,完全隔离主节点写负载
示例 4: primaryPreferred(优先读主节点)
适用场景: 需要强一致性,但希望主节点故障时有备用方案
示例 5: nearest(就近读取,低延迟)
适用场景: 全球分布式部署,就近读取降低延迟
高级用法
示例 6: 结合其他选项使用
最佳实践
✅ 推荐做法
-
读多写少场景使用 secondaryPreferred
-
强一致性场景使用 primary(默认)
-
全球分布式部署使用 nearest
-
分析/报表查询使用 secondary
⚠️ 注意事项
-
复制延迟问题
-
单机模式无效
-
副本集 URI 格式
-
跨数据库兼容性
性能影响
读偏好对性能的影响
性能优化建议
- 读多写少场景: 使用
secondaryPreferred降低主节点负载 20-50% - 全球分布式: 使用
nearest降低延迟 30-70%(根据地理位置) - 分析/报表: 使用
secondary完全隔离主节点写负载
常见问题
Q: readPreference 是否支持查询级别配置?
A: 不支持。monSQLize 仅支持连接级别全局配置,简化 API 并降低配置复杂度。如需查询级别控制,可使用原生 MongoDB 驱动。
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模拟副本集(需要配置)