阅读量:19
MongoDB在Linux环境下扩展存储的完整方案
一、基础准备:确认当前存储状态
在扩展前,需先明确MongoDB的数据存储路径及现有磁盘使用情况,避免操作失误。
- 查看数据目录:连接MongoDB Shell,执行
db.getMongo().getState(),返回结果中的dbPath即为当前数据存储路径(默认多为/var/lib/mongo或/data/db)。 - 检查磁盘空间:使用
df -h命令查看磁盘使用率,确认是否需要扩展(若Use%接近100%,需扩容);若需定位MongoDB数据目录所在分区,可执行df -h /var/lib/mongo(替换为实际dbPath)。
二、物理磁盘/分区扩展(直接增加存储容量)
若服务器有额外未分配磁盘或现有分区可扩展,可通过以下方式增加物理存储:
1. 扩展物理磁盘(新磁盘场景)
- 步骤1:挂载新磁盘
将新磁盘(如/dev/sdb)格式化为文件系统(如ext4),并挂载到目标目录(如/mnt/data):sudo mkfs.ext4 /dev/sdb # 格式化磁盘(ext4格式) sudo mkdir -p /mnt/data # 创建挂载点 sudo mount /dev/sdb /mnt/data # 临时挂载(重启后失效) - 步骤2:设置开机自动挂载
编辑/etc/fstab文件,添加以下行(替换为实际UUID和挂载点):
通过UUID=<新磁盘UUID> /mnt/data ext4 defaults 0 2blkid /dev/sdb获取磁盘UUID。
2. 扩展现有分区(LVM逻辑卷场景)
若数据存储在LVM逻辑卷上,可通过lvextend和resize2fs/xfs_growfs扩展容量:
- 步骤1:查看逻辑卷信息
sudo lvdisplay # 确认逻辑卷路径(如/dev/vg_mongodb/lv_mongodb) - 步骤2:扩展逻辑卷
增加10GB容量(根据需求调整+10G):sudo lvextend -L +10G /dev/vg_mongodb/lv_mongodb - 步骤3:扩展文件系统
- 若文件系统为ext4:
sudo resize2fs /dev/vg_mongodb/lv_mongodb - 若文件系统为XFS(需先扩展逻辑卷,再扩展文件系统):
sudo xfs_growfs /dev/vg_mongodb/lv_mongodb
- 若文件系统为ext4:
3. 扩展现有分区(非LVM场景)
若数据存储在普通分区(如/dev/sda1),需使用growpart扩展分区,再扩展文件系统:
- 步骤1:安装growpart工具(Debian/Ubuntu):
sudo apt-get update && sudo apt-get install cloud-utils-growpart - 步骤2:扩展分区:
sudo growpart /dev/sda 1 # 扩展/dev/sda的第1个分区 - 步骤3:扩展文件系统:同LVM场景的
resize2fs或xfs_growfs命令。
三、逻辑卷/分区扩展后验证
扩展完成后,需确认MongoDB是否识别新增空间:
- 检查磁盘空间:
df -h /mnt/data(替换为新挂载点),确认Use%下降。 - 检查MongoDB状态:
若mongo --eval 'db.runCommand({ connectionStatus: 1 })' # 确认服务正常 mongo --eval "db.stats()" # 查看数据存储用量db.stats()中的dataSize或storageSize随数据增长而增加,说明扩展成功。
四、分片集群扩展(海量数据场景)
若单节点存储无法满足需求,可通过分片集群将数据分布到多个节点,实现横向扩展:
- 添加新分片服务器:
在新服务器上启动MongoDB分片实例(端口如27018):mongod --shardsvr --dbpath /data/db --port 27018 - 将分片添加到集群:
连接到配置服务器(端口27019),执行以下命令(替换为新分片地址):mongo --port 27019 config = rs.conf() config.shards.push({ _id: "shard0001", host: "new_shard_host:27018" }) rs.reconfig(config) - 迁移数据到新分片:
使用moveChunk命令将指定集合的数据迁移到新分片(以test.users集合为例):mongo --port 27017 sh.moveChunk("test.users", { _id: 1 }, "new_shard_host:27018") # 按shardKey迁移
注意:分片前需启用分片功能(sh.enableSharding("数据库名")),并选择合适的shardKey(如_id或业务字段)。
五、挂载新磁盘到MongoDB数据目录(替代方案)
若不想修改现有分区,可将新磁盘挂载为MongoDB的新数据目录,实现存储分离:
- 停止MongoDB服务:
sudo systemctl stop mongod - 移动数据文件:
将现有数据目录(如/var/lib/mongo)移动到新磁盘(如/mnt/data):sudo mv /var/lib/mongo /mnt/data/mongo - 修改配置文件:
编辑/etc/mongod.conf,更新storage.dbPath为新路径:storage: dbPath: /mnt/data/mongo - 启动MongoDB服务:
sudo systemctl start mongod - 验证数据:
执行mongo --eval "db.stats()",确认数据正常访问。
关键注意事项
- 数据备份:扩展前务必备份数据(使用
mongodump),防止操作失误导致数据丢失。 - 停机时间:分片集群扩展无需停机,但物理磁盘/分区扩展或挂载新磁盘需短暂停机(取决于数据量)。
- 性能优化:扩展后可根据需求调整WiredTiger缓存大小(
storage.wiredTiger.engineConfig.cacheSizeGB),提升存储效率。