1. 程式人生 > >官網英文版學習——RabbitMQ學習筆記(十)RabbitMQ集群

官網英文版學習——RabbitMQ學習筆記(十)RabbitMQ集群

sign 新版本 兩種 height node 停止 clas 普通模式 簡單

在第二節我們進行了RabbitMQ的安裝,現在我們就RabbitMQ進行集群的搭建進行學習,參考官網地址是:http://www.rabbitmq.com/clustering.html

首先我們來看一下官網對集群的定義:A RabbitMQ broker is a logical grouping of one or several Erlang nodes, each running the RabbitMQ application and sharing users, virtual hosts, queues, exchanges, bindings, and runtime parameters. Sometimes we refer to the collection of nodes as a cluster.

簡單翻譯一下是說:RabbitMQ的broker是一個或多個Erlang節點的邏輯分組,每個節點運行RabbitMQ應用程序並共享用戶、虛擬主機、隊列、交換、綁定和運行時參數。有時,我們將節點集合稱為集群。

集群將多個機器連接在一起,形成一個單一的邏輯代理。通信是通過Erlang消息傳遞進行的,因此集群中的所有節點都必須具有相同的Erlang cookie。集群中的機器之間的網絡連接必須是可靠的,集群中的所有機器都必須運行相同版本的RabbitMQ和Erlang。

虛擬主機、交換器、用戶和權限在集群中的所有節點上被自動鏡像。隊列可以位於單個節點上,也可以跨多個節點鏡像。連接到集群中任何節點的客戶端可以看到集群中的所有隊列,即使它們不在該節點上。

通常,您將使用集群實現高可用性和提高吞吐量,並將機器放在一個位置。

集群方式:

RabbitMQ集群可以通過多種方式形成:

  • 通過在配置文件中以聲明的方式列出集群節點
  • 聲明性地使用以域名系統發現
  • 以聲明的方式使用AWS (EC2)實例發現(通過插件)
  • 使用Kubernetes發現(通過插件)聲明
  • 聲明性地使用基於咨詢的發現(通過插件)
  • 以聲明的方式使用基於etcd的發現(通過插件)

集群的組成可以動態地改變。所有RabbitMQ代理都以在單個節點上運行開始。這些節點可以被連接到集群中,然後再返回到各個代理中。

集群模式(兩種):

1)普通模式(默認模式):

RabbitMQ集群中節點包括內存節點、磁盤節點。內存節點就是將所有數據放在內存,磁盤節點將數據放在磁盤上。如果在投遞消息時,打開了消息的持久化,那麽即使是內存節點,數據還是安全的放在磁盤。那麽內存節點的性能只能體現在資源管理上,比如增加或刪除隊列(queue),虛擬主機(vrtual hosts),交換機(exchange)等,發送和接受message速度同磁盤節點一樣。一個集群至少要有一個磁盤節點。一個rabbitmq集群中可以共享user,vhost,exchange等,所有的數據和狀態都是必須在所有節點上復制的,對於queue根據集群模式不同,應該有不同的表現。在集群模式下只要有任何一個節點能夠工作,RabbitMQ集群對外就能提供服務。

默認的集群模式,queue創建之後,如果沒有其它policy,則queue就會按照普通模式集群。對於Queue來說,消息實體只存在於其中一個節點,A、B兩個節點僅有相同的元數據,即隊列結構,但隊列的元數據僅保存有一份,即創建該隊列的rabbitmq節點(A節點),當A節點宕機,你可以去其B節點查看,./rabbitmqctl list_queues發現該隊列已經丟失,但聲明的exchange還存在。

當消息進入A節點的Queue中後,consumer從B節點拉取時,RabbitMQ會臨時在A、B間進行消息傳輸,把A中的消息實體取出並經過B發送給consumer,所以consumer應平均連接每一個節點,從中取消息。該模式存在一個問題就是當A節點故障後,B節點無法取到A節點中還未消費的消息實體。如果做了隊列持久化或消息持久化,那麽得等A節點恢復,然後才可被消費,並且在A節點恢復之前其它節點不能再創建A節點已經創建過的持久隊列;如果沒有持久化的話,消息就會失丟。這種模式更適合非持久化隊列,只有該隊列是非持久的,客戶端才能重新連接到集群裏的其他節點,並重新創建隊列。假如該隊列是持久化的,那麽唯一辦法是將故障節點恢復起來。

為什麽RabbitMQ不將隊列復制到集群裏每個節點呢?這與它的集群的設計本意相沖突,集群的設計目的就是增加更多節點時,能線性的增加性能(CPU、內存)和容量(內存、磁盤)。當然RabbitMQ新版本集群也支持隊列復制(有個選項可以配置)。比如在有五個節點的集群裏,可以指定某個隊列的內容在2個節點上進行存儲,從而在性能與高可用性之間取得一個平衡(應該就是指鏡像模式)。

2)鏡像模式:

該模式解決了上述問題,其實質和普通模式不同之處在於,消息實體會主動在鏡像節點間同步,而不是在consumer取數據時臨時拉取。該模式帶來的副作用也很明顯,除了降低系統性能外,如果鏡像隊列數量過多,加之大量的消息進入,集群內部的網絡帶寬將會被這種同步通訊大大消耗掉。所以在對可靠性要求較高的場合中適用,一個隊列想做成鏡像隊列,需要先設置policy,然後客戶端創建隊列的時候,rabbitmq集群根據“隊列名稱”自動設置是普通集群模式或鏡像隊列。

下面開始兩種模式的集群,我們的集群環境仍然是之前一直采用的幾個虛擬機中進行

在linux下centos6.7上進行,

一、在三臺虛擬機上分別安裝rabbitMQ

安裝可以參考本人前面的教程

  • 官網英文版學習——RabbitMQ學習筆記(二)RabbitMQ安裝

這裏我們對上面鏈接中安裝內容做個簡化,整理如下:

1.添加存儲庫條目

wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm

技術分享圖片

技術分享圖片

2.安裝erlang,安裝完成如下(安裝有些慢需要些時間大約6~10min):

sudo yum install erlang

技術分享圖片

3.安裝centos的epel的擴展源

yum -y install epel-release

技術分享圖片

4.之後執行yum -y install socat重新 安裝socat

技術分享圖片

5.安裝rabbitmq

rpm --import https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
# this example assumes the CentOS 7 version of the package
yum install rabbitmq-server-3.7.6-1.el7.noarch.rpm

官網安裝的是3.7.6-1.e17如上圖,結合本centos是32位字節,下載3.7.6-1.e16,並上傳到usr/local/目錄下,安裝運行

yum install rabbitmq-server-3.7.6-1.e16.noarch.rpm成功。

技術分享圖片

6、啟動RabbitMQ測試

技術分享圖片

顯示啟動成功,OK!

附上網上查找的有關rabbitMQ命令

service rabbitmq-server start    啟動

service rabbitmq-server stop    停止

service rabbitmq-server restart   重啟

二、

在上述的三臺機器上安裝rabbitmq完成之後,你可以看到你的機器中有如下1個文件。路徑在$HOME中或者在/var/lib/rabbitmq中,文件名稱為.erlang.cookie,他是一個隱藏文件。

技術分享圖片

那麽這文件存儲的內容是什麽,是做什麽用的呢?

該文件是集群節點進行通信的驗證密鑰,所有節點必須一致。RabbitMQ的集群是依賴erlang集群,而erlang集群是通過這個cookie進行通信認證的,拷完後重啟下RabbitMQ。因此我們做集群的第一步就是幹cookie。怎麽幹?

1、必須使集群中也就是上面三臺機器中的這兩臺機器的.erlang.cookie文件中cookie值一致,且權限為owner只讀。

三臺機子三個文件內容分別是

技術分享圖片

技術分享圖片

技術分享圖片

修改三臺機子文件中的內容完全一樣即可,不管采用那臺機子上的均可,這裏本博主采用第一個文件TUWHXTFBJHBQTONCAXCA

修改文件權限 chmod 600 /var/lib/.erlang.cookie

進入安裝的sbin下查看目錄,不知道sbin安裝目錄可以輸入命令whereis rabbitmq-server查找

技術分享圖片

cd /usr/sbin/後查看狀態

技術分享圖片

此時直接去查看其他兩個節點狀態發現報錯,第二天早上開機後竟然好了,肯能是重啟的緣故,先上圖其他兩臺的狀態

技術分享圖片

技術分享圖片

從上面可以看到,本博主前兩臺主機名是一樣的,這是由於本博主之前搭建虛擬機時采用的復制虛擬機,導致虛擬機主機名一致,為了進行rabbitMQ集群,我們需要對三臺主機設置主機名並進行綁定,本博主決定分別設置其主機名為rabbitA,rabbitB和rabbitC,並且一定要確保集群中每臺節點機器上的hosts文件應包含集群內所有節點的信息以保證互相解析。在未進行配置的情況下,當我們在加入節點到另一個節點時報錯如下:

技術分享圖片

接下來我們進行每臺主機的hosts配置:

技術分享圖片

技術分享圖片

技術分享圖片

註意也要同時修改

技術分享圖片

然後重啟生效如下,主機名變為rabbitA,:

技術分享圖片

設置完成,我們相互ping一下,看是否可以相互連接

技術分享圖片

我們再次加入節點時,仍然報錯如下:

技術分享圖片

到此,根據網上各種情況排查發現都不行,什麽情況呢,主機名,cookie值,防火墻都排出了,就剩安裝順序了,莫非真的必須先更改主機名,再安裝rabbitmq才行嗎。各位大神,知道的留個言

官網英文版學習——RabbitMQ學習筆記(十)RabbitMQ集群