1. 程式人生 > >(十)RabbitMQ消息隊列-高可用集群部署實戰

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

進入 ann config views 如何 tor 通過命令 步驟 政策

原文:(十)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連接集群時實際是先經過負載均衡。

      技術分享圖片

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

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

RabbitMQ集群部署

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

10.99.121.150 RMQ_D_150
10.99.121.151 RMQ_M_151
10.99.121.152 RMQ_M_152
10.99.121.153 RMQ_M_153
10.99.121.154 RMQ_M_154

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

修改每一臺主機的host文件:

vi /etc/hosts
    10.99.121.150 RMQ_D_150
    10.99.121.151 RMQ_M_151
    10.99.121.152 RMQ_M_152
    10.99.121.153 RMQ_M_153
    10.99.121.154 RMQ_M_154

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

vi /etc/sysconfig/network
    NETWORKING=yes
    NETWORKING_IPV6=no
    HOSTNAME= RMQ-M-154

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

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

scp /root/.erlang.cookie root@10.99.121.151:/root/ 
scp /root/.erlang.cookie root@10.99.121.152:/root/
scp /root/.erlang.cookie root@10.99.121.153:/root/
scp /root/.erlang.cookie root@10.99.121.154:/root/

所以節點重啟

rabbitmqctl stop
rabbitmq-server -detached

連接集群

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

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

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

在瀏覽器輸入任意一個節點的WEB管理插件http://ip:15672,在Overviem視圖找到Nodes選項卡可以看到所有的節點。

技術分享圖片

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

rabbitmqctl  stop_app
rabbitmqctl  rest
rabbitmqctl  start_app

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

rabbitmqctl stop_app
rabbitmqctl forget_cluster_node rabbit@RMQ_M_154

增加節點:
在已有節點復制cookies到新的節點

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

查看集群狀態:

rabbitmqctl cluster_status

RabbitMQ鏡像集群配置

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

策略的修改可以通過命令也可以通過WEB,如果我是通過WEB來修改的,非常簡單。
Pattern:“^” 表示所有匹配所有隊列名稱。”^log” 是指同步”log”開頭的隊列名稱。
ha-mode:“all”代表同步到所以節點。

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

RabbitMQ技術交流QQ群:327034977(添加時請備註RabbitMQ)

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