一、概念:分片是指將數據拆分,分散到不一樣的數據庫實例上進行「負載分流」的作法。
咱們常說的「分表」、「分庫」、「分區」等概念都屬於分片的實際體現。
二、片鍵
2.一、概念:
設置分片時,須要從集合裏面選一個鍵,用該鍵的值做爲數據拆分的依據。
這個鍵稱爲片鍵(shard key)。片鍵就是分片的依據。
2.二、片鍵的選擇:
(1)、遞增片鍵:連續、不均勻、寫入集中、分流較差。
(2)、隨機片鍵:不連續、均勻、寫入分散、分流較好。
2.三、普通的集合,利用key爲片鍵進行自動分片後的結果,以下圖所示:
mongodb
三、分片架構圖,以下所示:數據庫
用戶:表明客戶端。
路由:表明路由服務器,它會根據管理員設置的「片鍵」,將數據分攤到本身管理的mongod集羣。
配置服務器:它將存儲數據和片的對應關係以及相應的配置信息,即分片集羣的配置信息。
Shard01片區: 一個普通的數據庫實例,若是不分片,咱們會直接連上mongod數據庫。服務器
四、自動分片
傳統的分片作法是手工分表、分庫。
自動分片技術是根據指定的「片鍵」,自動拆分數據並維護數據,請求路由的過程。架構
五、什麼時候使用分片?
(1)、機器的磁盤空間不足。
(2)、單個的mongodb服務器已經不能知足大量的插入操做。
(3)、想把大量數據放到內存中提升性能。
六、創建分片
(1)、建立一個配置服務器
(2)、建立路由服務器,而且鏈接配置服務器
路由器是調用mongos命令
(3)、添加兩個分片數據庫
1111和2222
(4)、利用路由爲集羣添加分片(容許本地訪問)
切記以前不能使用任何數據庫語句。
db.runCommand({addshard:"127.0.0.1:1111",allowLocal:true});
db.runCommand({addshard:"127.0.0.1:2222",allowLocal:true});
(5)、打開數據庫分片功能(必須使用admin用戶執行命令語句)
注意:必定要在打開分片功能以後,才建立數據庫和集合,不然分片不起做用。
爲業務數據庫foobar打開分片功能,示例以下:
db.runCommand({"enablesharding":"foobar"});
(6)、對集合進行分片(必須使用admin用戶執行命令語句)
db.runCommand({"shardcollection":"foobar.persons","key":{"_id":1}})
(7)、利用大量數據進行測試(800000條)
function add(){
for(var i=0;i<800000;i++)
{
db.persons.insert({"number":i,"age":10,"name":"Jim"+i})
}
}
七、管理分片
7.一、配置集合
如下命令,須要在配置服務器中config數據庫中執行。
(1)、分片:db.shards.find();
(2)、數據庫:db.databases.find();
(3)、塊:db.chunks.find();
7.二、分片命令
(1)、得到概要:db.printShardingStatus();
(2)、刪除片:db.runCommand({"removeshard":"127.0.0.1:1111"});ide
8.二、分片和副本集測試