MongoDB分片原理篇

MongoDB分片

爲何須要Sharded cluster?

MongoDB目前3大核心優點:『靈活模式』+ 『高可用性』 + 『可擴展性』,經過json文檔來實現靈活模式,經過複製集來保證高可用,經過Sharded cluster來保證可擴展性。mongodb

什麼時候使用分片技術數據庫

存儲容量需求超出單機磁盤容量
活躍的數據集超出單機內存容量,致使不少請求都要從磁盤讀取數據,影響性能
寫IOPS超出單個MongoDB節點的寫服務能力
json

分片技術,使得集合中的數據分散到多個分片集中。使得MongoDB具有橫向的發展。後端


Sharded cluster 分片架構

Sharded clusterShardMongosConfig server 3個組件構成。
架構

MongosSharded cluster的訪問入口,
Mongos自己並不持久化數據,Sharded cluster全部的元數據都會存儲到Config Server
而用戶的數據則會分散存儲到各個shardMongos啓動後,會從config server加載元數據,開始提供服務,將用戶的請求正確路由到對應的Shard

負載均衡

數據分佈策略

分片支持單個集合的數據分散在多個分片上。目前主要有兩種數據分片的策略。運維

  • 範圍分片(Range based sharding)
  • hash分片(Hash based sharding)

範圍分片

如圖,集合是根據字段來進行分片。根據字段的範圍不一樣將一個集合的數據存儲在不一樣的分片中。
在同一個Shard上,每一個Shard能夠存儲不少個chunkchunk存儲在哪一個shard的信息會存儲在Config server種,mongos也會根據各個shard上的chunk的數量來自動作負載均衡
範圍分片適合知足在必定範圍內的查找,例如查找X的值在【100-200】之間的數據,mongo 路由根據Config server中存儲的元數據,能夠直接定位到指定的shard的Chunk中
缺點 若是shardkey有明顯遞增(或者遞減)趨勢,則新插入的文檔多會分佈到同一個chunk,沒法擴展寫的能力性能

Hash分片

Hash分片是根據用戶的shard key計算hash值(64bit整型),根據hash值按照『範圍分片』的策略將文檔分佈到不一樣的chunkserver

優勢Hash分片與範圍分片互補,能將文檔隨機的分散到各個chunk,充分的擴展寫能力,彌補了範圍分片的不足,
缺點但不能高效的服務範圍查詢,全部的範圍查詢要分發到後端全部的Shard才能找出知足條件的文檔。blog

合理的選擇shard key

選擇shard key時,要根據業務的需求及『範圍分片』和『Hash分片』2種方式的優缺點合理選擇,要根據字段的實際緣由對數據進行分片,不然會產生過大的Chunk

Mongos

Mongos做爲Sharded cluster的訪問入口,全部的請求都由mongos來路由、分發、合併,這些動做對客戶端driver透明,用戶鏈接mongos就像鏈接mongod同樣使用。

查詢請求

  • 查詢請求不包含shard key,則必須將查詢分發到全部的shard,而後合併查詢結果返回給客戶端
  • 查詢請求包含shard key,則直接根據shard key計算出須要查詢的chunk,向對應的shard發送查詢請求

    寫請求

    寫操做必須包含shard key,mongos根據shard key算出文檔應該存儲到哪一個chunk,而後將寫請求發送到chunk所在的shard。

    更新/刪除請求

    更新、刪除請求的查詢條件必須包含shard key或者_id,若是是包含shard key,則直接路由到指定的chunk,若是隻包含_id,則需將請求發送至全部的shard。

    其餘命令請求


    Config Server

    config database

    Config server存儲Sharded cluster的全部元數據,全部的元數據都存儲在config數據庫
    Config Server可部署爲一個獨立的複製集,極大的方便了Sharded cluster的運維管理。

    config.shards

    config.shards集合存儲各個Shard的信息,可經過addShard、removeShard命令來動態的從Sharded cluster裏增長或移除shard

    config.databases

    config.databases集合存儲全部數據庫的信息,包括DB是否開啓分片,primary shard信息,對於數據庫內沒有開啓分片的集合,全部的數據都會存儲在數據庫的primary shard上。

    config.colletions

    數據分片是針對集合維度的,某個數據庫開啓分片功能後,若是須要讓其中的集合分片存儲,則需調用shardCollection命令來針對集合開啓分片。

    config.chunks

    集合分片開啓後,默認會建立一個新的chunk,shard key取值[minKey, maxKey]內的文檔(即全部的文檔)都會存儲到這個chunk。當使用Hash分片策略時,也能夠預先建立多個chunk,以減小chunk的遷移。

    config.settings

    config.settings集合裏主要存儲sharded cluster的配置信息,好比chunk size,是否開啓balancer等

    其餘集合

  • config.tags主要存儲sharding cluster標籤(tag)相關的你洗
  • config.changelog主要存儲sharding cluster裏的全部變動操做,好比balancer遷移chunk的動做就會記錄到changelog裏
  • config.mongos存儲當前集羣全部mongos的信息
  • config.locks存儲鎖相關的信息,對某個集合進行操做時,好比moveChunk,須要先獲取鎖,避免多個mongos同時遷移同一個集合的chunk。

相關文章
相關標籤/搜索