MongoDB副本集高可用:构建企业级数据库集群
写在前面:高可用是生产环境数据库的核心要求,MongoDB通过副本集(Replica Set)实现数据冗余和故障自动转移。本篇将详细介绍MongoDB副本集的原理、配置和管理,带您构建高可用的数据库集群。
文章目录
- 一、副本集基础概念
- 1.1 什么是副本集?
- 1.2 副本集工作原理
- 1.3 副本集成员类型
- 二、部署副本集
- 2.1 准备环境
- 2.2 初始化副本集
- 2.3 添加仲裁节点
- 三、副本集配置
- 3.1 配置文件
- 3.2 副本集选项
- 3.3 修改副本集配置
- 四、读写分离
- 4.1 Read Preference
- 4.2 配置读写分离
- 4.3 写入主节点
- 五、故障转移
- 5.1 主节点故障
- 5.2 手动故障转移
- 5.3 故障恢复
- 六、数据同步
- 6.1 Oplog
- 6.2 同步类型
- 6.3 同步问题处理
- 七、备份与恢复
- 7.1 副本集备份
- 7.2 恢复数据
- 八、监控与维护
- 8.1 监控指标
- 8.2 连接字符串示例
- 九、生产环境最佳实践
- 9.1 架构建议
- 9.2 配置建议
- 9.3 常见问题
- 十、总结
一、副本集基础概念
1.1 什么是副本集?
📚 副本集概念: 副本集是MongoDB的高可用解决方案, 由多个MongoDB实例组成: - 1个主节点(Primary) - 多个从节点(Secondary) - 可选1个仲裁节点(Arbiter) 特点: ✅ 数据自动同步 ✅ 故障自动切换 ✅ 读写分离支持 ✅ 数据冗余备份1.2 副本集工作原理
🔄 副本集架构: ┌─────────────┐ │ Application│ │ Driver │ └──────┬──────┘ │ ┌─────────────────┼─────────────────┐ │ │ │ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Primary │ │Secondary │ │Secondary │ │ 主节点 │ ────▶│ 从节点1 │ ────▶│ 从节点2 │ │ (读写) │ │ (只读) │ │ (只读) │ └──────────┘ └──────────┘ └──────────┘ │ ▼ ┌──────────┐ │ Oplog │ │ 操作日志 │ └──────────┘ 数据同步流程: 1. 客户端写入Primary 2. Primary记录Oplog 3. Secondary拉取Oplog 4. Secondary重放操作1.3 副本集成员类型
| 成员类型 | 作用 | 投票权 | 数据 |
|---|---|---|---|
| Primary | 主节点,处理所有写操作 | ✓ | 完整数据 |
| Secondary | 从节点,复制主节点数据 | ✓ | 完整数据 |
| Arbiter | 仲裁节点,只参与选举 | ✓ | 无数据 |
二、部署副本集
2.1 准备环境
# 假设有3台服务器# 192.168.1.10 (Primary)# 192.168.1.11 (Secondary)# 192.168.1.12 (Secondary)# 每台服务器安装MongoDB# 参考前文安装教程2.2 初始化副本集
// 连接到Primary节点mongosh--host192.168.1.10// 初始化副本集rs.initiate({_id:"myReplSet",members:[{_id:0,host:"192.168.1.10:27017"},{_id:1,host:"192.168.1.11:27017"},{_id:2,host:"192.168.1.12:27017"}]})// 查看副本集状态rs.status()2.3 添加仲裁节点
// 如果是3节点副本集,通常不需要仲裁// 如果是2节点,可以添加仲裁节点// 添加仲裁节点rs.addArb("192.168.1.13:27017")// 或者在初始化时添加rs.initiate({_id:"myReplSet",members:[{_id:0,host:"192.168.1.10:27017"},{_id:1,host:"192.168.1.11:27017"},{