温馨提示×

MongoDB故障排查在CentOS上怎么办

小樊
35
2025-12-29 05:10:28
栏目: 云计算

CentOS上MongoDB故障排查实操指南

一 快速定位与恢复

  • 检查服务状态与启动项:使用命令查看是否运行、是否开机自启,必要时启动服务。命令示例:sudo systemctl status mongodsudo systemctl start mongodsudo systemctl enable mongod
  • 查看关键日志:MongoDB 日志默认在 /var/log/mongodb/mongod.log,可实时跟踪:sudo tail -f /var/log/mongodb/mongod.log;同时查看 systemd 日志:journalctl -xe | grep mongod
  • 校验配置文件:主配置文件为 /etc/mongod.conf,重点核对 dbPath(数据目录)、logPath(日志路径)、net.port(默认 27017)、net.bindIp(绑定地址)、以及 security.authorization(是否开启鉴权)。
  • 端口与进程:确认 27017 是否被占用并定位进程:sudo lsof -iTCP -sTCP:LISTEN -n -P | grep 27017netstat -tuln | grep 27017;必要时结束冲突进程:kill -9 <PID>
  • 资源与权限:检查磁盘空间 df -h(建议保留至少 20% 余量)、内存与 CPU top/htop;确保数据目录(如 /var/lib/mongo)与日志目录(如 /var/log/mongodb)属主为 mongodsudo chown -R mongod:mongod /var/lib/mongo /var/log/mongodb
  • 快速恢复循环:定位根因后修正配置或释放资源,执行 sudo systemctl restart mongod 并再次观察日志输出。

二 常见故障场景与处理

  • 服务无法启动:优先查看 mongod.logjournalctl 的错误行;常见根因包括配置文件 YAML 语法错误dbPath 不存在或无权限端口被占用。修正后重启服务。
  • 端口冲突:若日志出现 “Address already in use”,用 lsofnetstat 找到占用 27017 的进程并释放,或调整 net.port
  • 连接被拒绝或仅本地可连:默认 bindIp: 127.0.0.1 仅监听本机,远程访问需改为 bindIp: 0.0.0.0(或指定服务器 IP),并重启:sudo systemctl restart mongod
  • 防火墙阻断:开放 27017/tcp 并重载规则:sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent && sudo firewall-cmd --reload
  • SELinux 限制:若 sestatusEnforcing 导致访问被拒,可临时测试 sudo setenforce 0;确认是 SELinux 问题后,为数据/日志目录设置类型:sudo chcon -Rv --type=mongod_var_lib_t /var/lib/mongosudo chcon -Rv --type=mongod_log_t /var/log/mongodb,或按需调整策略(不建议生产直接永久禁用 SELinux)。
  • 认证失败:若启用 security.authorization: enabled,连接需提供用户名、密码与认证库:mongo --host <IP> --port 27017 -u <user> -p <pwd> --authenticationDatabase admin

三 性能与健康诊断

  • 实时监控:使用 mongostat 观察插入/查询速率、连接数、内存与页面错误;使用 mongotop 查看各集合读写耗时,定位慢集合与热点操作。
  • 深入状态:在 mongo shell 执行 db.serverStatus() 获取实例级指标(锁、内存、连接、断言等),用于容量与瓶颈分析。
  • 日志分析:用 grep 'error' /var/log/mongodb/mongod.log 快速筛错;结合 awk/sed 做字段筛选;统计高频错误:grep 'error' mongod.log | sort | uniq -c | sort -rn;用 journalctl -u mongod -n 50 查看最近系统日志;借助 mtools(如 mlogfiltermplotqueries)做慢查询与可视化分析。

四 安全加固与版本维护

  • 最小暴露面:仅开放必要端口(如 27017/tcp),避免使用 bindIp: 0.0.0.0 暴露到公网;结合 firewalld 精准放行来源网段。
  • 启用鉴权:在 /etc/mongod.conf 设置 security.authorization: enabled,为应用创建最小权限用户(如 readWrite 到目标库),连接时显式指定 --authenticationDatabase
  • 审计与合规:按需开启日志组件、慢查询日志与审计(企业版),并定期轮转日志(如 logrotate)避免磁盘被占满。
  • 依赖与版本:确认 libssl 等依赖完整(如 sudo yum install openssl-devel),并优先使用 最新稳定版;升级前务必全量备份(文件系统快照或 mongodump)。

五 排错清单模板

检查项 命令示例 判定要点 处理建议
服务状态 systemctl status mongod 是否 active(running) 未运行则 start 并查看日志
错误日志 tail -f /var/log/mongodb/mongod.log 是否报配置、权限、端口等错 按报错行修复并重启
配置语法 mongod --config /etc/mongod.conf --fork(仅校验) 是否提示 YAML/路径错误 修正后重启
端口占用 `lsof -iTCP -sTCP:LISTEN -n -P grep 27017` 是否被非 mongod 占用
资源与权限 df -htopchown -R mongod:mongod /var/lib/mongo /var/log/mongodb 磁盘是否不足、目录属主是否正确 清理或调整属主
远程连通 firewall-cmd --query-port=27017/tcptelnet <IP> 27017 端口是否放行、端口是否可达 放行并重载防火墙
SELinux sestatussetenforce 0chcon 是否为 Enforcing 且拦截 设置正确类型或策略
认证 mongo -u <u> -p <p> --authenticationDatabase admin 是否鉴权失败 核对用户、密码与库

0