分區是mongodb對資料進行水平擴充的一種方式,通過選擇合適的片鍵將資料均勻地儲存在shard server叢集中。
分區組件由shard server叢集、config server和mongos進程組成。如下圖所示:
config server中儲存與分區相關的中繼資料,即有哪些shard server,有哪些chunk,chunk位於哪個shard server上等。
mongos主要負責路由,將用戶端的請求轉寄到對應的shard server上。
shard server上存放了真正的資料,shard server可以是一個mongod,也可以是一個複本集。
config server
config server是一個特殊的mongod執行個體,儲存shard叢集的中繼資料。一台config server容易出現單點故障,官方建議3台config server,既保證資料安全,又降低了多台config server之間資料同步開銷。只要有任何一台config server不可用,config server叢集就變為唯讀,如果都掛了,重啟之前的讀寫請求會丟失。可以在不停機的情況下修改config server的名稱和數量。
config server通過config database來儲存中繼資料,mongos則把中繼資料快取起來。config database中與分區有關的集合有:
config.changelog 記錄中繼資料的變更;
config.chunks 記錄每個chunk的資訊,包括chunk所屬shard,以及chunk的min與max值;
config.lockpings與config.locks儲存了分布式鎖相關資訊,當均衡器在做工作之前需要先擷取鎖;
config.mongos 儲存mongos執行個體資訊,mongos執行個體間每隔30秒會有心跳檢測;
config.settings 分區相關配置,比如chunk大小,是否啟用均衡器等
config.shards 記錄每個shard對應的機器,如果shard是一個複本集,則為對應複本集的名稱。
chunk
shard中的資料被劃分為多個chunk,每個chunk的預設大小為64M,如果chunk的大小超過64M時,mongos會嘗試對其進行分割,分割後會導致每個shard對應的chunk數不一致,mongos會對這些不均勻的分區進行遷移。
如果發現64M遷移過程太長,可以減小塊大小提高遷移速度,修改塊大小時,已經存在的塊不會立即拆分,而是在下一次拆分時進行。
均衡器
由於遷移是有開銷的,mongodb並不是在發現chunk數不一致時立即進行遷移,有一個migration thresholds概念存在,migration thresholds取值如下:
遷移過程如下:
(1)mongos發送movechunk命令給源分區
(2)源分區執行內部的moveChunk操作,這時對chunk的寫操作寫到源分區
(3)目的分區從源分區拷貝資料,一次一個chunk
(4)拷貝完最後一個chunk後,緊接著執行一個同步操作,把遷移過程中的修改同步到目的分區
(5)同步完成後,目的分區串連到config database,更新中繼資料,修改遷移塊對應的shard資訊
(6)更新中繼資料成功後,在源分區上刪除chunk資料
均衡器分為手動均衡和自動均衡,通過setBalancerState(false)設定後,均衡器不會進入均衡過程,可以在locks表中查看均衡器的狀態。當向叢集中添加新分區時,均衡器會嘗試為該分區寫資料,從而觸發一系列的遷移過程,影響應用程式效能,在添加分區時一般應關閉均衡器,或者控制均衡器的啟動時間範圍。