RabbitMQ 普通集羣以及鏡像

RabbitMQ 集羣過程中,找到了一些資料。看的不是很明白,所以在這裏對這些資料進行驗證並一步步進行整理。

 

說明

我在虛擬機中的Cent OS 7系統安裝了RabbitMQ-Server的服務, 在之前一章中進行了整理:《CentOS7 erlang RabbitMQ 安裝並且配置遠程訪問》,然後對該虛擬機進行了複製,同時運行了2個虛擬機,接下來是對系統的一些配置介紹以及操作

 

嚴重的問題: 安裝好的RabbitMQ 最好不要採用複製形式,會找不到自己的Rabbit Name 以及 PID的。

所以,兩個系統, 每個系統都是要安裝的。

 

介紹

 

單一模式:最簡單的情況,非集羣模式。沒什麼好說的。

普通模式:默認的集羣模式。對於Queue來說,消息實體只存在於其中一個節點,A、B兩個節點僅有相同的元數據,即隊列結構。當消息進入A節點的Queue中後,consumer從B節點拉取時,rabbitMQ會臨時在A、B間進行消息傳輸,把A中的消息實體取出並經過B發送給consumer。所以consumer應儘量連接每一個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點建立物理Queue。否則無論consumer連A或B,出口總在A,會產生瓶頸。該模式存在一個問題就是當A節點故障後,B節點無法取到A節點中還未消費的消息實體。如果做了消息持久化,那麼得等A節點恢復,然後纔可被消費;如果沒有持久化的話,然後就沒有然後了……

鏡像模式:把需要的隊列做成鏡像隊列,存在於多個節點,屬於rabbitMQ的HA方案。該模式解決了上述問題,其實質和普通模式不同之處在於,消息實體會主動在鏡像節點間同步,而不是在consumer取數據時臨時拉取。該模式帶來的副作用也很明顯,除了降低系統性能外,如果鏡像隊列數量過多,加之大量的消息進入,集羣內部的網絡帶寬將會被這種同步通訊大大消耗掉。所以在對可靠性要求較高的場合中適用(後面會詳細介紹這種模式,目前我們搭建的環境屬於該模式)瞭解集羣中的基本概念:rabbitMQ的集羣節點包括內存節點、磁盤節點。顧名思義內存節點就是將所有數據放在內存,磁盤節點將數據放在磁盤。不過,如前文所述,如果在投遞消息時,打開了消息的持久化,那麼即使是內存節點,數據還是安全的放在磁盤。一個rabbitMQ集 羣中可以共享 user,vhost,queue,exchange等,所有的數據和狀態都是必須在所有節點上覆制的,一個例外是,那些當前只屬於創建它的節點的消息隊列,儘管它們可見且可被所有節點讀取。rabbitMQ節點可以動態的加入到集羣中,一個節點它可以加入到集羣中,也可以從集羣環集羣會進行一個基本的負載均衡。

 

 

集羣中有兩種節點:

內存節點:只保存狀態到內存(一個例外的情況是:持久的queue的持久內容將被保存到disk)

磁盤節點:保存狀態到內存和磁盤。內存節點雖然不寫入磁盤,但是它執行比磁盤節點要好。集羣中,只需要一個磁盤節點來保存狀態 就足夠了 如果集羣中只有內存節點,那麼不能停止它們,否則所有的狀態,消息等都會丟失。

 

 

 

集羣配置

我們這邊有兩臺服務器,hostname分別爲:rabbit181(192.168.1.181)、rabbit162(192.168.1.162)。

 

 

配置步驟如下:

1.   rabbit181和rabbit162做爲rabbitMQ集羣節點,分別安裝rabbitMQ-Server ,安裝後分別啓動rabbitMQ-server

2.   在安裝好的兩臺節點服務器中,分別修改/etc/hosts文件,指定rabbit181和rabbit162的hosts:192.168.1.181 rabbit181 192.168.1.162 rabbit162 

 

3.   還有hostname文件也要正確,分別是rabbit181和rabbit162,如果修改hostname建議安裝rabbitMQ前修改。請注意rabbitMQ集羣節點必須在同一個網段裏,如果是跨廣域網效果就差。

修改hostname的方法:

 

a)   啓用root用戶

運行命令 sudo passwd root 爲root用戶設置密碼

b)   以root用戶身份登錄

c)   編輯文件/etc/hosts 將下面的一行

127.0.1.1   替換爲 127.0.1.1  

d)   編輯 /etc/hostname文件 刪除該文件的所有內容,添加newhostname

e)   運行一下命令 hostname newhostname

f)   退出root用戶 改用一般用戶登錄即可

 

注: 我是臨時做測試, 沒有永久修改,而是用臨時修改方法

a)hostname rabbit181

b)su

兩條命令完成

 

 

 

4.   設置每個節點Cookie:rabbitMQ的集羣是依賴於erlang的集羣來工作的,所以必須先構建起erlang的集羣環境。Erlang的集羣中各節點是通過一個magic cookie來實現的,這個cookie存放在 /var/lib/rabbitMQ/.erlang.cookie 中,文件是400的權限。所以必須保證各節點cookie保持一致,否則節點之間就無法通信。將其中一臺節點上的.erlang.cookie值複製下來保存到其他節點上,要注意文件的權限和屬主屬組。先修改下.erlang.cookie權限:

#chmod 777  /var/lib/rabbitMQ/.erlang.cookie

複製完後重啓下rabbitMQ。

複製好後別忘記還原.erlang.cookie的權限,否則可能會遇到錯誤:

#chmod 400 /var/lib/rabbitMQ/.erlang.cookie

設置好cookie後先將三個節點的rabbitMQ重啓:

# rabbitmqctl stop

# rabbitMQ-server start


注:由於我係統下的.erlang.cookie  在root下, 所以我要去root根目錄下  我在 /var/lib/找不到rabbitMQ 所以我檢索了下系統,看這個文件實在哪

find / -name .erlang.cookie

用這條命令查看到了文件位置,然後在執行修改該文件權限

 

 

 

5.   停止所有節點rabbitMQ服務,然後使用detached參數獨立運行,這步很關鍵,尤其增加節點停止節點後再次啓動遇到無法啓動都可以參照這個順序:

rabbit@rabbit162# rabbitmqctl stop

rabbit@rabbit162# rabbitMQ-server –detached

 

 

 

6.   將rabbit181和rabbit162連接起來,執行如下命令:

rabbit@rabbit162# rabbitmqctl stop_app

rabbit@rabbit162# rabbitmqctl reset

rabbit@rabbit162# rabbitmqctl cluster rabbit@rabbit3 rabbit@rabbit1   

rabbit@rabbit162# rabbitmqctl start_app

 

 

 

7. 設置鏡像隊列策略

在任意一個節點上執行:
 

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}

將所有隊列設置爲鏡像隊列,即隊列會被複制到各個節點,各個節點狀態保持一直。

 

 

完成這 7 個步驟後,RabbitMQ 高可用集羣就已經搭建好了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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