加油
努力

在Linux服务器上配置多个MongoDB实例需要注意什么?

在 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 ...)。
  • 日志轮转配置(logRotate in systemd 或使用 logrotate 工具)。
  • 健康检查:编写脚本定期检测各实例状态(mongosh --eval "db.adminCommand('ping')")。

常见陷阱提醒 ⚠️

问题 解决方案
端口冲突 启动前用 ss -tuln | grep :2701x 检查占用
权限错误 确保 mongodb 用户对 dbPathlogPath 有读写权限
时间同步异常 多实例间时间偏差 > 1s 可能导致复制集选举失败 → 部署 NTP/Chrony
配置文件遗漏参数 使用 --dry-run 验证配置合法性:
mongod --config /path/to/conf --dry-run

如需构建副本集或分片集群,还需额外注意:

  • 副本集成员名必须全局唯一(通常用 hostname:port 形式)
  • 分片集群需单独配置 configsvrshardsvr 实例,且 config 数据库需持久化存储

需要我提供一份完整的 systemd 模板 + 初始化脚本示例吗?

云服务器