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