RabbitMQ消息隊列(十)-高可用集羣部署實戰

RabbitMQ消息隊列(十)-高可用集羣部署實戰

前幾章講到RabbitMQ單主機模式的搭建和使用,我們在實際生產環境中出於對性能還有可用性的考慮會採用集羣的模式來部署RabbitMQ。

RabbitMQ集羣基本概念

Rabbit模式大概分爲以下三種:單主機模式、普通集羣模式、鏡像集羣模式。

  • 單主機模式:

    • RabbitMQ服務運行在單獨的一臺主機中,通常生產環境不使用該模式,性能有限,並且如果服務器宕機服務將完全不可用。
  • 普通集羣模式

    • 一說到集羣問題瞬間變得複雜多了。首先對於Queue來說消息實體只存在於其中一個節點,集羣中其他節點僅有相同的元數據,即隊列結構。

    • 當消息進入A節點的Queue中後,Consumer從B節點拉取消息時,RabbitMQ會臨時在兩個節點間進行消息傳輸,把A中的消息實體取出並經過B發送給Consumer。所以Consumer應儘量連接每一個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點建立Queue。否則Consumer如果只連接一個節點區消息會造成該節點的性能瓶頸。

    • 該模式存在一個問題就是當其中一個節點故障後,其他節點無法取到故障節點中還未消費的消息。如果做了消息持久化,那麼得等A節點恢復,然後纔可被消費;如果沒有持久化的話,那就杯具了!

  • 鏡像集羣模式

    • 前面講到RabbitMQ的普通集羣模式不同節點間只同步隊列結構不同步消息。鏡像模式會把隊列結構和消息都存在於多個節點,屬於RabbitMQ的HA方案。其實質和普通模式不同之處在於,消息實體會主動在鏡像節點間同步。該模式帶來的副作用也很明顯,除了降低系統性能外,如果鏡像隊列數量過多,加之大量的消息進入,集羣內部的網絡帶寬將會被這種同步通訊大量消耗。所以這種模式應用於可靠性要求較高的場合中。
  • 內存節點與磁盤節點

    • RabbitMQ的集羣節點包括內存節點、磁盤節點。顧名思義內存節點就是將所有數據放在內存,磁盤節點將數據放在磁盤。不過,如前文所述,如果在投遞消息時,打開了消息的持久化,那麼即使是內存節點,數據還是會放在磁盤。原則上一個集羣至少有一個磁盤節點。在實際使用中會發現所謂的磁盤節點是隻用來存儲集羣的配置信息,也就是說如果集羣中沒有磁盤節點,當所有節點關機後集羣的配置信息就會丟失。在進行性能測試時兩個模式的節點訂閱發佈消息的性能沒有太大差距。
  • 多節點負載分發

    • RabbitMQ集羣模式是沒有中心節點的,並且在連接集羣的時候實際上Consumer是連接其中某一臺節點,連接方法和單主機模式一致。那就遇到一個尷尬的問題,怎麼保證Consumer均勻的連接到多個節點。以下是我的一些思考,提供了兩個思路。

      • 1、通過負載均衡設備來實現流量分發。可以使用F5硬件負載均衡,如果沒有F5的硬件負載均衡設備也可以使用想LVS等服務,當Consumer連接集羣時實際是先經過負載均衡。

      • 雖然負載均衡設備通常都很穩定,但這樣一來RabbitMQ的集羣就有了中心節點。我們在使用的時候是這樣的,首先將集羣中所以節點的IP放在一個數組中,app在連接RabbitMQ的時候會從數組中隨機選擇一個IP來連接,然後把連接的節點的IP緩存到服務器,如果連接超時則重新隨機選擇其他節點來連接。通過這種方式來實現app流量的分發。

現在對集羣的基本概念都有了瞭解,下面我們一起來搭建一個普通模式的集羣。

RabbitMQ集羣部署

我用5臺服務器來搭建一個5個節點的集羣,其中192.168.63.134爲磁盤節點,其他服務器爲內存節點。對服務器的命名如下:

192.168.63.134 RMQ_D_134 
192.168.63.130 RMQ_M_130
192.168.63.131 RMQ_M_131
192.168.63.132 RMQ_M_132 
192.168.63.133 RMQ_M_133

在前面第三章講過單主機的RabbitMQ如何安裝http://blog.csdn.net/super_rd/article/details/70241007 
先安裝好5臺單主機的RabbitMQ。

修改每一臺主機的host文件(每一臺都要添加所有):

複製代碼

vi /etc/hosts
192.168.63.134 RMQ_D_134 
192.168.63.130 RMQ_M_130
192.168.63.131 RMQ_M_131
192.168.63.132 RMQ_M_132 
192.168.63.133 RMQ_M_133

 

複製代碼

修改每一臺主機的主機名:(我沒有一一列出)

vi /etc/sysconfig/network

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME= RMQ-D-XXX

打開每一臺主機的相應端口:

firewall-cmd --permanent --add-port=25672/tcp
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --permanent --add-port=4369/tcp
systemctl restart firewalld.service

同步每個節點Cookie(在134執行) 
Rabbitmq的集羣是依賴於erlang的集羣來工作的,所以必須先構建起erlang的集羣環境。Erlang的集羣中各節點是通過一個magic cookie來實現的,這個cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的權限。所以必須保證各節點cookie保持一致,否則節點之間就無法通信。

scp /root/.erlang.cookie [email protected]:/root/ 
scp /root/.erlang.cookie [email protected]:/root/ 
scp /root/.erlang.cookie [email protected]:/root/ 
scp /root/.erlang.cookie [email protected]:/root/ 

所有節點授予400權限

chmod 400 /root/.erlang.cookie

 所有節點重啓(最好服務器重啓)

rabbitmqctl stop
rabbitmq-server -detached

使用命令 驗證hosts解析ip是否正確

rabbitmqctl status -n rabbit@RMQ_D_134 
rabbitmqctl status -n rabbit@RMQ_M_130 
rabbitmqctl status -n rabbit@RMQ_M_131
rabbitmqctl status -n rabbit@RMQ_M_132
rabbitmqctl status -n rabbit@RMQ_M_133

 

連接集羣

複製代碼

rabbitmqctl stop_app(注意硬盤節點先不要執行)
rabbitmqctl join_cluster --ram rabbit@RMQ_D_134(連接到任意一個已經加入集羣的節點均可)
rabbitmqctl start_app 
rabbitmqctl cluster_status //查看集羣狀態 
//磁盤節點,join_cluster 命令去掉--ram參數即可。 
//在RabbitMQ集羣裏,必須至少有一個磁盤節點存在(磁盤節點用來存儲集羣狀態)。

複製代碼

 遠程訪問配置 
配置集羣之後需要重新添加賬號 
默認網頁是不允許訪問的,需要增加一個用戶修改一下權限,代碼如下:

rabbitmqctl add_user wyt wyt  //添加用戶
rabbitmqctl set_permissions -p / wyt ".*" ".*" ".*"  //添加權限
rabbitmqctl set_user_tags wyt administrator  //修改用戶角色

這時候一個賬號可以在多個RabbitMQ平臺使用 

刪除節點: 
修改host和主機名,同之前的步驟。 
在要脫離集羣的節點執行:

rabbitmqctl  stop_app
rabbitmqctl  rest
rabbitmqctl  start_app

或者在其他節點執行:(例如刪除RMQ_M_133節點)

rabbitmqctl stop_app
rabbitmqctl forget_cluster_node rabbit@RMQ_M_133

增加節點: 
在已有節點複製cookies到新的節點

scp /root/.erlang.cookie [email protected]:/root/  //在已有節點執行。
//以下在要新增的節點執行。
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram  rabbit@RMQ_M_135
rabbitmqctl start_app

查看集羣狀態

rabbitmqctl cluster_status

RabbitMQ鏡像集羣配置

儘管我們部署好了普通模式的集羣,但因爲節點間只同步隊列結構並不進行消息的同步,對於一些可靠性要求較高的場景需要對隊列中的消息也同步到所以節點。 
使用Rabbit鏡像功能,需要基於rabbitmq策略來實現,政策是用來控制和修改羣集範圍的某個vhost隊列行爲和Exchange行爲,在cluster中任意節點啓用策略,策略會自動同步到集羣節點。

策略的修改可以通過命令也可以通過WEB,如果我是通過WEB來修改的,非常簡單。 

Pattern:“^” 表示所有匹配所有隊列名稱。”^log” 是指同步”log”開頭的隊列名稱。 

ha-mode:“all”代表同步到所以節點。

 

  填寫好後點擊“Add policy”應用配置策略。可以看到已經新建的策略。

 

新建一個隊列,然後查看隊列列表。可以看到一個“+4”說明數據被保存了四份。

點擊隊列查看隊列詳情。可以看到隊列是在150節點創建的,但是同步到了其餘四個節點。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章