一、為什麼要分片
1.存儲容量需求超出單機磁盤容量。
2.活躍的資料集超出單機記憶體容量,導緻很多請求都要從磁盤讀取資料,影響性能。
3.IOPS超出單個MongoDB節點的服務能力,随着資料的增長,單機執行個體的瓶頸會越來越明顯。
4.副本集具有節點數量限制。
垂直擴充:增加更多的CPU和存儲資源來擴充容量。
水準擴充:将資料集分布在多個伺服器上。水準擴充即分片。
二、分片的工作原理
三、分片集搭建
3.1配置 并啟動config 節點叢集
# 資料庫檔案位置
dbpath=config/config1
#日志檔案位置
logpath=config/logs/config1.log
# 以追加方式寫入日志
logappend=true
# 是否以守護程序方式運作
fork = true
bind_ip=0.0.0.0
port = 17017
# 表示是一個配置伺服器
configsvr=true
#配置伺服器副本集名稱
replSet=configsvr
節點2、3同上,配置完畢後啟動配置節點
進入任意節點的mongo shell 并添加 配置節點叢集 注意use admin
./bin/mongo --port 17017
use admin
var cfg ={"_id":"configsvr",
"members":[
{"_id":1,"host":"192.168.211.133:17017"},
{"_id":2,"host":"192.168.211.133:17018"},
{"_id":3,"host":"192.168.211.133:17019"}]
};
rs.initiate(cfg)
3.2配置shard叢集
shard1叢集搭建37017到37019
dbpath=shard/shard1/shard1-37017
bind_ip=0.0.0.0
port=37017
fork=true
logpath=shard/shard1/shard1-37017.log
replSet=shard1
shardsvr=true
dbpath=shard/shard1/shard1-37018
bind_ip=0.0.0.0
port=37018
fork=true
logpath=shard/shard1/logs/shard1-37018.log
replSet=shard1
shardsvr=true
dbpath=shard/shard1/shard1-37019
bind_ip=0.0.0.0
port=37019
fork=true
logpath=shard/shard1/logs/shard1-37019.log
replSet=shard1
shardsvr=true
shard2叢集、shard3叢集、shard4叢集 同上
啟動每個mongod 然後進入其中一個進行叢集配置
var cfg ={"_id":"shard1",
"protocolVersion" : 1,
"members":[
{"_id":1,"host":"192.168.211.133:37017"},
{"_id":2,"host":"192.168.211.133:37018"},
{"_id":3,"host":"192.168.211.133:37019"}
]
};
rs.initiate(cfg)
rs.status()
3.3配置和啟動 路由節點
route-27017.conf
port=27017
bind_ip=0.0.0.0
fork=true
logpath=route/logs/route.log
configdb=configsvr/192.168.211.133:17017,192.168.211.133:17018,192.168.211.133:17019
啟動路由節點使用 mongos (注意不是mongod)
./bin/mongos -f route/route-27017.conf
3.4 mongos(路由)中添加分片節點
進入路由mongos添加分片資訊
mongo --port 27017
sh.status()
sh.addShard("shard1/192.168.211.133:37017,192.168.211.133:37018,192.168.211.133:37019");
sh.addShard("shard2/192.168.211.133:47017,192.168.211.133:47018,192.168.211.133:47019");
sh.status()
3.5 開啟資料庫和集合分片(指定片鍵)
繼續使用mongos完成分片開啟和分片大小設定
為資料庫開啟分片功能
sh.enableSharding("lagou_resume")
為指定集合開啟分片功能
sh.shardCollection("lagou_resume.lagou_resume_datas",{"片鍵字段名如 name":索引說明})
3.6 驗證結果
我們插入一點資料然後檢視是否有資料
use lg_resume;
for(var i=1;i<= 1000;i++){
db.lg_resume_datas.insert({"name":"test"+i, salary:(Math.random()*20000).toFixed(2)});
}