MongoDB筆記: 分片集羣

MongoDB分片集羣由三個模塊組成shell

  • 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的個數和部署server

部署多個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過程當中增加到新的尺寸

數據塊拆分

拆分是爲了不數據塊增加得過大, 當一個數據塊增加到超過預設的尺寸或者記錄數超過每一個數據塊容許遷移的最大記錄數時, MongoDB會基於分片主鍵值將數據塊進行拆分. 必要的時候一個數據塊會被拆分紅多個數據塊. 拆分是元數據修改, MongoDB並不會遷移任何數據或影響分片.
拆分會致使分片之間的數據塊存儲分佈的不均衡, 這時候balancer會將數據塊在分片之間進行調整. Balancer是一個後臺進程, 用於管理數據塊遷移. 若是集羣中分片的最大數據塊數量和最小數據塊數量超過了閾值, balancer就會進行遷移以保證數據的均勻分佈.

在某些狀況下, 例如對應的分片主鍵已經縮減爲單值, 數據塊增加超過了限制可是又不能進行拆分, 會使得數據塊增加得愈來愈大, 這就會成爲性能瓶頸, 特別是當這個主鍵被頻繁使用的時候.

相關文章
相關標籤/搜索