關(guān)于MongoDB數(shù)據(jù)庫(kù)自動(dòng)分片技術(shù)的詳細(xì)介紹
MongoDB數(shù)據(jù)庫(kù)的自動(dòng)分片技術(shù)就是將原先數(shù)據(jù)庫(kù)中集合依據(jù)一定的規(guī)則切分成若干小塊,這些分片小塊統(tǒng)一由mongos路由管理,當(dāng)有請(qǐng)求查詢或?qū)懭霑r(shí),路由會(huì)依據(jù)分片shard key規(guī)則找到對(duì)應(yīng)的分片操作。分片解決了寫密集操作,用于分散單一寫服務(wù)器負(fù)載。亦或者原先的存儲(chǔ)空間不夠了,這個(gè)時(shí)候可能通過(guò)分片操作將之后的數(shù)據(jù)寫入其它存儲(chǔ)空間上。可以看出,集合的分片和數(shù)據(jù)庫(kù)的分表類似,并且每個(gè)分片都支持寫操作。
由于分片的出現(xiàn),導(dǎo)致數(shù)據(jù)被分布式的存儲(chǔ)到不同的服務(wù)器上,當(dāng)某一服務(wù)器出現(xiàn)問(wèn)題時(shí)就可能導(dǎo)致數(shù)據(jù)丟失,其次路由mongos也會(huì)出現(xiàn)問(wèn)題,另外存儲(chǔ)分片的信息的配置服務(wù)器也可能會(huì)發(fā)生問(wèn)題。當(dāng)然我們可以利用master salve/Replica sets機(jī)制去備份每個(gè)分片、Mongos、configs 。如下官網(wǎng)配置圖示,即使我們使用服務(wù)器交叉?zhèn)浞菀残枰罅康姆?wù)器資源,因此分片是一件***耗費(fèi)資源的事情。官網(wǎng)的配置圖示
首先路由從config中讀取配置信息,發(fā)生的分片動(dòng)態(tài)增加也會(huì)通過(guò)mongos寫入config servres中,當(dāng)client有請(qǐng)求時(shí)通過(guò)mongos查找到對(duì)應(yīng)的分片。可以看出分片使用的replica set備份模式,而mongos/config servrs則是多個(gè)服務(wù)器配置。下面就手動(dòng)實(shí)現(xiàn)一下分片的過(guò)程。(換環(huán)境了繼續(xù)昨天未完成的,前2天在筆記本上)
1)創(chuàng)建configs服務(wù)器
- ....bin>mongod --dbpath "e:\mongodb\data\configs" --port 23017
2)創(chuàng)建mongos服務(wù)器 并指定依賴的配置服務(wù)器 (mongos依賴于配置服務(wù)器,mongos查詢的分片信息都存儲(chǔ)在configs中)
- ....bin>mongos --port 25017 --configdb 127.0.0.1:23017
3)創(chuàng)建多個(gè)分片服務(wù)器 (負(fù)責(zé)數(shù)據(jù)存儲(chǔ))
- ....bin>mongod --port 27017 --dbpath "e:\mongodb\data\dbs\shard27017"
為shard27017分片服務(wù)器 創(chuàng)建test庫(kù)foo集合,并且為foo集創(chuàng)建name索引。
4)連接mongos服務(wù)器添加shard27017分片服務(wù)器到configs服務(wù)器中。
- >use admin
- >db.runCommand({addshard:"127.0.0.1:27017",allowLoacl:true}) //添加分片服務(wù)器,allowLoacl 充許本地部署 默認(rèn)情況不充許本地部署多個(gè)分片的
一旦分片添加成功,在mongos服務(wù)器中執(zhí)行 show dbs就可以看到分片服務(wù)器的數(shù)據(jù)庫(kù),并且可以操作分片服務(wù)器的數(shù)據(jù) ,下面為分片服務(wù)器的test庫(kù)foo集合設(shè)置分片以及分片shard key。
- >db.runCommand({"enablesharding":"test"}) //對(duì)test庫(kù)啟用分片功能
注意:需要分片的集合 的shard key必須是索引鍵, (我們也可以在mongos為分片foo集合創(chuàng)建索引)
- >db.runCommand({"shardcollection":"test.foo","key":{"name":1}}) //數(shù)字代表排序
至此自動(dòng)分片就創(chuàng)建完成了,可以在mongos或configs服務(wù)器查詢分片信息。
當(dāng)一個(gè)分片服務(wù)器存儲(chǔ)不夠時(shí),通過(guò)像3)方式繼續(xù)添加分片服務(wù)器,monogs會(huì)自實(shí)現(xiàn)這些分片的集群工作。
當(dāng)需要移除分片時(shí)運(yùn)行下面的命令,同時(shí)mongos路由會(huì)將此分片服務(wù)器上的信息移到其它分片上。
- >db.runCommand({"removeshard":"127.0.0.1:27017"})
簡(jiǎn)單的分析一下這個(gè)shard key,當(dāng)不是寫密集操作時(shí),而僅僅是因?yàn)榇鎯?chǔ)空間不夠了,這個(gè)shard key我們可以選用一些無(wú)上限范圍的key,如創(chuàng)建時(shí)間等,這樣新創(chuàng)建的記錄都會(huì)寫入新的分片服務(wù)器上。
當(dāng)需要使每個(gè)分片均勻分布數(shù)據(jù)時(shí),或者寫入密集時(shí),***選用有一定范圍值的key ,當(dāng)然這個(gè)范圍不能太小,像性別,真假等,這會(huì)導(dǎo)致只自動(dòng)產(chǎn)生兩個(gè)分片,所以一定要選擇合適的shard key才能達(dá)到理想的效果。
關(guān)于MongoDB數(shù)據(jù)庫(kù)的自動(dòng)分片技術(shù)就介紹到這里,希望通過(guò)本次的介紹能夠帶給您一些收獲。
【編輯推薦】