原理:
Rabbitmq的鏡像集群實(shí)際上是在普通集群的基礎(chǔ)上增加了策略,它需要先按照普通集群的方式進(jìn)行部署,部署完成之后再通過(guò)創(chuàng)建鏡像隊(duì)列的策略實(shí)現(xiàn)主備節(jié)點(diǎn)消息同步。也就是說(shuō),每個(gè)備用節(jié)點(diǎn)都有和主節(jié)點(diǎn)一樣的隊(duì)列,這個(gè)隊(duì)列是由主節(jié)點(diǎn)通過(guò)創(chuàng)建鏡像隊(duì)列所產(chǎn)生的,且這些備用節(jié)點(diǎn)能及時(shí)的同步主節(jié)點(diǎn)中隊(duì)列的入隊(duì)消息。當(dāng)消息設(shè)置了持久化時(shí),每個(gè)節(jié)點(diǎn)都有屬于自己的本地消息持久化存儲(chǔ)機(jī)制。當(dāng)消息入隊(duì)和出隊(duì)時(shí),所有關(guān)于對(duì)主節(jié)點(diǎn)的操作都會(huì)同步給備用節(jié)點(diǎn)用來(lái)更新。此集群模式在主節(jié)點(diǎn)宕機(jī)之后備用節(jié)點(diǎn)所保留的消息與主節(jié)點(diǎn)完全一致,即可實(shí)現(xiàn)高可用。
一、 普通集群 (主從集群)部署
1.修改三臺(tái)機(jī)器主機(jī)名和ip映射
更改三臺(tái)MQ節(jié)點(diǎn)的計(jì)算機(jī)名分別為mq0、mq1 和mq2,然后修改hosts配置文件
vi /etc/hosts
192.168.233.101 mq01
192.168.233.102 mq02
192.168.233.103 mq03
2.安裝rabbitmq
命令行安裝:
yum install -y rabbitmq-server
3.同步cookie文件
將mq01機(jī)器的.erlang.cookie文件復(fù)制到mq02和mq03機(jī)器(此文件在rabbitmq服務(wù)啟動(dòng)時(shí)自動(dòng)生成),因?yàn)楣?jié)點(diǎn)之間需要通過(guò)此文件來(lái)判斷是否允許交流(判斷是否屬于集群內(nèi)部節(jié)點(diǎn)),如果三臺(tái)機(jī)器的此文件內(nèi)容不一致則集群無(wú)法啟動(dòng)成功。此文件內(nèi)容一般是由不超過(guò)255個(gè)數(shù)字或字母組成的字符串構(gòu)成。
在mq01上執(zhí)行:
scp /var/lib/rabbitmq/.erlang.cookie root@mq02:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@mq03:/var/lib/rabbitmq/
4.啟動(dòng)rabbitmq
在三個(gè)節(jié)點(diǎn)分別執(zhí)行rabbitmq啟動(dòng)命令:
systemctl start rabbitmq-server
5.在從節(jié)點(diǎn)(mq02和mq03)執(zhí)行加入集群命令:
在mq02、mq03分別執(zhí)行命令:
rabbitmqctl stop_app
#先停止服務(wù)(注:這里的參數(shù)stop_app和stop是不一樣的,stop是停掉服務(wù),stop_app是停掉這個(gè)節(jié)點(diǎn),但是并沒(méi)有停止rabbitmq依賴的erlang進(jìn)程
rabbitmqctl reset
# 重置狀態(tài)(注:這里重置節(jié)點(diǎn)將會(huì)把此節(jié)點(diǎn)下的所有數(shù)據(jù)全部清除,包括隊(duì)列、交換器、虛擬主機(jī)和用戶等)
rabbitmqctl join_cluster rabbit@mq01
# 節(jié)點(diǎn)加入集群, 初次加入集群必須通過(guò)這種加入基準(zhǔn)節(jié)點(diǎn)的方式。
rabbitmqctl start_app
# 啟動(dòng)服務(wù)
6.查看集群狀態(tài)
任一節(jié)點(diǎn)執(zhí)行:
rabbitmqctl cluster_status
# rabbitmqctl cluster_status
Cluster status of node 'rabbit@mq03'
[{nodes,[{disc,['rabbit@mq01','rabbit@mq02','rabbit@mq03']}]},
{running_nodes,['rabbit@mq01','rabbit@mq02','rabbit@mq03']},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]},
{alarms,[{'rabbit@mq01',[]},
{'rabbit@mq02',[]},
{'rabbit@mq03',[]}]}]
看到這些信息,說(shuō)明集群已成功
7.登錄管理頁(yè)面,查看狀態(tài)
任一節(jié)點(diǎn)ip:15672 如無(wú)法訪問(wèn)查看防火墻 ; 默認(rèn)用戶/密碼:guest/guest
可以看到三個(gè)節(jié)點(diǎn)的數(shù)據(jù)就表示成功了
8.集群命令
# 修改集群的名稱為rabbitmq_cluster
rabbitmqctl set_cluster_name rabbitmq_cluster
#停止rabbitmq2 rabbitmq3服務(wù)或者rabbitmqctl stop_app停止應(yīng)用后
#在rabbitmq1上 從集群中 移除節(jié)點(diǎn)
rabbitmqctl forget_cluster_node rabbit@mq02
rabbitmqctl forget_cluster_node rabbit@mq03
#重置數(shù)據(jù), 用戶名密碼都會(huì)要重新設(shè)置
rabbitmqctl stop_app
rabbitmqctl reset
#修改成磁盤(pán)(內(nèi)存)節(jié)點(diǎn)
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc(ram)
rabbitmqctl start_app
二、鏡像集群部署
鏡像集群是基于普通主從集群的,
1.設(shè)置策略
在mq01執(zhí)行:
rabbitmqctl set_policy ha-all '^' '{"ha-mode":"all"}'
說(shuō)明:策略正則表達(dá)式為'^'表示所有匹配所有隊(duì)列名稱 ^hello:匹配hello開(kāi)頭隊(duì)列
策略說(shuō)明
rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
-p Vhost: 可選參數(shù),針對(duì)指定vhost下的queue進(jìn)行設(shè)置
Name: policy的名稱
Pattern: queue的匹配模式(正則表達(dá)式)
Definition:鏡像定義,包括三個(gè)部分ha-mode, ha-params, ha-sync-mode
ha-mode:指明鏡像隊(duì)列的模式,有效值為 all/exactly/nodes
all:表示在集群中所有的節(jié)點(diǎn)上進(jìn)行鏡像
exactly:表示在指定個(gè)數(shù)的節(jié)點(diǎn)上進(jìn)行鏡像,節(jié)點(diǎn)的個(gè)數(shù)由ha-params指定
nodes:表示在指定的節(jié)點(diǎn)上進(jìn)行鏡像,節(jié)點(diǎn)名稱通過(guò)ha-params指定
ha-params:ha-mode模式需要用到的參數(shù)
ha-sync-mode:進(jìn)行隊(duì)列中消息的同步方式,有效值為automatic和manual
priority:可選參數(shù),policy的優(yōu)先級(jí)
1.查看當(dāng)前策略
rabbitmqctl list_policies
2.添加策略
rabbitmqctl set_policy ha-all '^hei' '{"ha-mode":"all","ha-sync-mode":"automatic"}'
3.刪除策略
rabbitmqctl clear_policy ha-all
rabbitmq命令
# 創(chuàng)建賬號(hào)
$ rabbitmqctl add_user admin admin
# 設(shè)置用戶角色
$ rabbitmqctl set_user_tags admin administrator
# 設(shè)置用戶權(quán)限
# 該命令使用戶 admin 具有 / 這個(gè) virtual host 中所有資源的配置、寫(xiě)、讀權(quán)限以便管理其中的資源
$ rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
三、配置haproxy
1.安裝haproxy
yum install haproxy
2.配置代理負(fù)載
# 監(jiān)聽(tīng)RabbitMQ管理頁(yè)面
listen rabbitmq_admin
bind 0.0.0.0:15671
server rabbitmq01 192.168.233.101:15672
server rabbitmq02 192.168.233.102:15672
server rabbitmq03 192.168.233.103:15672
# 監(jiān)聽(tīng)HAProxy的管理頁(yè)面
listen private_monitoring
bind 0.0.0.0:1080 # 監(jiān)聽(tīng)端口
mode http
option httplog
stats enable
stats refresh 30s # 統(tǒng)計(jì)頁(yè)面自動(dòng)刷新時(shí)間
stats uri /haproxy?stats # 統(tǒng)計(jì)頁(yè)面url
stats realm Haproxy Manager # 統(tǒng)計(jì)頁(yè)面密碼框上提示文本
stats auth admin:passw0rd # 統(tǒng)計(jì)頁(yè)面用戶名和密碼設(shè)置
# states hide-version # 隱藏統(tǒng)計(jì)頁(yè)面上HAProxy的版本信息
# HAProxy監(jiān)聽(tīng)RabbitMQ集群
listen rabbitmq_cluster
bind 0.0.0.0:5671
mode tcp # 配置TCP模式
timeout client 3h
timeout server 3h
timeout connect 3h
option tcplog
balance roundrobin # 簡(jiǎn)單輪詢
# check inter 5000 是檢測(cè)心跳,rise 2 是2次正確認(rèn)為服務(wù)器可用,fall 3 是3次失敗認(rèn)為服務(wù)器不可用
server rabbitmq01 192.168.233.101:5672 check inter 5000 rise 2 fall 2
server rabbitmq02 192.168.233.102:5672 check inter 5000 rise 2 fall 2
server rabbitmq03 192.168.233.103:5672 check inter 5000 rise 2 fall 2
3.啟動(dòng)haproxy
systemctl start proxy
打完收工??!
2023.7.14補(bǔ)充:
收工太早了。。。
想想 如果haproxy服務(wù)掛了 或者所在的服務(wù)器斷電了怎么搞?
所以需要對(duì)ha做些工作,結(jié)合KeepAlived,架構(gòu)圖如下:

部署結(jié)構(gòu):
rabbitmq01 服務(wù)器:部署 RabbitMQ + HAProxy + KeepAlived ;
rabbitmq02 服務(wù)器:部署 RabbitMQ + HAProxy + KeepAlived ;
rabbitmq03 服務(wù)器:部署 RabbitMQ
什么是KeepAlived?
KeepAlived 采用 VRRP (Virtual Router Redundancy Protocol,虛擬路由冗余協(xié)議) 來(lái)解決單點(diǎn)失效的問(wèn)題,它通常由一組一備兩個(gè)節(jié)點(diǎn)組成,同一時(shí)間內(nèi)只有主節(jié)點(diǎn)會(huì)提供對(duì)外服務(wù),并同時(shí)提供一個(gè)虛擬的 IP 地址(Virtual Internet Protocol Address ,簡(jiǎn)稱 VIP) 。 如果主節(jié)點(diǎn)故障,那么備份節(jié)點(diǎn)會(huì)自動(dòng)接管 VIP 并成為新的主節(jié)點(diǎn) ,直到原有的主節(jié)點(diǎn)恢復(fù)。
相關(guān)配置網(wǎng)上一大堆,自己找吧。