Centos7部署RabbitMQ的映象佇列叢集

huan1993發表於2021-12-08

一、背景

上一章節中,我們學會了如何搭建一個單節點的RabbitMQ伺服器,但是單節點的RabbitMQ不可靠,如果單節點掛掉,則會導致訊息佇列不可用。此處我們搭建一個3個節點的RabbitMQ叢集,用於解決這個問題。

二、介紹RabbitMQ的叢集

1、叢集型別

預設情況下的RabbitMQ叢集只是後設資料(metadata)是同步的,佇列中的訊息是不同步的,這樣也是不安全的,需要配置成映象佇列,讓資料也冗餘到別的節點中,這樣才能保證一個節點掛掉,還可以對外提供服務。

後設資料:指的是佇列資訊、交換機資訊、繫結資訊等。

2、節點名的重要性

在叢集中,節點名必須要唯一,叢集中是通過節點名來進行聯絡的。
節點名的解釋

3、erlang cookie 的重要性

叢集節點中是通過什麼來認證的,從而讓叢集節點可以互相通訊,靠的就是 erlang cookie,因此叢集中的erlang cookie的值必須要一致。

1、erlang cookie檔案的位置

不同的作業系統這個檔案的位置是不一樣的。
erlang cookie檔案的位置
這個位置一般是在 /var/lib/rabbitmq/.erlang.cookie這個位置。

2、erlang cookie檔案的許可權

.erlang.cookie的檔案許可權一般給600就可以了,不要給太高或太低,否則叢集可能無法啟動。
erlang cookie檔案的許可權

4、叢集節點型別

RabbitMQ叢集分為磁碟節點記憶體節點
1、磁碟節點所有的資料都是存在磁碟上
2、記憶體節點的資料是存在記憶體中,但不是所有的資料都是存在記憶體中的,比如:訊息只會存在索引等。
3、在一個叢集中至少需要一個磁碟(disc)節點

5、叢集中加入節點

新加入的叢集的節點必須是一個全新的節點,不可以帶有資料,如果存在則需要在加入叢集的節點上執行rabbitmqctl reset

三、搭建一個RabbitMQ叢集

此處以3個Centos7伺服器來搭建一個RabbitMQ叢集。

主機名ip地址節點型別使用者名稱密碼management portamqp port
centos01192.168.56.101磁碟節點(disc)adminadmin156725672
centos02192.168.56.102磁碟節點(disc)adminadmin156725672
centos03192.168.56.103記憶體節點(ram)adminadmin156725672

  

1、配置3個伺服器都可以訪問各自的主機名

在3臺伺服器上都需要這樣操作
vim /etc/hosts


bash192.168.56.101 centos01
192.168.56.102 centos02
192.168.56.103 centos03

2、同步各個節點的erlang cookie

如果cookie檔案不存在,則可以啟動一個RabbitMQ節點,然後在複製過去,在複製的過程中,需要保證 RabbitMQ節點最好都不要啟動。

在centos01伺服器上操作

scp /var/lib/rabbitmq/.erlang.cookie root@192.168.56.102:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.56.103:/var/lib/rabbitmq/.erlang.cookie

3、建立叢集

1、centos01伺服器上操作

rabbitmq-server -detached

可以檢視/var/log/rabbitmq/rabbit\@centos01.log這個日誌檔案看是否啟動成功。

2、放行叢集通訊埠等

firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=4369/tcp --permanent
firewall-cmd --zone=public --add-port=25672/tcp --permanent

3、centos02加入centos01

rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@centos01
rabbitmqctl start_app

4、centos03加入centos02

rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@centos02 --ram
rabbitmqctl start_app

5、檢視叢集是否構建完成

檢視叢集狀態

6、將centos03叢集移除

1、將需要被移除的節點停止

rabbitmqctl stop

2、在另外啟動的節點上執行

rabbitmqctl forget_cluster_node rabbit@centos03

3、重新加入叢集中

在啟動的時候可能報如下錯誤"Node rabbit@centos03 thinks it's clustered with node rabbit@centos02, but rabbit@centos02 disagrees"
再次加入啟動時報錯
這個時候我們需要刪除rm -rvf /var/lib/rabbitmq/mnesia/這個目錄,然後在次執行加入叢集的命令即可。

rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@centos02 --ram
rabbitmqctl start_app

四、配置映象叢集

1、普通叢集

經過上方步驟構成的叢集是一個普通的叢集,只是佇列中的後設資料共享,而佇列中的資料是具體儲存到某個節點上的。
可以看到佇列是在具體的某個節點上
這樣夠不成高可用,如果這個節點掛掉的話,則這個佇列的資料還是不可以消費的,也無法往這個佇列中傳送資料。那麼如果解決這個問題呢,答案是使用映象佇列叢集。

2、映象佇列叢集

在預設的虛擬主機(/)所有的佇列都配置成映象佇列。(ha-all只是取的名字)

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

建立完映象佇列後的結果
建立完映象佇列後發現,佇列在所有的節點上都存在。

映象佇列的高階用法,參考官方文件 https://www.rabbitmq.com/ha.html

五、參考文件

1、RabbitMQ官方叢集搭建
2、映象佇列的用法

相關文章