1. CentOS 7.9环境下MongoDB Replica Set集群搭建实战
最近在部署一套高可用文档数据库时,我选择了MongoDB的Replica Set架构。这种三节点配置不仅能提供数据冗余,还能实现读写分离和故障自动转移。相比单机部署,它能有效避免服务中断和数据丢失的风险。下面就以CentOS 7.9为例,分享完整搭建过程和踩坑经验。
生产环境强烈建议使用奇数个节点(至少3个),这是保证选举机制正常工作的关键。双节点配置在故障时可能出现"脑裂"情况。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 系统环境初始化
首先在三台CentOS 7.9服务器上执行基础环境配置(以节点1为例,其他节点同理):
bash复制# 关闭SELinux(需重启生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 关闭防火墙或放行27017端口
systemctl stop firewalld
systemctl disable firewalld
# 或者单独放行端口(推荐生产环境使用)
# firewall-cmd --zone=public --add-port=27017/tcp --permanent
# firewall-cmd --reload
# 设置主机名解析(三台机器都需要)
echo "192.168.1.101 mongo1" >> /etc/hosts
echo "192.168.1.102 mongo2" >> /etc/hosts
echo "192.168.1.103 mongo3" >> /etc/hosts
# 创建数据目录
mkdir -p /data/mongodb/{data,logs}
chown -R mongod:mongod /data/mongodb
2.2 MongoDB安装配置
使用官方仓库安装MongoDB 4.4版本(兼容CentOS 7.9的最新稳定版):
bash复制# 添加MongoDB仓库
cat > /etc/yum.repos.d/mongodb-org-4.4.repo <<EOF
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
EOF
# 安装MongoDB
yum install -y mongodb-org
# 创建配置文件(/etc/mongod.conf)
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/mongod.log
storage:
dbPath: /data/mongodb/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /var/run/mongodb/mongod.pid
net:
port: 27017
bindIp: 0.0.0.0
replication:
replSetName: rs0
特别注意:三台服务器的replSetName必须完全相同,这是集群识别的关键标识。
3. Replica Set集群初始化
3.1 启动服务并初始化集群
在三台服务器上分别启动mongod服务:
bash复制systemctl start mongod
systemctl enable mongod
在任意节点(如mongo1)执行初始化命令:
javascript复制// 连接到本地MongoDB
mongo
// 初始化Replica Set配置
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo1:27017", priority: 2 },
{ _id: 1, host: "mongo2:27017", priority: 1 },
{ _id: 2, host: "mongo3:27017", priority: 1, arbiterOnly: true }
]
})
这个配置中:
- mongo1被设置为priority:2的主节点(Primary)
- mongo2是常规从节点(Secondary)
- mongo3作为仲裁节点(Arbiter),不存储数据仅参与投票
3.2 验证集群状态
初始化完成后,执行以下命令检查集群状态:
javascript复制// 查看集群状态
rs.status()
// 查看节点角色
rs.isMaster()
// 查看复制集配置
rs.conf()
正常输出应显示三个节点的状态信息,其中"stateStr"字段会明确标识每个节点的角色(PRIMARY/SECONDARY/ARBITER)。
4. 高级配置与优化
4.1 读写分离配置
从节点默认不可读,需要显式设置:
javascript复制// 在SECONDARY节点上执行
mongo --host mongo2:27017
// 允许从节点读操作(默认只在主节点查询)
rs.slaveOk()
// 或更新语法(MongoDB 3.6+)
db.getMongo().setReadPref('secondaryPreferred')
4.2 数据同步监控
通过以下命令监控复制延迟:
javascript复制// 在主节点查看操作日志状态
db.printReplicationInfo()
// 在从节点查看同步状态
db.printSlaveReplicationInfo()
// 实时监控复制状态(需在admin库执行)
use admin
db.currentOp(true).inprog.forEach(function(op) {
if(op.secs_running > 5) printjson(op);
})
4.3 性能优化建议
-
内核参数调整:
bash复制# 增加文件描述符限制 echo "* soft nofile 64000" >> /etc/security/limits.conf echo "* hard nofile 64000" >> /etc/security/limits.conf # 调整透明大页设置 echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag -
MongoDB专用配置:
yaml复制# 在/etc/mongod.conf中添加 storage: wiredTiger: engineConfig: cacheSizeGB: 8 # 根据物理内存调整,建议不超过可用内存的60%
5. 常见问题排查手册
5.1 节点无法加入集群
现象:rs.status()显示节点状态为"STARTUP2"长时间不变化
排查步骤:
-
检查网络连通性:
bash复制
ping mongo1 telnet mongo1 27017 -
检查防火墙设置:
bash复制
iptables -L -n | grep 27017 -
查看MongoDB日志:
bash复制tail -f /data/mongodb/logs/mongod.log
解决方案:通常是由于网络隔离或防火墙阻止,确保三节点间的27017端口可互通。
5.2 主节点选举失败
现象:集群没有主节点,所有节点显示为SECONDARY
可能原因:
- 节点间时钟不同步(时间差超过15秒)
- 网络分区导致节点无法通信
- 配置中的priority值设置不当
解决方法:
bash复制# 确保NTP服务正常运行
yum install -y ntp
systemctl start ntpd
systemctl enable ntpd
ntpdate -u pool.ntp.org
5.3 数据同步延迟
现象:从节点数据明显落后于主节点
优化方案:
- 检查网络带宽
- 增加oplog大小(默认是磁盘空间的5%):
javascript复制use admin db.adminCommand({replSetResizeOplog: 1, size: 2048}) // 单位MB - 考虑使用hidden节点承担备份等重型读操作
6. 备份与恢复策略
6.1 热备份方案
使用mongodump进行在线备份:
bash复制# 从从节点备份(避免影响主节点性能)
mongodump --host mongo2:27017 --oplog --out /backup/mongodb/$(date +%Y%m%d)
6.2 时间点恢复
结合oplog实现精确恢复:
bash复制# 先恢复基础备份
mongorestore --host mongo1:27017 /backup/mongodb/20230101
# 然后应用oplog到指定时间点
mongorestore --host mongo1:27017 --oplogReplay \
--oplogLimit "1654039477:1" \
/backup/mongodb/20230101/oplog.bson
6.3 自动备份脚本示例
创建/etc/cron.daily/mongobackup:
bash复制#!/bin/bash
BACKUP_DIR=/backup/mongodb/$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
mongodump --host mongo2:27017 --oplog --out $BACKUP_DIR
find /backup/mongodb -type d -mtime +7 -exec rm -rf {} \;
7. 生产环境注意事项
-
硬件选型建议:
- 使用SSD存储,特别是对于oplog和journal文件
- 每个节点配置至少16GB内存(对于中型应用)
- 建议使用专用服务器,避免与其他服务共享资源
-
监控指标:
- 复制延迟时间(复制落后秒数)
- 节点状态(主/从/仲裁)
- 连接数和使用率
- 内存和磁盘使用情况
-
版本升级策略:
- 先升级从节点,最后升级主节点(通过stepDown命令)
- 每次升级前确保有完整备份
- 测试环境验证后再应用到生产
这套CentOS 7.9上的MongoDB Replica Set配置已经在我们的生产环境稳定运行两年多,经历过多次故障自动转移考验。最关键的经验是:定期验证备份有效性,监控复制延迟,以及确保网络质量。当需要扩展时,可以考虑添加更多从节点或配置分片集群。
