Centos7部署RabbitMQ的映象佇列叢集

huan1993發表於2021-12-08

一、背景

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

二、介紹RabbitMQ的叢集

1、叢集型別

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

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

2、節點名的重要性

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

叢集節點中是通過什麼來認證的,從而讓叢集節點可以互相通訊,靠的就是 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 port amqp port
centos01 192.168.56.101 磁碟節點(disc) admin admin 15672 5672
centos02 192.168.56.102 磁碟節點(disc) admin admin 15672 5672
centos03 192.168.56.103 記憶體節點(ram) admin admin 15672 5672

  

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

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


bash192.168.56.101 centos01
192.168.56.102 centos02
192.168.56.103 centos03

如果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、映象佇列的用法

相關文章