MongoDB在Linux上如何扩容
导读:MongoDB 在 Linux 上的扩容实践 一、扩容总览与选择路径 容量不足时,通常有三种路径: 垂直扩容:在同一台服务器上增加磁盘或扩展现有分区/文件系统,适用于暂时无法分片的场景。 水平扩容(副本集):为现有副本集新增数据节点,提...
MongoDB 在 Linux 上的扩容实践
一、扩容总览与选择路径
- 容量不足时,通常有三种路径:
- 垂直扩容:在同一台服务器上增加磁盘或扩展现有分区/文件系统,适用于暂时无法分片的场景。
- 水平扩容(副本集):为现有副本集新增数据节点,提升容量与读能力,同时增强高可用。
- 水平扩容(分片集群):向集群添加新的分片,从根本上提升整体存储与吞吐能力。
- 建议路径:单节点 → 先升级为副本集 → 数据/负载持续增长时再引入分片。MongoDB 本身不提供“自动扩容”,需结合监控与自动化脚本在阈值触发时执行扩容动作。
二、垂直扩容 扩展磁盘与文件系统
- 适用:单机或副本集单节点数据目录所在磁盘空间不足,且可在线扩展底层存储。
- 步骤要点:
- 确认数据目录:在 mongo shell 中执行
db.serverStatus().storageEngine或查看/etc/mongod.conf的 storage.dbPath。 - 扩展底层存储(示例思路):
- 云盘在线扩容后,使用 growpart 扩展分区:
growpart /dev/sda 1; - 扩展文件系统(ext4/xfs 等)以识别新增空间;
- LVM 场景:
pvcreate→vgextend→lvextend→resize2fs/xfs_growfs。
- 云盘在线扩容后,使用 growpart 扩展分区:
- 重启并检查:
sudo systemctl restart mongod,df -h确认挂载点容量已增加。 - 如无法直接扩容,可采用 mongodump/mongorestore 迁移到更大磁盘的新数据目录,并更新
storage.dbPath后启动。 - 可选:调整 WiredTiger 缓存(
storage.wiredTiger.engineConfig.cacheSizeGB)以更贴合内存与负载。 - 持续监控:
df -h、mongostat、mongotop观察空间与性能变化。
- 确认数据目录:在 mongo shell 中执行
- 注意:尽量在维护窗口操作,确保有完整备份,变更
dbPath需保证目录权限与 SELinux/AppArmor 策略正确。
三、水平扩容 副本集增加数据节点
- 适用:需要在不中断服务的前提下提升容量与读能力,并保持高可用。
- 步骤要点:
- 准备新节点:安装相同版本 MongoDB,创建数据目录,配置
replication.replSetName与 keyFile(各节点一致),设置bindIp与网络互通。 - 启动新节点后,在主节点执行:
rs.add("host:port");如需只读扩展可添加 隐藏/延迟 节点(不在此详述)。 - 观察同步:
rs.status()、rs.printSecondaryReplicationInfo()确认 stateStr=SECONDARY 且复制滞后可接受。 - 验证:在主库写入测试数据,在新增从库查询验证一致性。
- 收缩反向操作:
rs.remove("host:port")。
- 准备新节点:安装相同版本 MongoDB,创建数据目录,配置
- 提示:生产环境建议维持奇数个投票成员(如 3/5/7),必要时可加入仲裁节点(不存数据,仅投票)以节省资源。
四、水平扩容 分片集群添加分片
- 适用:单集群容量/吞吐已达瓶颈,需要线性扩展。
- 步骤要点:
- 部署并启动新的 mongod 分片(建议以副本集形态),确保与集群网络、认证、时区等一致。
- 通过 mongos 添加分片:
sh.addShard("newShardHost:port"),使用sh.status()校验。 - 对目标库表启用分片:
sh.enableSharding("db"),选择并设定 分片键 后执行sh.shardCollection("db.coll", { shardKey: 1} )。 - 数据均衡:分片后 balancer 会自动迁移 chunk,也可对热点集合/分片手动
sh.moveChunk()优化分布。 - 校验:持续观察
sh.status()、各分片数据量与 balancer 状态,确保无异常迁移与热点。
- 注意:分片键设计直接影响数据均衡与查询性能,务必结合访问模式谨慎选择。
五、自动化与运维要点
- 容量告警与扩容编排:MongoDB 不自带自动扩容,建议结合 Prometheus + Grafana 设置磁盘/延迟/复制滞后等告警,通过 Webhook/Ansible 在告警触发时自动执行“加磁盘/加节点/加 shard”的预案。
- 变更管控:所有扩容操作在低峰时段执行,保持 备份可用,变更前后留存
rs.status()、sh.status()与df -h的基线信息。 - 连接字符串治理:副本集使用连接串
mongodb://user:pwd@host1:27017,host2:27017/db?replicaSet=rs0& w=majority;分片通过 mongos 接入,避免直连分片。 - 安全合规:统一 keyFile、开启 authorization,限制
bindIp,并审计关键操作。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: MongoDB在Linux上如何扩容
本文地址: https://pptw.com/jishu/771094.html
