1. 程式人生 > >(十)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任務分發機制

      • 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選項卡可以看到所有的節點。

RabbitMQ叢集

刪除節點:
修改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”代表同步到所以節點。

RabbitMQ映象佇列

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

RabbitMQ策略policy

新建一個佇列,然後檢視佇列列表。可以看到一個“+4”說明資料被儲存了四份。

RabbitMQ佇列列表

點選佇列檢視佇列詳情。可以看到佇列是在150節點建立的,但是同步到了其餘四個節點。

RabbitMQ佇列詳情

RabbitMQ技術交流QQ群:327034977(新增時請備註RabbitMQ)