在 Linux 服务器上配置多个 MongoDB 实例时,需重点关注以下关键事项,以确保稳定性、安全性和可维护性:
1. 端口与监听地址隔离
- 每个实例必须使用唯一端口(如
27017,27018,27019),避免冲突。 - 明确指定
bindIp(推荐仅绑定内网 IP 或127.0.0.1+ 防火墙规则),防止意外暴露到公网。net: port: 27017 bindIp: 127.0.0.1,192.168.1.100 # 根据实际需求调整
2. 数据目录与日志路径独立
- 为每个实例配置独立的:
dbPath(数据文件目录)logPath(日志文件)pidFilePath(进程 ID 文件)
示例配置(mongod.conf):
storage:
dbPath: /data/mongodb/instance1
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/instance1.log
processManagement:
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27017
bindIp: 127.0.0.1
security:
authorization: enabled
✅ 建议按命名规范组织目录:
/data/mongodb/replica1_primary,/data/mongodb/replica1_secondary等。
3. 配置文件管理策略
- 方案 A(推荐):每个实例一个独立配置文件(如
mongod-27017.conf),通过参数区分。 - 方案 B:使用命令行参数启动(适合临时测试,不推荐生产环境)。
mongod --config /etc/mongod/instance1.conf - 将配置文件放在
/etc/mongodb/或自定义目录,并设置合适权限(root:root,0640)。
4. 服务管理与自动启动
- 使用
systemd创建独立 unit 文件(如mongod@27017.service),实现:- 独立重启/停止
- 开机自启
- 日志集中管理(可通过
journalctl -u mongod@27017查看)
示例 /etc/systemd/system/mongod@.service:
[Unit]
Description=MongoDB Instance %i
After=network.target
[Service]
Type=forking
User=mongodb
Group=mongodb
PIDFile=/var/run/mongodb/%i.pid
ExecStart=/usr/bin/mongod --config /etc/mongodb/mongod-%i.conf
Restart=on-failure
[Install]
WantedBy=multi-user.target
启用实例:
sudo systemctl daemon-reload
sudo systemctl enable mongod@27017
sudo systemctl start mongod@27017
5. 安全加固
- 启用认证(
authorization: enabled),为每个实例配置独立用户/数据库角色。 - 限制
bindIp,配合ufw/firewalld仅开放必要端口。 - 定期轮换密钥(若使用 SCRAM-SHA-1/2 或 X.509 证书)。
- 关闭
mongosh的交互式历史功能(避免敏感信息泄露):setOption("historyEnabled", false)
6. 资源与性能调优
- 检查内存分配:确保
vm.max_map_count >= 262144(Linux 内核参数):sudo sysctl -w vm.max_map_count=262144 - 为不同实例设置合理
storage.wiredTiger.engineConfig.cacheSizeGB,避免争抢物理内存。 - 监控磁盘 I/O:多实例可能加剧 I/O 压力,考虑 SSD 或 RAID。
7. 备份与运维一致性
- 统一备份脚本逻辑(如
mongodump --port 27017 --authenticationDatabase admin ...)。 - 日志轮转配置(
logRotatein systemd 或使用logrotate工具)。 - 健康检查:编写脚本定期检测各实例状态(
mongosh --eval "db.adminCommand('ping')")。
常见陷阱提醒 ⚠️
| 问题 | 解决方案 |
|---|---|
| 端口冲突 | 启动前用 ss -tuln | grep :2701x 检查占用 |
| 权限错误 | 确保 mongodb 用户对 dbPath 和 logPath 有读写权限 |
| 时间同步异常 | 多实例间时间偏差 > 1s 可能导致复制集选举失败 → 部署 NTP/Chrony |
| 配置文件遗漏参数 | 使用 --dry-run 验证配置合法性:mongod --config /path/to/conf --dry-run |
如需构建副本集或分片集群,还需额外注意:
- 副本集成员名必须全局唯一(通常用
hostname:port形式) - 分片集群需单独配置
configsvr和shardsvr实例,且config数据库需持久化存储
需要我提供一份完整的 systemd 模板 + 初始化脚本示例吗?
云小栈