|
|
MongoDB 副本集搭建与数据高可用配置
MongoDB 副本集是一组维护相同数据集的 mongod 实例,提供数据冗余和高可用性。以下是搭建 MongoDB 副本集的详细步骤:
1. 准备工作
硬件/环境要求
- 至少3个服务器节点(生产环境建议奇数个节点)
- 确保节点间网络互通
- 相同的 MongoDB 版本
节点规划示例
| 节点类型 | 主机名/IP | 端口 | 角色 |
|---------|----------|------|------|
| Primary | node1 | 27017 | 主节点 |
| Secondary | node2 | 27017 | 备节点 |
| Secondary/Arbiter | node3 | 27017 | 备节点或仲裁节点 |
2. 配置副本集
2.1 修改配置文件
在每个节点的文件中添加或修改以下配置:
- storage:
- dbPath: /var/lib/mongodb
- journal:
- enabled: true
- systemLog:
- destination: file
- path: /var/log/mongodb/mongod.log
- logAppend: true
- net:
- port: 27017
- bindIp: 0.0.0.0 # 或特定IP
- replication:
- replSetName: rs0 # 副本集名称,所有节点需相同
复制代码
2.2 启动 MongoDB 实例
- # 在每个节点上启动 mongod
- sudo systemctl start mongod
- # 或
- mongod --config /etc/mongod.conf
复制代码
3. 初始化副本集
3.1 连接到主节点
- mongo --host node1 --port 27017
复制代码
3.2 初始化副本集
- rs.initiate({
- _id: "rs0",
- members: [
- { _id: 0, host: "node1:27017" },
- { _id: 1, host: "node2:27017" },
- { _id: 2, host: "node3:27017" }
- ]
- })
复制代码
3.3 验证副本集状态
4. 配置高可用性
4.1 读写关注配置
- // 设置写关注为"majority",确保大多数节点确认写入
- use admin
- db.runCommand({setParameter: 1, w: "majority"})
- // 或者在应用连接字符串中指定
- // mongodb://host1,host2,host3/?replicaSet=rs0&w=majority
复制代码
4.2 选举配置
- 确保副本集有奇数个成员(3,5,7...)
- 考虑使用仲裁节点(Arbiter)作为第3个节点(不存储数据,只参与选举)
4.3 优先级配置
- // 设置节点优先级(0-1000),优先级高的节点更可能成为主节点
- cfg = rs.conf()
- cfg.members[0].priority = 2 // 节点1优先级更高
- cfg.members[1].priority = 1
- cfg.members[2].priority = 1
- rs.reconfig(cfg)
复制代码
5. 监控与维护
5.1 常用管理命令
- // 查看副本集状态
- rs.status()
- // 手动触发选举
- rs.stepDown()
- // 查看副本集配置
- rs.conf()
- // 重新配置副本集
- var cfg = rs.conf()
- // 修改配置...
- rs.reconfig(cfg)
复制代码
5.2 监控指标
- 复制延迟:
- rs.printSlaveReplicationInfo()
复制代码 - 选举状态
- 心跳信息
6. 故障转移测试
- 模拟主节点故障(停止主节点服务)
- 观察副本集自动选举新主节点
- 验证应用能否自动连接到新主节点
7. 最佳实践
- 节点分布:将副本集成员分布在不同的物理机、机架或可用区
- 磁盘配置:使用高性能SSD,确保足够的IOPS
- 网络配置:低延迟、高带宽的网络连接
- 备份策略:定期备份oplog和快照
- 安全配置:启用认证和加密
- 版本升级:滚动升级,保持版本一致
8. 仲裁节点(Arbiter)
如果资源有限,可以使用仲裁节点:
- 不存储数据,只参与选举
- 减少存储成本
- 配置方法:在初始化时添加
- { _id: 2, host: "arbiter:27017", arbiterOnly: true }
复制代码
通过以上配置,MongoDB 副本集能够提供自动故障转移、数据冗余和读取扩展能力,确保数据库的高可用性。 |
|