Linux上排查与修复 MongoDB 连接问题的实用步骤
一 快速自检
- 确认服务是否在运行:sudo systemctl status mongod;若未运行:sudo systemctl start mongod。
- 本地直连测试:mongo --host 127.0.0.1 --port 27017(或 mongosh)。
- 远程连通性测试:ping <服务器IP>;telnet 27017 或 nc -vz 27017。
- 查看服务日志定位错误:tail -n 100 /var/log/mongodb/mongod.log。
以上步骤能快速判断是服务未启动、网络不通还是配置问题。
二 配置与权限核查
- 配置文件 /etc/mongod.conf:
- net.bindIp:默认 127.0.0.1 仅本地;远程访问需改为 0.0.0.0(或指定内网网段/具体IP)。
- net.port:默认 27017。
- 修改后重启:sudo systemctl restart mongod。
- 启用认证时:security.authorization 设为 enabled;连接串需包含用户名、密码与鉴权库(常见为 admin),例如:mongo --host --port 27017 -u -p --authenticationDatabase admin。
- 连接字符串格式:mongodb://:@:/?authSource=。
- 云数据库场景:需在控制台正确设置白名单并使用对应私网/公网地址;账号密码含特殊字符(如 !@#$%^&*()_+=)需转义;副本集建议使用ConnectionStringURI以自动适配主从切换。
三 网络与防火墙
- 放行端口:
- Ubuntu:sudo ufw allow 27017/tcp
- CentOS:sudo firewall-cmd --add-port=27017/tcp --permanent && sudo firewall-cmd --reload
- 或放行 iptables:sudo iptables -A INPUT -p tcp --dport 27017 -j ACCEPT
- 云上实例:除本机防火墙外,还需在云厂商控制台放通客户端 IP/网段 到实例的白名单。
- 端口占用:lsof -i :27017 或 netstat -tulpen | grep 27017,必要时结束占用进程后重启 mongod。
四 常见报错与对应处理
- 服务未启动或端口被占用:检查状态与日志;若日志出现 “Address already in use”,释放 27017 或调整端口后重启。
- 连接被拒绝/超时:核对 bindIp 是否为 0.0.0.0(或正确网段)、端口是否一致、云实例白名单是否包含客户端 IP。
- 认证失败:确认用户名/密码正确,且连接串中 authSource 指向账号所在数据库(常见为 admin)。
- serverSelectionTimeout:常见于网络不通、地址/端口错误、白名单/安全组阻断、或实例负载/连接数满;逐项核查网络、地址、鉴权与实例负载。
- 副本集写入失败:单节点地址在主备切换后可能指向 Secondary;改用ConnectionStringURI或在故障恢复后重连。
五 一键排查清单与修复命令示例
- 服务与端口:
- sudo systemctl status mongod;sudo systemctl restart mongod
- ss -lntp | grep 27017 或 lsof -iUDP:27017
- 配置与权限:
- grep -E ‘bindIp|port|authorization’ /etc/mongod.conf
- 启用认证示例:security.authorization: enabled;连接示例:mongo --host -u -p --authenticationDatabase admin
- 防火墙与连通性:
- Ubuntu:sudo ufw allow 27017/tcp;CentOS:sudo firewall-cmd --add-port=27017/tcp --permanent && sudo firewall-cmd --reload
- ping ;nc -vz 27017
- 日志与数据目录:
- tail -f /var/log/mongodb/mongod.log
- ls -ld /var/lib/mongodb /var/log/mongodb;必要时 chown -R mongodb:mongodb /var/lib/mongodb
- 云数据库:核对白名单、私网/公网地址、账号密码特殊字符转义、使用ConnectionStringURI。