高可用性即HA(High Availability)指的是通過盡量縮短因日常維護操作(計划)和突發的系統崩潰(非計划)所導致的停機時間,以提高系統和應用的可用性。
高可用集群的解決方案
計算機系統的高可用在不同的層面上有不同的表現:
(1)網絡高可用
由於網絡存儲的快速發展,網絡冗余技術被不斷提升,提高IT系統的高可用性的關鍵應用就是網絡高可用性,網絡高可用性與網絡高可靠性是有區別的,網絡高可用性是通過匹配冗余的網絡設備實現網絡設備的冗余,達到高可用的目的。
比如冗余的交換機,冗余的路由器等
(2)服務器高可用
服務器高可用主要使用的是服務器集群軟件或高可用軟件來實現。
(3)存儲高可用
使用軟件或硬件技術實現存儲的高度可用性。其主要技術指標是存儲切換功能,數據復制功能,數據快照功能等。當一台存儲出現故障時,另一台備用的存儲可以快速切換,達一存儲不停機的目的。
MongoDB的高可用集群配置
高可用集群,即High Availability Cluster,簡稱HA Cluster。
集群(cluster)就是一組計算機,它們作為一個整體向用戶提供一組網絡資源。
這些單個的計算機系統 就是集群的節點(node)。
搭建高可用集群需要合理的配置多台計算機之間的角色,數據恢復,一致性等,主要有以下幾種方式:
(1)主從方式 (非對稱方式)
主機工作,備機處於監控准備狀況;當主機宕機時,備機接管主機的一切工作,待主機恢復正常后,按使用者的設定以自動或手動方式將服務切換到主機上運行,數據的一致性通過共享存儲系統解決。
(2)雙機雙工方式(互備互援)
兩台主機同時運行各自的服務工作且相互監測情況,當任一台主機宕機時,另一台主機立即接管它的一切工作,保證工作實時,應用服務系統的關鍵數據存放在共享存儲系統中。
(3)集群工作方式(多服務器互備方式)
多台主機一起工作,各自運行一個或幾個服務,各為服務定義一個或多個備用主機,當某個主機故障時,運行在其上的服務就可以被其它主機接管。
MongoDB集群配置的幾種方案也遵循了這幾種解決辦法。
Master-Slave主從結構
主從架構一般用於備份或者做讀寫分離。一般有一主一從設計和一主多從設計。
由兩種角色構成:
(1)主(Master)
可讀可寫,當數據有修改的時候,會將oplog同步到所有連接的salve上去。
(2)從(Slave)
只讀不可寫,自動從Master同步數據。
特別的,對於Mongodb來說,並不推薦使用Master-Slave架構,因為Master-Slave其中Master宕機后不能自動恢復,推薦使用Replica Set,后面會有介紹,除非Replica的節點數超過50,才需要使用Master-Slave架構,正常情況是不可能用那么多節點的。
還有一點,Master-Slave不支持鏈式結構,Slave只能直接連接Master。Redis的Master-Slave支持鏈式結構,Slave可以連接Slave,成為Slave的Slave。
Relica Set副本集方式
Mongodb的Replica Set即副本集方式主要有兩個目的,一個是數據冗余做故障恢復使用,當發生硬件故障或者其它原因造成的宕機時,可以使用副本進行恢復。
另一個是做讀寫分離,讀的請求分流到副本上,減輕主(Primary)的讀壓力。
1.Primary和Secondary搭建的Replica Set
Replica Set是mongod的實例集合,它們有着同樣的數據內容。包含三類角色:
(1)主節點(Primary)
接收所有的寫請求,然后把修改同步到所有Secondary。一個Replica Set只能有一個Primary節點,當Primary掛掉后,其他Secondary或者Arbiter節點會重新選舉出來一個主節點。默認讀請求也是發到Primary節點處理的,需要轉發到Secondary需要客戶端修改一下連接配置。
(2)副本節點(Secondary)
與主節點保持同樣的數據集。當主節點掛掉的時候,參與選主。
(3)仲裁者(Arbiter)
不保有數據,不參與選主,只進行選主投票。使用Arbiter可以減輕數據存儲的硬件需求,Arbiter跑起來幾乎沒什么大的硬件資源需求,但重要的一點是,在生產環境下它和其他數據節點不要部署在同一台機器上。
注意,一個自動failover的Replica Set節點數必須為奇數,目的是選主投票的時候要有一個大多數才能進行選主決策。
(4)選主過程
其中Secondary宕機,不受影響,若Primary宕機,會進行重新選主:
2.使用Arbiter搭建Replica Set
偶數個數據節點,加一個Arbiter構成的Replica Set方式:
Sharding分片技術
當數據量比較大的時候,我們需要把數據分片運行在不同的機器中,以降低CPU、內存和IO的壓力,Sharding就是數據庫分片技術。
MongoDB分片技術類似MySQL的水平切分和垂直切分,數據庫主要由兩種方式做Sharding:垂直擴展和橫向切分。
垂直擴展的方式就是進行集群擴展,添加更多的CPU,內存,磁盤空間等。
橫向切分則是通過數據分片的方式,通過集群統一提供服務:
(1)MongoDB的Sharding架構
(2)MongoDB分片架構中的角色
A.數據分片(Shards)
用來保存數據,保證數據的高可用性和一致性。可以是一個單獨的mongod
實例,也可以是一個副本集。
在生產環境下Shard一般是一個Replica Set,以防止該數據片的單點故障。所有Shard中有一個PrimaryShard,里面包含未進行划分的數據集合:
B.查詢路由(Query Routers)
路由就是mongos的實例,客戶端直接連接mongos,由mongos把讀寫請求路由到指定的Shard上去。
一個Sharding集群,可以有一個mongos,也可以有多mongos以減輕客戶端請求的壓力。
C.配置服務器(Config servers)
保存集群的元數據(metadata),包含各個Shard的路由規則。
參考: