天天看點

MongoDB筆記: 分片叢集

MongoDB分片叢集由三個子產品組成

  • shard: 分片(或者分區)子產品, 每個分片分别存儲一部分資料, 從MongoDB 3.6開始, 分片必須是replica set(副本集)
  • mongos: mongos是一個請求路由, 提供給用戶端使用, 将請求配置設定到分片叢集.
  • config servers: 配置子產品存儲的是叢集的配置資訊和中繼資料, MongoDB 3.4之後配置子產品也必須是replica set(CSRS).

一個副本集隻能有一個主節點, 可以有多個從節點. 主節點可以讀寫, 從節點隻能讀. 主節點将資料修改操作儲存至oplog中. 一個副本集需要奇數個節點, 心跳資訊每兩秒傳遞一次, 通過選舉實作自動故障轉移. 主節點當機後會進行自動選舉.

生産環境配置

在生産環境為了保證資料備援以及系統的高可用, 建議使用以下的分片叢集配置

  • Config Servers使用3節點副本集
  • Shard使用3節點副本集
  • Mongos部署1個或多個

副本集分布式部署

如果可能的話, 建議将每個副本集中的一個節點部署至适合災備恢複的機房

分片的個數

分片機制需要至少兩個分片, 如果不是很快就要開始分片, 不要使用單個分片的叢集.

Mongos的個數和部署

部署多個mongos支援高可用性和擴充性, 大多情況下會在每個應用伺服器上部署一個mongos, 這樣可以減小用戶端應用和mongos之間的網絡延遲. 對于大型的項目, 可以将mongos部署在專用的伺服器上, 避免mongos的數量随應用而增長, 并且使得mongos可以使用更大的記憶體. mongos和mongod的記憶體是不共享的, 如果部署在同一個伺服器上要留意記憶體是否充足. 在部署數量上, mongos沒有限制, 但是mongos會頻繁與配置伺服器通信, 在增加mongos數量後要密切監視配置伺服器的負載, 如果導緻性能下降, 就要減小mongos的數量.

開發環境配置

對于測試和開發, 你可以按最小數量來部署.

  • Config Server使用1節點副本集
  • Shard使用1節點副本集
  • Mongos部署1個

分片

在分片叢集中, 每個分片會包含全部資料的一個子集. 使用者,用戶端和應用應當直接連接配接到分片來進行本地管理和維護操作. 

在單個分片上進行查詢, 隻會傳回這個子集中的資料. 叢集級别的讀寫操作應當連接配接到mongos進行.

主分片

在分片叢集中, 每個db都有一個主分片, 用來存儲這個db中所有未分片的collection. 每個db都有各自的主分片. 主分片與副本集中的主副本無關.

mongos在建立新db時, 會選擇叢集中資料量最小的那個分片, 在其上建立主分片. 使用listDatabase指令傳回的totalSize也是判斷的一個因素.

要修改db的主分片, 使用movePrimary指令. 遷移主分片的過程會明顯耗時, 遷移的過程中不應該去通路對應的資料.

分片狀态

在mongo shell用 sh.status() 方法檢視叢集狀态. 報告包含那些分片是db主分片以及在分片上的chunk分布情況.

分片叢集安全

使用Internal/Membership驗證來保證叢集内的安全, 防止未授權的子產品連入或通路叢集, 在啟動每個mongod的時候, 要設定好對應的安全配置, 對應的是

叢集内子產品間的安全, 使用Internal Authentication, 例如keyfile

用戶端和叢集間的安全, 使用User Access Controls, 用戶端必須使用使用者賬戶進行連接配接

分片本地使用者

各個分片都支援基于角色的通路控制Role-Based Access Control (RBAC), 在mongod啟動時使用 --auth 參數啟用RBAC. 另外, 啟用 Internal/Membership Authentication 時也會通過RBAC啟用使用者通路控制.

每個分片都有自己的本地使用者, 這些使用者不能用在其他分片上, 也不能用于通過mongos連接配接叢集

分片主鍵

分片主鍵決定了collection資料在叢集中各個分片如何分布, 分片主鍵可以是一個索引字段, 也可以是一個索引組合字段, 隻要它存在于collection中的每一個記錄. MongoDB使用主鍵值的區間對資料進行分區, 每個區間定義了資料塊, 對應一個不會與其他資料塊交疊的主鍵值範圍. MongoDB會盡量保持資料塊在叢集的分片中均勻分布, 分片主鍵的選擇和分布的效率有直接聯系.

資料塊

MongoDB在資料塊尺寸超過限制後, 會将資料塊進行拆分. 在insert和update操作後都有可能發生拆分. 資料塊能對應的最小的區間就是一個單個的分片主鍵值, 如果資料塊隻對應了一個主鍵值, 那就不能再拆分了.

資料塊初始化

填充Collection

分片操作會用完整的主鍵值區間建立初始資料塊, 資料塊的數量取決于配置的資料塊尺寸. 在初始資料塊建立後, balancer會在分片之間遷移這些資料塊.

空Collection

如果你定義了zone, 并且zone區間定義在了一個空的或不存在的collection上, 分片操作會建立空資料塊. 如果未在空collection上設定zone,

對于hashed sharding: 分片操作會建立空資料塊, 預設情況下每個分片會建立兩個資料塊, 可以通過numInitialChunks選項來調整數量.

對于ranged sharding: 分片操作會建立一個空資料塊, 然後進行遷移.

資料塊尺寸

MongoDB中的預設資料塊尺寸是64MB, 大小可以在配置中修改.

  • 小資料塊可以讓資料分布更均勻, 但是遷移會更頻繁, 增加mongos查詢開銷.
  • 大資料塊可以減小遷移頻率, 從網絡角度看更高效, 但是資料存儲分布會更不均勻.
  • 資料塊尺寸會影響每個資料塊的最大記錄數, 影響分片的最大collection尺寸.
  • 大部分場景下, 需要允許輕微的資料不均勻, 來避免頻繁的資料塊遷移.

修改資料塊尺寸的影響說明: 

自動拆分隻會在insert和update時發生, 如果你減小了資料塊尺寸, 會需要等一段時間才能看到所有資料塊拆分為新的尺寸.

拆分是不能回退的, 如果你增加資料塊尺寸, 現有的資料塊要在insert和update過程中增長到新的尺寸

繼續閱讀