MongoDB是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。它支持的數據結構非常鬆散,是類似json的bson格式,因此可以存儲比較複雜的數據類型。
而且mongodb也有索引,視圖功能, MongoDB 4.0 引入的事務功能,支持多文檔ACID特性,總之,MongoDB是一個基於分佈式文件存儲的數據庫。那麼作爲分佈式數據庫,他應該具備可靠性和可擴展性;那麼今天,我們那介紹它的兩個功能:副本集和分片
1 副本集
副本集就是爲了解決mongodb的可靠性,
MongoDB複製是將數據同步在多個服務器的過程。
複製提供了數據的冗餘備份,並在多個服務器上存儲數據副本,提高了數據的可用性, 並可以保證數據的安全性。
複製還允許您從硬件故障和服務中斷中恢復數據。
客戶端從主節點上讀寫數據,主節點負責將數據同步複製到副本節點
主節點和副本節點,以及副本節點之間會有心跳
一旦主節點掛掉,會馬上選出一個副本節點作爲主節點,不影響數據庫的使用。
一般讀取從主節點讀取,但也可以通過設置從副本節點讀取
有一下幾種設置,涉及事務操作的collection 的讀取最好設置primaryPreferred以上的讀取策略。
Read Preference Mode | Description |
---|---|
primary | Default mode. All operations read from the current replica set primary. |
primaryPreferred | In most situations, operations read from the primary but if it is unavailable, operations read from secondary members. |
secondary | All operations read from the secondary members of the replica set. |
secondaryPreferred | In most situations, operations read from secondary members but if no secondarymembers are available, operations read from the primary. |
nearest | Operations read from member of the replica set with the least network latency, irrespective of the member’s type. |
2, 分片
分片是爲了解決mongodb的擴展問題。
分片是一種跨多臺機器分發數據的方法。 MongoDB使用分片來支持具有非常大的數據集和高吞吐量操作的部署。 具有大型數據集或高吞吐量應用程序的數據庫系統可能會挑戰單個服務器的容量。例如,高查詢率會耗盡服務器的CPU容量。工作集大小大於系統的RAM會強調磁盤驅動器的I / O容量。 有兩種解決系統增長的方法:垂直和水平縮放
垂直擴展涉及增加單個服務器的容量,例如使用更強大的CPU,添加更多RAM或增加存儲空間量。可用技術的侷限性可能會限制單個機器對於給定工作負載而言足夠強大。此外,基於雲的提供商基於可用的硬件配置具有硬性上限。結果,垂直縮放有實際的最大值。
水平擴展涉及劃分系統數據集並加載多個服務器,添加其他服務器以根據需要增加容量。雖然單個機器的總體速度或容量可能不高,但每臺機器處理整個工作負載的子集,可能提供比單個高速大容量服務器更高的效率。擴展部署容量只需要根據需要添加額外的服務器,這可能比單個機器的高端硬件的總體成本更低。權衡是基礎架構和部署維護的複雜性增加。
MongoDB分片羣集包含以下組件:
分片:每個分片包含分片數據的子集。每個分片都可以部署爲副本集。
mongos:mongos充當查詢路由器,在客戶端應用程序和分片集羣之間提供接口。
config servers:配置服務器存儲羣集的元數據和配置設置。從MongoDB 3.4開始,必須將配置服務器部署爲副本集(CSRS)
數據庫可以混合使用分片和非分片集合。分片集合在集羣中的分片上進行分區和分佈。非散列集合存儲在主分片上。每個數據庫都有自己的主分片。您必須連接到mongos路由器才能與分片羣集中的任何集合進行交互。這包括分片和非分片集合。客戶端永遠不應連接到單個分片以執行讀取或寫入操作
我們可以通過db.colname.getShardDistribution() 來查看一個集合的分片情況,下面是一個分片集合和非分片集合執行查詢的操作計劃,其過程一目瞭然