Centos7部署RabbitMQ的鏡像隊列集群


一、背景

上一章節中,我們學會了如何搭建一個單節點的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、鏡像隊列的用法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM