標籤:mongodb 資料庫
上節咱們遺留了兩個問題還沒解決:
- 從節點每個上面的資料都是對資料庫全部拷貝,從節點壓力會不會過大?
- 資料壓力大到機器支撐不了的時候是否會自動擴充
在系統早期,資料量還小的時候不會引起太大的問題,但是隨著資料量持續增多,後續遲早會出現一台機器硬體瓶頸問題的。而mongodb主打的就是海量資料架構,“分區”就用這個來解決這個問題。
分區,是將一個邏輯資料拆分到不同的伺服器。每個拆分的資料都是獨立的,
分區好處:
1分區使得叢集中每個切片操作資料量減少,同時叢集的操作能力增加也提高了輸送量
2分區減少了每個伺服器需要儲存的資料量。隨著叢集的的增長每個分區儲存更少的資料
如何分區
Mongodb支援通過設定檔做分區叢集
我們通過一張圖可以看出
分區叢集由三部分組成:Router(mongos)config Server, shard (Replica Sets,複本集)
Shard: 這就是分區了,儲存資料,用於提供高可用性和一致性。
Mongos:路由伺服器,資料庫叢集的入口,所有請求通過mongos進行協調,不需要在應用程式中添加一個路由選擇,mongos自己便是一個請求分發中心,負責把對象請求轉寄到對應的分區伺服器上。
ConfigServer :顧名思義為設定管理員,儲存所有資料庫元資訊(路由、分區)的配置。mongos本身沒有實體儲存體分區伺服器和資料路由資訊,只是緩衝在記憶體裡,設定管理員則實際儲存這些資料。mongos第一次啟動或者關掉重啟就會從config server 載入配置資訊,以後如果設定管理員資訊變化會通知到所有的 mongos 更新自己的狀態,這樣 mongos就能繼續準確路由。在生產環境通常有多個 config server 設定管理員,因為它儲存了分區路由的中繼資料,這個可不能丟失!就算掛掉其中一台,只要還有存貨,mongodb叢集就不會掛掉。
實戰
1 首先準備3各mongodb資料庫,分別作為設定管理員,分區1和分區2,都儲存在一個機器上,對應連接埠不同
2 規劃連接埠,設定管理員 2000,路由伺服器 1000,分區A 8091,分區B 8092,
3 各個伺服器的配置資訊
3.1 首先是建立設定管理員
configuration.confdbpath =J:\java\mongopointcut\conf\databaseport =2000bind_ip=127.0.0.1 Configuration.batmongod --configconfiguration.conf
3.2建立路由器伺服器,並串連設定管理員,路由器是調用mongos命令
mongos --port 1000--configdb 127.0.0.1:2000connectonMongos.batmongo127.0.0.1:1000/admin
3.3建立分區伺服器配置
shardA.confdbpath=J:\java\mongopointcut\pointcut2\databaseport=8092bind_ip=127.0.0.1 connictShartA.batmongod --config shardA.conf loginShartA.batmongo127.0.0.1:8091/admin ShartB.confdbpath=J:\java\mongopointcut\pointcut2\databaseport=8092bind_ip=127.0.0.1 mongod--config ShartB.conf
4登入伺服器
4.1 首先登入設定管理員,在登入路由伺服器。在啟動各個分區伺服器
在路由器伺服器中添加分區伺服器。但是mongos本身沒有實體儲存體分區伺服器和資料路由資訊,只是緩衝在記憶體裡,設定管理員則實際儲存這些資料。
db.runCommand({addshard:"127.0.0.1:8091",allowLocal:true})db.runCommand({addshard:"127.0.0.1:8092",allowLocal:true})
這裡要注意的是,在addshard中,我們也可以添加複本集,這樣能達到更高的穩定性
4.2片已經叢集了,但是mongos不知道如何切分資料
開啟資料庫分區功能,命令很簡單 enablesharding(),這裡我就開啟foobar資料庫。
指定集合中分區的片鍵,這裡我就指定為bar.id欄位,也就是片鍵,在mogondb中設定片鍵
通過查看設定管理員,可以看到
5查看效果
我們添加90萬條的資料
function add(){ vari=0; for(;i<200000;i++){ db.bar.insert({"age":i+10,"name":"jim"}) }}
通過printshardingSttus查看分區情況
mongos> showcollectionsbarpersonsystem.indexesmongos>db.bar.stats(){ "sharded" : true, "systemFlags" : 1, "userFlags" : 1, "ns" :"foobar.bar", "count" :931672, //總計條數 "numExtents" : 19, "size" : 104347264, "storageSize" : 144752640, "totalIndexSize" : 36334144, "indexSizes" : { "_id_" : 36334144 }, "avgObjSize" : 112, "nindexes" : 1, "nchunks" : 7, "shards" : { "shard0000" : { "ns" :"foobar.bar", "count" : 352282, //分區1 "size" :39455584, "avgObjSize": 112, "storageSize": 58441728, "userFlags" : 1, "totalIndexSize" : 13441344, "indexSizes": { "_id_" : 13441344 }, "ok" : 1 }, "shard0001" : { "ns" :"foobar.bar", "count" : 579390, //分區2 "size" :64891680, "avgObjSize": 112, "totalIndexSize" : 22892800, "indexSizes": { "_id_" : 22892800 }, "ok" : 1 } }, "ok" : 1}
可以看到資料分到倆個分區中,shard1352282,shard2 579390,總數931672,已經成功。
小結:
通過分區的測試我們認識到分區儲存減少了資料庫的拷貝,同時增加了叢集的輸送量,同時分區也是複本集的一種增強,它是在複本集的基礎上進行改善的。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Mongodb叢集之分區儲存