MongoDB 分片通過將數據水平切分到多台服務器,實現海量數據的存儲與高吞吐讀寫。核心組件包括:

mongod --dbpath ~/db/mongo1/database --logpath ~/db/mongo1/log/mongo.log --port 27017 --fork --smallfiles mongod --dbpath ~/db/mongo2/database --logpath ~/db/mongo2/log/mongo.log --port 27018 --fork --smallfiles
mongod --dbpath ~/db/mongo3/database --logpath ~/db/mongo3/log/mongo.log --port 27019 --fork --smallfiles --configsvr
mongos --logpath ~/db/mongo4/log/mongos.log --port 27020 --configdb 127.0.0.1:27019 --fork
注意:--configdb 指向 Config Server 地址,生產環境應填寫副本集連接串。
mongo --port 27020
sh.addShard("127.0.0.1:27017")
sh.addShard("127.0.0.1:27018")
sh.status() # 查看集群狀態
sh.enableSharding("test")
sh.shardCollection("test.my", {"my_id": 1})
MongoDB 會自動將數據按 my_id 範圍切分為多個 Chunk(默認 64MB),並根據 Chunk 數量均衡分佈到各 Shard。
為避免初期數據寫入集中在單一 Shard 導致熱點,可預先切分 Chunk 並指定分佈:
sh.enableSharding("test")
sh.shardCollection("test.my", {"my_id": 1})
sh.splitAt("test.my", {my_id: 1000})
sh.splitAt("test.my", {my_id: 2000})
sh.splitAt("test.my", {my_id: 3000})
# 可配合 moveChunk 將特定 Chunk 移至目標 Shard
默認 Chunk 大小 64MB,可根據業務調整(如 4MB):
use config
db.settings.save({_id: "chunksize", value: 4})
較小 Chunk 利於負載均衡,但會增加元數據開銷;生產環境建議 64-128MB。
_id hashed 或複合鍵)。分片是 MongoDB 水平擴展的核心能力,合理的分片鍵設計與預分片策略,能讓集群在 TB/PB 級數據下依然保持線性擴展性能。