MongoDB分片

壹頁書發表於2014-06-15

如果資料量已經突破了單臺伺服器的處理能力。可以考慮使用分片。

分片的概念類似於資料庫的分割槽表。不同的是資料庫的分割槽表只是將一個segment分為多個segment儲存,MongoDB的分片,則是將每一個Segment劃分到一個單獨的伺服器處理。和傳統的資料庫一樣,分片需要依據一個索引列,而這個索引列一定要應用在查詢中,否則不能應用分割槽消除的特性,這樣會在每一個分割槽中進行查詢。


MongoDB分片的元件有mongos路由伺服器,配置伺服器和分片伺服器。而分片伺服器一般作為邏輯伺服器存在,實際應用中,它應該是一個副本集叢集。

實驗使用三臺虛擬機器,搭建一個具有三個分片的高可用叢集。


每個虛擬機器啟動5MongoDB例項。相關目錄和配置檔案如下:


每臺虛擬機器埠分配如下:

配置伺服器                3000    
Mongos路由伺服器    4000
分片伺服器1              5000
分片伺服器2              6000
分片伺服器3              7000

配置伺服器引數檔案內容如下:
configsvr    =true
dbpath     =/home/lihuilin/mongoconfig/
port        =3000
smallfiles    =true

路由伺服器引數檔案內容如下:
port         =4000  
logpath    =/home/lihuilin/mongos/mongos.log

分片伺服器引數檔案內容如下:
dbpath        =/home/lihuilin/mongoshard1
smallfiles    =true
replSet        =shard1
profile        =1
port        =5000
分片2和分片3 修改相應的資料

首先,需要啟動配置伺服器。
三臺配置伺服器啟動之後,啟動mongos伺服器。

然後啟動三個副本集,

最後登入mongos伺服器,增加分片伺服器。

檢視叢集分片狀態。


這個時候,分片的環境就已經搭建完成了。

但是,MongoDB預設不會對資料進行分片,他會將資料儲存在一個分片中。除非指定了分片的資料庫和集合。


可以看到MSG資料庫存放在了分片2的副本集上。


設定需要分片的資料庫。


設定需要分片的集合和鍵。如果該鍵沒有索引,則報錯如下:


在分片的鍵上建立索引


增加索引之後,設定分片成功


分片的鍵選擇非常重要,一旦分片,結構就固定了。

如果後續發現用這個鍵不合適,就會非常非常的麻煩。

下圖是採用rcvrID作為鍵的分片情況。
具體使用哪個鍵作為分片的依據,確實需要在業務層次想清楚。
和資料庫分割槽表一樣,如果業務沒有考慮清楚,就建立了分割槽表。
導致每次查詢都不能應用分割槽消除,結果就是全分割槽掃描,效能沒有提升,反而下降。





路由伺服器故障處理:

Mongos路由伺服器故障,應該是最好解決的一種故障。因為配置資訊存放在配置伺服器,資料存放在分片伺服器,所以只需要重新啟動mongodb例項連線配置伺服器即可。

而前端JAVA程式中記錄著所有mongos的資訊,他發現mongos不能連線,會自動尋找pings最先返回的mongos進行連線。所以對於JAVA應用,mongos故障是透明的。

分片伺服器故障處理:

由於分片由副本集組成,所以故障處理同副本集的成員故障處理。


配置伺服器故障處理:

配置伺服器存放著叢集的分片資訊。一旦所有的配置伺服器都故障,則叢集基本上就徹底掛了。所以配置伺服器一定要保證有3個例項分佈在不同的機器(機房)上。

在任何一個配置伺服器失效的時候,Mongodb叢集的後設資料都會變成為只讀了。叢集系統繼續執行,但是chunks在一個分片中將會成為不可以被拆分或者是不可以跨分片進行遷移。對於大多數使用場景,這個不會導致問題,應為改變Chunk後設資料進行的並不頻繁。

另外,使當機的Config Server在一個合理的時間週期(一天)內恢復是相當重要的,這樣可以避免分片由於缺乏遷移而變得負載不均衡


恢復當機的配置伺服器,可以找到一個新的伺服器,使用相同的IP或者主機名稱。停止另外一個可用的配置伺服器(或者上鎖複製檔案),將他所有的檔案同步到新的伺服器上。然後啟動這個新的配置伺服器。


參考:
http://blog.itpub.net/29254281/viewspace-1176553/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1183315/,如需轉載,請註明出處,否則將追究法律責任。

相關文章