在扩展前,需先明确MongoDB的数据存储路径及现有磁盘使用情况,避免操作失误。
db.getMongo().getState(),返回结果中的dbPath即为当前数据存储路径(默认多为/var/lib/mongo或/data/db)。df -h命令查看磁盘使用率,确认是否需要扩展(若Use%接近100%,需扩容);若需定位MongoDB数据目录所在分区,可执行df -h /var/lib/mongo(替换为实际dbPath)。若服务器有额外未分配磁盘或现有分区可扩展,可通过以下方式增加物理存储:
/dev/sdb)格式化为文件系统(如ext4),并挂载到目标目录(如/mnt/data):sudo mkfs.ext4 /dev/sdb # 格式化磁盘(ext4格式)
sudo mkdir -p /mnt/data # 创建挂载点
sudo mount /dev/sdb /mnt/data # 临时挂载(重启后失效)
/etc/fstab文件,添加以下行(替换为实际UUID和挂载点):UUID=<新磁盘UUID> /mnt/data ext4 defaults 0 2
通过blkid /dev/sdb获取磁盘UUID。若数据存储在LVM逻辑卷上,可通过lvextend和resize2fs/xfs_growfs扩展容量:
sudo lvdisplay # 确认逻辑卷路径(如/dev/vg_mongodb/lv_mongodb)
+10G):sudo lvextend -L +10G /dev/vg_mongodb/lv_mongodb
sudo resize2fs /dev/vg_mongodb/lv_mongodb
sudo xfs_growfs /dev/vg_mongodb/lv_mongodb
若数据存储在普通分区(如/dev/sda1),需使用growpart扩展分区,再扩展文件系统:
sudo apt-get update && sudo apt-get install cloud-utils-growpart
sudo growpart /dev/sda 1 # 扩展/dev/sda的第1个分区
resize2fs或xfs_growfs命令。扩展完成后,需确认MongoDB是否识别新增空间:
df -h /mnt/data(替换为新挂载点),确认Use%下降。mongo --eval 'db.runCommand({ connectionStatus: 1 })' # 确认服务正常
mongo --eval "db.stats()" # 查看数据存储用量
若db.stats()中的dataSize或storageSize随数据增长而增加,说明扩展成功。若单节点存储无法满足需求,可通过分片集群将数据分布到多个节点,实现横向扩展:
mongod --shardsvr --dbpath /data/db --port 27018
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的新数据目录,实现存储分离:
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
sudo systemctl start mongod
mongo --eval "db.stats()",确认数据正常访问。mongodump),防止操作失误导致数据丢失。storage.wiredTiger.engineConfig.cacheSizeGB),提升存储效率。