一、引言为什么选择三节点复制集MongoDB三节点复制集是企业级部署的最小高可用配置提供以下关键价值自动故障转移主节点故障时10-30秒内自动切换数据冗余数据自动复制到所有节点读扩展性从节点可处理读请求灾难恢复保障业务连续性成本效益平衡高可用性与资源消耗关键洞察三节点复制集1 Primary 2 Secondary是避免脑裂问题的最小配置比两节点方案更可靠比五节点方案更经济。二、环境准备2.1 硬件要求组件最低配置推荐配置CPU2核4核内存4GB8GB存储50GB200GB网络1Gbps1Gbps注意事项三台服务器应有相同规格避免性能瓶颈存储应使用SSDHDD仅适用于测试环境网络延迟应** 5ms**同机房部署2.2 软件环境组件版本说明操作系统CentOS 7.9 / Ubuntu 20.04保持一致MongoDB6.0稳定版本防火墙开放27017端口节点间通信SELinux/AppArmor禁用或配置避免权限问题2.3 网络规划节点主机名IP地址角色节点1mongo1192.168.1.10Primary节点2mongo2192.168.1.11Secondary节点3mongo3192.168.1.12Secondary关键配置所有节点需在/etc/hosts中配置相互解析禁用IPv6避免连接问题配置NTP时间同步2.3.1 hosts文件配置所有节点# 编辑hosts文件sudovi/etc/hosts# 添加以下内容192.168.1.10 mongo1192.168.1.11 mongo2192.168.1.12 mongo32.3.2 时间同步配置# 安装NTP服务sudoyuminstall-yntp# CentOSsudoapt-getinstall-yntp# Ubuntu# 启动并设置开机启动sudosystemctlenablentpdsudosystemctl start ntpd# 检查同步状态ntpq-p三、MongoDB安装3.1 添加MongoDB仓库3.1.1 CentOS# 创建MongoDB仓库文件sudovi/etc/yum.repos.d/mongodb-org-6.0.repo# 添加以下内容[mongodb-org-6.0]nameMongoDB Repositorybaseurlhttps://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/gpgcheck1enabled1gpgkeyhttps://www.mongodb.org/static/pgp/server-6.0.asc3.1.2 Ubuntu# 导入GPG密钥wget-qO- https://www.mongodb.org/static/pgp/server-6.0.asc|sudoapt-keyadd-# 添加仓库echodeb [ archamd64,arm64 ] https://repo.mongodb.org/apt/ubuntu$(lsb_release-cs)/mongodb-org/6.0 multiverse|sudotee/etc/apt/sources.list.d/mongodb-org-6.0.list# 更新包列表sudoaptupdate3.2 安装MongoDB3.2.1 CentOSsudoyuminstall-ymongodb-org3.2.2 Ubuntusudoaptinstall-ymongodb-org3.3 验证安装# 检查MongoDB版本mongod--version# 输出应包含# db version v6.0.x# git version: ...四、配置复制集4.1 创建数据目录所有节点执行sudomkdir-p/var/lib/mongodbsudomkdir-p/var/log/mongodbsudochown-Rmongod:mongod /var/lib/mongodb /var/log/mongodb4.2 配置文件设置所有节点执行sudovi/etc/mongod.conf配置内容# 网络配置net:port:27017bindIp:0.0.0.0# 允许所有IP连接生产环境应限制IP# 存储配置storage:dbPath:/var/lib/mongodbjournal:enabled:true# 复制集配置replication:replSetName:rs0# 复制集名称所有节点必须相同# 安全配置security:authorization:disabled# 生产环境应启用# 服务配置processManagement:timeZoneInfo:/usr/share/zoneinfo关键说明replSetName必须在所有节点配置相同bindIp测试环境可设为0.0.0.0生产环境应限制authorization生产环境应启用此处为简化步骤4.3 防火墙配置所有节点执行# CentOSsudofirewall-cmd--zonepublic --add-port27017/tcp--permanentsudofirewall-cmd--reload# Ubuntusudoufw allow27017/tcp五、启动服务并初始化复制集5.1 启动MongoDB服务所有节点执行sudosystemctlenablemongodsudosystemctl start mongod验证服务状态sudosystemctl status mongod5.2 初始化复制集5.2.1 连接Primary节点mongo--hostmongo15.2.2 初始化复制集配置// 创建复制集配置cfg{_id:rs0,members:[{_id:0,host:mongo1:27017},{_id:1,host:mongo2:27017},{_id:2,host:mongo3:27017}]};// 初始化复制集rs.initiate(cfg);// 检查状态rs.status();预期输出{ set : rs0, date : ISODate(...), myState : 1, members : [ { _id : 0, name : mongo1:27017, state : 1, stateStr : PRIMARY, ... }, { _id : 1, name : mongo2:27017, state : 2, stateStr : SECONDARY, ... }, { _id : 2, name : mongo3:27017, state : 2, stateStr : SECONDARY, ... } ], ... }5.3 验证数据同步5.3.1 写入测试数据// 连接Primarymongo--host mongo1// 写入数据use test db.test.insertOne({name:MongoDB,version:6.0})5.3.2 验证同步// 连接Secondarymongo--host mongo2// 检查数据use test db.test.find()预期输出{_id:ObjectId(...),name:MongoDB,version:6.0}六、基础运维操作6.1 检查复制集状态rs.status()关键字段解读stateStr节点状态PRIMARY/SECONDARYoptime最新操作时间syncSourceHost同步源节点health节点健康状态1健康6.2 读写偏好配置6.2.1 从Secondary读取// 连接时指定mongo--hostmongo2,mongo3--readPreferencesecondary// 应用代码中constclientnewMongoClient(mongodb://mongo2,mongo3,{readPreference:secondary});6.2.2 强制Primary读取// 连接时指定mongo--hostmongo1,mongo2,mongo3--readPreferenceprimary// 应用代码中constclientnewMongoClient(mongodb://mongo1,mongo2,mongo3,{readPreference:primary});6.3 手动主从切换6.3.1 降级Primary// 在Primary执行rs.stepDown(60,15)60降级持续时间秒15等待Secondary追赶时间秒6.3.2 验证切换// 检查状态rs.status()预期结果原Primary变为SECONDARY其他节点中一个变为PRIMARY6.4 添加/移除节点6.4.1 添加新节点// 连接Primaryrs.add(mongo4:27017)6.4.2 移除节点// 连接Primaryrs.remove(mongo3:27017)七、监控与故障排查7.1 关键监控指标指标监控命令健康阈值告警阈值节点状态rs.status()PRIMARY/SECONDARYDOWN/UNKNOWN复制延迟rs.printSlaveReplicationInfo() 30秒 60秒Oplog状态rs.printReplicationInfo() 20%剩余 10%剩余网络延迟db.adminCommand({ping: 1}) 5ms 100ms选举次数日志分析每日1次每日5次7.2 监控脚本示例functionmonitorReplicaSet(){conststatusrs.status();constprimarystatus.members.find(mm.state1);// 检查异常状态status.members.forEach(member{if(member.state0||member.state3||member.state4){console.log(CRITICAL: Node${member.name}in abnormal state (${member.stateStr}));}});// 检查复制延迟status.members.forEach(member{if(member.state2){constlagprimary.optimeDate-member.optimeDate;if(lag60000){console.log(WARNING: High replication lag on${member.name}(${lag}ms));}}});}// 定时执行setInterval(monitorReplicaSet,60000);// 每分钟7.3 常见问题排查7.3.1 节点状态为DOWN原因网络不通服务未启动防火墙限制解决方案# 检查网络连通性pingmongo2# 检查服务状态systemctl status mongod# 检查防火墙firewall-cmd --list-all|grep270177.3.2 复制延迟过高原因网络带宽不足Secondary资源不足大量写操作解决方案// 检查复制延迟rs.printSlaveReplicationInfo()// 检查Oplog大小rs.printReplicationInfo()// 增加Oplog大小需重启db.adminCommand({replSetResizeOplog:1,size:4096})// 4GB7.3.3 选举失败原因无法形成大多数网络分区配置不一致解决方案// 检查复制集配置rs.conf()// 检查节点状态rs.status().members.forEach(m{console.log(Node:${m.name}, State:${m.stateStr});});// 重新配置复制集cfgrs.conf();// 修改配置rs.reconfig(cfg);八、生产环境最佳实践8.1 安全配置8.1.1 启用认证# 修改/etc/mongod.confsecurity:authorization:enabled8.1.2 创建管理员用户// 连接Primarymongo--host mongo1// 创建管理员用户use admin db.createUser({user:admin,pwd:password,roles:[root]});8.1.3 配置TLS/SSLnet:tls:mode:requireTLScertificateKeyFile:/etc/ssl/mongodb.pem8.2 备份策略8.2.1 逻辑备份# 备份所有数据库mongodump--urimongodb://admin:passwordmongo1:27017--out/backup/$(date%Y%m%d)8.2.2 物理备份# 停止MongoDBsudosystemctl stop mongod# 备份数据目录tar-czvf/backup/mongodb-data-$(date%Y%m%d).tar.gz /var/lib/mongodb# 重启MongoDBsudosystemctl start mongod8.3 定期维护操作频率说明Oplog大小检查每周确保足够空间备份验证每月恢复测试滚动升级每季度无停机升级故障演练每半年验证恢复能力九、案例模拟故障转移9.1 模拟Primary故障# 停止Primary节点sudosystemctl stop mongod9.2 监控自动故障转移// 在Secondary节点执行rs.status().members.forEach(m{console.log(Node:${m.name}, State:${m.stateStr});});预期输出Node: mongo1:27017, State: DOWN Node: mongo2:27017, State: PRIMARY Node: mongo3:27017, State: SECONDARY9.3 验证服务连续性# 从应用连接 mongo--host mongo2--evaldb.test.find()# 预期输出{_id:ObjectId(...),name:MongoDB,version:6.0}十、总结三节点复制集的实施要点10.1 成功实施的关键因素因素说明重要性奇数节点3、5、7节点配置★★★★★网络配置稳定的低延迟网络★★★★☆Oplog大小保证足够空间★★★★☆监控体系实时监控关键指标★★★★☆定期演练模拟故障转移★★★★☆10.2 实施路线图阶段目标操作评估确认需求分析业务SLA要求规划设计架构确定节点数量和拓扑实施部署集群按本指南步骤执行验证测试功能模拟故障转移监控持续跟踪设置告警阈值优化持续改进根据业务增长调整10.3 最终建议从简单开始先部署最小可行方案文档化一切记录所有配置和操作先测试后生产在非生产环境验证安全优先启用认证和加密持续学习关注MongoDB新特性关键结论三节点MongoDB复制集是企业级高可用数据库的基础。通过本指南的详细步骤您可以快速部署一个可靠的复制集集群为业务提供坚实的数据保障。记住高可用性不是一次性的配置任务而是一个持续优化的过程。定期监控、测试和优化您的复制集确保它始终符合业务需求。下一步行动在测试环境部署三节点集群执行故障转移演练实施监控告警系统制定定期维护计划通过这些步骤您将拥有一个稳定、可靠、高性能的MongoDB复制集。