一、背景
在上一章節中,我們學會了如何搭建一個單節點的RabbitMQ伺服器,但是單節點的RabbitMQ不可靠,如果單節點掛掉,則會導致訊息佇列不可用。此處我們搭建一個3個節點的RabbitMQ叢集,用於解決這個問題。
二、介紹RabbitMQ的叢集
1、叢集型別
預設情況下的RabbitMQ叢集只是後設資料(metadata)是同步的,佇列中的訊息是不同步的,這樣也是不安全的,需要配置成映象佇列,讓資料也冗餘到別的節點中,這樣才能保證一個節點掛掉,還可以對外提供服務。
後設資料
:指的是佇列資訊、交換機資訊、繫結資訊等。
2、節點名的重要性
在叢集中,節點名必須要唯一,叢集中是通過節點名來進行聯絡的。
3、erlang cookie 的重要性
叢集節點中是通過什麼來認證的,從而讓叢集節點可以互相通訊,靠的就是 erlang cookie
,因此叢集中的erlang cookie的值必須要一致。
1、erlang cookie檔案的位置
不同的作業系統這個檔案的位置是不一樣的。
這個位置一般是在 /var/lib/rabbitmq/.erlang.cookie
這個位置。
2、erlang cookie檔案的許可權
.erlang.cookie
的檔案許可權一般給600
就可以了,不要給太高或太低,否則叢集可能無法啟動。
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
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