JMS學習(六)-ActiveMQ的高可用性實現


原文地址:http://www.cnblogs.com/hapjin/p/5663024.html

 

一,ActiveMQ高可用性的架構

ActiveMQ的高可用性架構是基於Master/Slave 模型的。ActiveMQ總共提供了四種配置方案來配置HA,其中Shared Nothing Master/Slave 在5.8版本之后不再使用了,並在ActiveMQ5.9版本中引入了基於Zookeeper的Replicated LevelDB Store HA方案。

 

二,Master/Slave架構的配置解釋

①Shared Nothing Master/Slave   該架構最大的特點是:

1)Master 和 Slave各自都單獨存儲持久化的消息,它們不共享數據。

2)Master收到持久化消息時,需要先同步(sync)給Slave之后,才向Producer發送ACK確認。

3)只有Master負責Client的請求,Slave不接收Client請求。Slave連接到Master,負責備份消息。

4)Master出現故障,Slave有兩種處理方式:❶自己成為Master;❷關閉(停服務)---根據具體配置而定。

5)Master 與 Slave之間可能會出現“Split Brain”現象。比如:Master本身是正常的,但是Master與Slave之間的網絡出現故障,網絡故障導致Slave認為Master已經宕機,因為它自己會成為Master(根據配置:shutdownOnMasterFailure)。此時,對Client而言,就會存在兩個Master。

6)Slave 只能同步它連接到Master之后的消息。在Slave連接到Master之前Producer向Master發送的消息將不會同步給Slave,這可以通過配置(waitForSlave)參數,只有當Slave也啟動之后,Master才開始初始化TransportConnector接受Client的請求(Producer的請求)

7)如果Master 或者 Slave其中之一宕機,它們之間不同步的消息 無法 自動進行同步,此時只能手動恢復不同步的消息了。也就是說:“ActiveMQ沒有提供任何有效的手段,能夠讓master與slave在故障恢復期間,自動進行數據同步”

8)對於非持久化消息,並不會同步給Slave。因此,Master宕機,非持久化消息會丟失。

 

 

關於ShareNothing 高可用配置的一點理解:

❶由上面的第2)步可知:Producer向Master發消息之后,Master需要將消息同步給Slave之后,才向Producer返回確認ACK。因此,對Producer的響應有一定的延時。

如果為了保證快速響應,即Producer給Master發消息之后,Master收到了消息立即給Producer回復,然后再在后台把消息同步給Slave。這又會造成數據不一致性問題。

因為,如果Master收到了消息立即給Producer回復之后,Master還未來得及向Slave同步就宕機了,如果此條消息還在Master內存中,則Master宕機后消息就丟失了。如果Master收到Producer的消息,先寫入磁盤,然后再向Producer返回確認ACK,然后再在后台與Slave同步,那么Master就需要標記每條消息是否已經成功同步到了Slave,若消息還未同步到Slave,則Master重啟恢復后,需要立即同步Slave。只有當Slave成功同步了所有的Master上的消息之后,才能上線。這也無法實現 automatic failover。

關於一個很好的高可靠性解決方案:可參考 Hadoop HA中的QJM機制。其核心就是:1)采用集群,能容忍不超過大多數機器的失效;2)數據只寫大多數機器就返回確認,保證Client快速的響應能力;3)數據在后台在異步同步到集群所有的機器,從而保證高可用。

❷這里的Master--Slave機制中,只有一台Slave,並不是Slave集群(見上面結構圖)。Master宕機,或者Slave宕機后,都會給整個服務造成極大的風險,並沒有像Hadoop HA中的那樣能夠容忍“不超過大多數機器失效”的保證,即沒有做到真正的高可用性。

❸還可能出現“雙主”問題。即上面提到的“Split Brian”現象。

 

②Shared Database Master/Slave

 這是很常用的一種架構。“共享存儲”,意味着Master與Slave之間的數據是共享的。

那如何避免沖突呢?通過爭奪數據庫表的排他鎖,只有Master有鎖,未獲得鎖的自動成為Slave。

ActiveMQ Message Broker uses a relational database, it grabs an exclusive lock on a table ensuring that no other ActiveMQ broker can access the database at the same time 

對於“共享存儲”而言,只會“共享”持久化消息。對於非持久化消息,它們是在內存中保存的。可以通過配置(forcePersistencyModeBrokerPlugin persistenceFlag)屬性強制所有的消息都持久化。

當Master宕機后,Slave可自動接管服務成為Master。由於數據是共享的,因此Master和Slave之間不需要進行數據的復制與同步。Slave之間通過競爭鎖來決定誰是Master。

 

③Shared File system Master/Slave

這種方式和共享數據庫存儲原理基本一樣,(文件系統也有文件鎖),故不詳細介紹。

 

④最近的 Replicated LevelDB Store

The elected master broker node starts and accepts client connections. 
The other nodes go into slave mode and connect the the master and synchronize their persistent state /w it.

以上也表明:每個Broker都是單獨存儲數據的。因為Master要把新的數據復制到Slave上。從這個角度看:稱這種方式為“Share Storage”有點不合適。

 

2)Quorum機制的又一應用

假設有3個Broker,那么選舉時至少需要兩個Broker同意(大多數)之后,才能選出Master。此外,只需要當新消息復制到大多數Broker上時,就可以給Producer返回ACK。其他少數Broker則可以在后台以異步方式復制新的消息。

All messaging operations which require a sync to disk will wait for the update to be replicated to a quorum of the nodes before completing. 
So if you configure the store with replicas="3" then the quorum size is (3/2+1)=2. 
The master will store the update locally and wait for 1 other slave to store the update before reporting success.

比如說:一共有3個Broker,一個Master,二個Slave。當新消息到達Master時,Master需要將消息同步到其中一台Slave之后,才能向Producer發送ACK確認此次消息成功發送。

而剩下的另一台Slave,則可以在后台以異步方式復制這個新消息。此外,還能容忍一台Slave宕機。(能容忍不超過大多數的Broker宕機)

這種設計要求,可以保證集群中消息的可靠性,只有當(replicas/2 + 1)個節點物理故障,才會有丟失消息的風險。另外,也提高了一定的響應性,因為它不需要將消息同步到所有的Slave上,而只需要同步到大多數Broker上。

 

3)以何種標准判斷誰是Master,誰是Slave呢?
【選舉將會根據“消息日志的版本戳”、“權重"的大小決定,即“版本戳”越大(數據最新)、權重越高的broker優先成為master,其他broker作為slave並跟隨master。】

 

三,參考資料

分布式系統理論之Quorum機制

https://activemq.apache.org/artemis/docs/1.0.0/ha.html

 Replicated LevelDB Store HA官方文檔

ActiveMQ與HA架構(master/slave)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM