一、背景
在上一章節中,我們學會了如何搭建一個單節點的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