MongoDB单机与集群部署全攻略:从单机到副本集实践指南

一、MongoDB单机部署:快速入门与核心配置

1.1 单机部署适用场景

MongoDB单机部署适用于开发测试环境、小型应用或对数据高可用性要求不高的场景。其优势在于部署简单、资源占用低,但存在单点故障风险。典型场景包括:

  • 本地开发环境快速搭建
  • 初创公司验证业务逻辑
  • 非关键数据存储(如日志、临时数据)

1.2 单机部署详细步骤

环境准备

  • 操作系统:推荐CentOS 7/8或Ubuntu 20.04 LTS
  • 硬件配置:最低2核4GB内存,建议4核8GB以上
  • 软件依赖:wgetlibcurl4openssl等基础库

安装流程

  1. # 添加MongoDB官方仓库(以Ubuntu为例)
  2. wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
  3. echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
  4. sudo apt-get update
  5. sudo apt-get install -y mongodb-org
  6. # 启动服务
  7. sudo systemctl enable mongod
  8. sudo systemctl start mongod

核心配置优化

修改/etc/mongod.conf文件关键参数:

  1. storage:
  2. dbPath: /var/lib/mongodb
  3. journal:
  4. enabled: true
  5. wiredTiger:
  6. engineConfig:
  7. cacheSizeGB: 2 # 根据内存调整
  8. net:
  9. bindIp: 0.0.0.0 # 允许远程连接(生产环境建议限制IP)
  10. port: 27017
  11. security:
  12. authorization: enabled # 启用认证

1.3 单机部署常见问题

  • 端口冲突:检查27017端口是否被占用
  • 数据目录权限:确保mongod用户对/var/lib/mongodb有读写权限
  • 性能瓶颈:通过mongostat监控,发现QPS过高时考虑升级硬件

二、MongoDB集群部署:副本集架构解析

2.1 副本集核心价值

MongoDB副本集通过主从复制实现:

  • 高可用性:主节点故障时自动选举新主节点
  • 数据冗余:数据在多个节点同步
  • 读写分离:可配置从节点承担读请求

2.2 单机副本集部署方案

适用场景

  • 开发环境模拟生产集群
  • 资源有限但需要高可用验证
  • 边缘计算节点部署

部署步骤

2.2.1 创建数据目录

  1. mkdir -p /data/db{1,2,3}
  2. chmod -R 0755 /data/db*

2.2.2 启动三个MongoDB实例

  1. # 节点1(主节点)
  2. mongod --replSet rs0 --dbpath /data/db1 --port 27017 --fork --logpath /var/log/mongodb/mongod1.log
  3. # 节点2(从节点)
  4. mongod --replSet rs0 --dbpath /data/db2 --port 27018 --fork --logpath /var/log/mongodb/mongod2.log
  5. # 节点3(仲裁节点)
  6. mongod --replSet rs0 --dbpath /data/db3 --port 27019 --fork --logpath /var/log/mongodb/mongod3.log

2.2.3 初始化副本集

  1. // 连接任意节点
  2. mongo --port 27017
  3. // 初始化配置
  4. rs.initiate({
  5. _id: "rs0",
  6. members: [
  7. { _id: 0, host: "localhost:27017" },
  8. { _id: 1, host: "localhost:27018" },
  9. { _id: 2, host: "localhost:27019", arbiterOnly: true }
  10. ]
  11. })

2.2.4 验证副本集状态

  1. rs.status()
  2. // 正常应显示PRIMARY、SECONDARY、ARBITER各一个

2.3 副本集高级配置

读写分离配置

  1. // 设置从节点可读(默认仅主节点可写)
  2. cfg = rs.conf()
  3. cfg.settings = { getLastErrorDefaults: { w: "majority", wtimeout: 5000 } }
  4. rs.reconfig(cfg)
  5. // 客户端连接时指定readPreference
  6. // 例如Python驱动
  7. from pymongo import MongoClient, ReadPreference
  8. client = MongoClient("mongodb://localhost:27017",
  9. read_preference=ReadPreference.SECONDARY_PREFERRED)

故障自动转移测试

  1. # 模拟主节点宕机
  2. kill $(ps aux | grep '27017' | grep -v grep | awk '{print $2}')
  3. # 观察选举过程(约30秒)
  4. rs.status()

三、生产环境部署建议

3.1 硬件选型原则

组件 开发环境 生产环境
CPU核心数 2 8-16
内存 4GB 32GB+
磁盘类型 HDD SSD/NVMe
网络带宽 100Mbps 1Gbps+

3.2 监控体系搭建

  1. # 安装Prometheus Operator
  2. kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/master/bundle.yaml
  3. # 配置MongoDB Exporter
  4. - job_name: 'mongodb'
  5. static_configs:
  6. - targets: ['mongodb:9216']

3.3 备份恢复策略

逻辑备份

  1. mongodump --host=localhost --port=27017 --db=test --out=/backup/
  2. mongorestore --host=localhost --port=27017 --db=test /backup/test/

物理备份(需关闭实例)

  1. # 停止服务
  2. sudo systemctl stop mongod
  3. # 复制数据文件
  4. cp -r /var/lib/mongodb /backup/mongodb_backup_$(date +%Y%m%d)
  5. # 恢复时停止服务并替换文件

四、性能对比与选型建议

4.1 单机与副本集性能对比

指标 单机模式 副本集模式
写入吞吐量 1.2万TPS 1.1万TPS
读取吞吐量 0.8万QPS 2.3万QPS
故障恢复时间 N/A 30-120秒
资源占用率 60% 85%

4.2 选型决策树

  1. 业务连续性要求

    • 允许小时级中断 → 单机
    • 要求分钟级恢复 → 副本集
  2. 数据量规模

    • <100GB → 单机
    • 100GB-1TB → 3节点副本集
    • 1TB → 分片集群

  3. 预算限制

    • 开发测试 → 单机
    • 生产环境 → 至少3节点副本集

五、最佳实践总结

  1. 开发环境:使用单机部署+Docker容器化,快速迭代
  2. 预发布环境:部署3节点副本集,验证高可用逻辑
  3. 生产环境

    • 跨可用区部署
    • 启用加密传输(TLS)
    • 配置慢查询日志
    • 定期进行故障演练
  4. 升级策略

    • 先升级从节点,再升级主节点
    • 使用rs.stepDown()主动降级主节点

通过本文的详细指导,开发者可以清晰理解MongoDB单机部署与集群部署的差异,掌握单机副本集的部署技巧,并根据实际业务需求做出合理的架构选择。