CentOS7 系统下 MongoDB 生产环境部署与安全加固实战
1. 生产环境部署前的准备工作在CentOS7上部署MongoDB生产环境首先要做好基础环境配置。我建议使用物理服务器或云主机配置至少4核CPU、8GB内存和100GB存储空间。内存大小直接影响MongoDB的性能表现特别是当数据量较大时。记得去年有个项目因为初期内存配置不足导致查询性能严重下降后来升级配置才解决问题。操作系统建议使用CentOS7.6以上版本这个版本长期支持且稳定性较好。部署前需要确认系统基础依赖# 检查系统版本 cat /etc/redhat-release # 更新系统 yum update -y安装必要的工具链yum install -y wget curl tar libcurl openssl对于生产环境我强烈建议单独划分数据盘。通过fdisk -l查看磁盘情况使用LVM管理磁盘空间会更灵活。数据目录不要放在根分区避免系统盘空间不足影响数据库运行。这是我踩过的坑 - 曾经因为日志文件把根分区占满导致数据库崩溃。2. MongoDB安装与配置优化2.1 版本选择与安装生产环境建议使用MongoDB的稳定版本。截至2023年4.4版本是长期支持版(LTS)5.0版本则提供了更多新特性。我一般会去官网获取最新的下载链接wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.9.tgz解压安装时要注意目录权限问题。我习惯将MongoDB安装在/opt目录下tar -zxvf mongodb-linux-x86_64-rhel70-5.0.9.tgz mv mongodb-linux-x86_64-rhel70-5.0.9 /opt/mongodb2.2 配置文件详解生产环境的配置文件需要精心设计。这是我的常用配置模板# /opt/mongodb/mongod.conf systemLog: destination: file logAppend: true path: /data/mongodb/log/mongod.log storage: dbPath: /data/mongodb/db journal: enabled: true wiredTiger: engineConfig: cacheSizeGB: 4 # 根据内存调整 net: port: 27017 bindIp: 0.0.0.0 security: authorization: enabled processManagement: fork: true pidFilePath: /var/run/mongodb/mongod.pid关键参数说明cacheSizeGBWT引擎缓存大小建议是可用内存的50-60%journal启用日志确保数据安全authorization必须开启认证2.3 目录结构与权限正确的目录结构能避免很多问题mkdir -p /data/mongodb/{db,log} chown -R mongodb:mongodb /data/mongodb chmod 750 /data/mongodb建议创建专用用户运行MongoDBgroupadd mongodb useradd -g mongodb mongodb3. 安全加固实战3.1 网络层防护首先配置防火墙firewall-cmd --permanent --add-port27017/tcp firewall-cmd --reload对于生产环境我建议限制访问IPfirewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.1.0/24 port protocoltcp port27017 accept3.2 用户与权限管理MongoDB的权限系统很灵活。先创建管理员账号use admin db.createUser({ user: admin, pwd: ComplexPssw0rd, roles: [root] })为每个业务创建独立用户use appdb db.createUser({ user: appuser, pwd: AppPss123, roles: [readWrite] })3.3 加密与审计启用TLS加密通信net: tls: mode: requireTLS certificateKeyFile: /etc/ssl/mongodb.pem配置审计日志auditLog: destination: file format: JSON path: /data/mongodb/audit.json4. 系统集成与服务管理4.1 Systemd服务配置创建服务文件/etc/systemd/system/mongod.service[Unit] DescriptionMongoDB Database Server Afternetwork.target [Service] Usermongodb Groupmongodb ExecStart/opt/mongodb/bin/mongod --config /opt/mongodb/mongod.conf ExecStop/opt/mongodb/bin/mongod --shutdown --config /opt/mongodb/mongod.conf Restartalways [Install] WantedBymulti-user.target启用服务systemctl daemon-reload systemctl enable --now mongod4.2 监控与维护配置基本的监控# 检查服务状态 systemctl status mongod # 查看日志 tail -f /data/mongodb/log/mongod.log设置日志轮转# /etc/logrotate.d/mongodb /data/mongodb/log/mongod.log { daily rotate 30 compress delaycompress missingok notifempty sharedscripts postrotate killall -SIGUSR1 mongod endscript }5. 性能调优实战5.1 内存优化WiredTiger引擎的内存配置很关键。在配置文件中调整storage: wiredTiger: engineConfig: cacheSizeGB: 6 # 8GB内存的服务器可设置为4-6GB5.2 查询优化建立合适的索引db.orders.createIndex({ customerId: 1, orderDate: -1 })使用explain分析查询db.orders.find({ status: shipped }).explain(executionStats)5.3 连接池配置调整连接池大小net: maxIncomingConnections: 500在应用端也要配置合适的连接池避免连接数过多。6. 备份与灾难恢复6.1 定期备份策略使用mongodump进行逻辑备份mongodump --urimongodb://admin:ComplexPssw0rdlocalhost:27017 --gzip --archive/backup/mongodb-$(date %Y%m%d).gz配置cron定时任务0 2 * * * /usr/bin/mongodump --urimongodb://admin:ComplexPssw0rdlocalhost:27017 --gzip --archive/backup/mongodb-$(date \%Y\%m\%d).gz6.2 恢复测试定期测试备份文件可恢复性mongorestore --urimongodb://admin:ComplexPssw0rdlocalhost:27017 --gzip --archive/backup/mongodb-20230801.gz6.3 副本集配置生产环境强烈建议配置副本集rs.initiate({ _id: rs0, members: [ { _id: 0, host: mongo1:27017 }, { _id: 1, host: mongo2:27017 }, { _id: 2, host: mongo3:27017, arbiterOnly: true } ] })7. 常见问题排查7.1 连接问题排查检查端口监听netstat -tulnp | grep 27017验证防火墙规则firewall-cmd --list-all7.2 性能问题分析使用mongostat实时监控mongostat --urimongodb://admin:ComplexPssw0rdlocalhost:27017分析慢查询db.setProfilingLevel(1, 50) # 记录超过50ms的查询 db.system.profile.find().sort({ ts: -1 }).limit(10)7.3 存储引擎问题检查存储引擎状态db.serverStatus().storageEngine监控存储使用情况df -h /data du -sh /data/mongodb/db