原理:
Rabbitmq的鏡像集群實際上是在普通集群的基礎(chǔ)上增加了策略,它需要先按照普通集群的方式進行部署,部署完成之后再通過創(chuàng)建鏡像隊列的策略實現(xiàn)主備節(jié)點消息同步。也就是說,每個備用節(jié)點都有和主節(jié)點一樣的隊列,這個隊列是由主節(jié)點通過創(chuàng)建鏡像隊列所產(chǎn)生的,且這些備用節(jié)點能及時的同步主節(jié)點中隊列的入隊消息。當(dāng)消息設(shè)置了持久化時,每個節(jié)點都有屬于自己的本地消息持久化存儲機制。當(dāng)消息入隊和出隊時,所有關(guān)于對主節(jié)點的操作都會同步給備用節(jié)點用來更新。此集群模式在主節(jié)點宕機之后備用節(jié)點所保留的消息與主節(jié)點完全一致,即可實現(xiàn)高可用。
一、 普通集群 (主從集群)部署
1.修改三臺機器主機名和ip映射
更改三臺MQ節(jié)點的計算機名分別為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機器的.erlang.cookie文件復(fù)制到mq02和mq03機器(此文件在rabbitmq服務(wù)啟動時自動生成),因為節(jié)點之間需要通過此文件來判斷是否允許交流(判斷是否屬于集群內(nèi)部節(jié)點),如果三臺機器的此文件內(nèi)容不一致則集群無法啟動成功。此文件內(nèi)容一般是由不超過255個數(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.啟動rabbitmq
在三個節(jié)點分別執(zhí)行rabbitmq啟動命令:
systemctl start rabbitmq-server
5.在從節(jié)點(mq02和mq03)執(zhí)行加入集群命令:
在mq02、mq03分別執(zhí)行命令:
rabbitmqctl stop_app
#先停止服務(wù)(注:這里的參數(shù)stop_app和stop是不一樣的,stop是停掉服務(wù),stop_app是停掉這個節(jié)點,但是并沒有停止rabbitmq依賴的erlang進程
rabbitmqctl reset
# 重置狀態(tài)(注:這里重置節(jié)點將會把此節(jié)點下的所有數(shù)據(jù)全部清除,包括隊列、交換器、虛擬主機和用戶等)
rabbitmqctl join_cluster rabbit@mq01
# 節(jié)點加入集群, 初次加入集群必須通過這種加入基準(zhǔn)節(jié)點的方式。
rabbitmqctl start_app
# 啟動服務(wù)
6.查看集群狀態(tài)
任一節(jié)點執(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',[]}]}]
看到這些信息,說明集群已成功
7.登錄管理頁面,查看狀態(tài)
任一節(jié)點ip:15672 如無法訪問查看防火墻 ; 默認(rèn)用戶/密碼:guest/guest
可以看到三個節(jié)點的數(shù)據(jù)就表示成功了
8.集群命令
# 修改集群的名稱為rabbitmq_cluster
rabbitmqctl set_cluster_name rabbitmq_cluster
#停止rabbitmq2 rabbitmq3服務(wù)或者rabbitmqctl stop_app停止應(yīng)用后
#在rabbitmq1上 從集群中 移除節(jié)點
rabbitmqctl forget_cluster_node rabbit@mq02
rabbitmqctl forget_cluster_node rabbit@mq03
#重置數(shù)據(jù), 用戶名密碼都會要重新設(shè)置
rabbitmqctl stop_app
rabbitmqctl reset
#修改成磁盤(內(nèi)存)節(jié)點
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"}'
說明:策略正則表達式為'^'表示所有匹配所有隊列名稱 ^hello:匹配hello開頭隊列
策略說明
rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
-p Vhost: 可選參數(shù),針對指定vhost下的queue進行設(shè)置
Name: policy的名稱
Pattern: queue的匹配模式(正則表達式)
Definition:鏡像定義,包括三個部分ha-mode, ha-params, ha-sync-mode
ha-mode:指明鏡像隊列的模式,有效值為 all/exactly/nodes
all:表示在集群中所有的節(jié)點上進行鏡像
exactly:表示在指定個數(shù)的節(jié)點上進行鏡像,節(jié)點的個數(shù)由ha-params指定
nodes:表示在指定的節(jié)點上進行鏡像,節(jié)點名稱通過ha-params指定
ha-params:ha-mode模式需要用到的參數(shù)
ha-sync-mode:進行隊列中消息的同步方式,有效值為automatic和manual
priority:可選參數(shù),policy的優(yōu)先級
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)建賬號
$ rabbitmqctl add_user admin admin
# 設(shè)置用戶角色
$ rabbitmqctl set_user_tags admin administrator
# 設(shè)置用戶權(quán)限
# 該命令使用戶 admin 具有 / 這個 virtual host 中所有資源的配置、寫、讀權(quán)限以便管理其中的資源
$ rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
三、配置haproxy
1.安裝haproxy
yum install haproxy
2.配置代理負(fù)載
# 監(jiān)聽RabbitMQ管理頁面
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)聽HAProxy的管理頁面
listen private_monitoring
bind 0.0.0.0:1080 # 監(jiān)聽端口
mode http
option httplog
stats enable
stats refresh 30s # 統(tǒng)計頁面自動刷新時間
stats uri /haproxy?stats # 統(tǒng)計頁面url
stats realm Haproxy Manager # 統(tǒng)計頁面密碼框上提示文本
stats auth admin:passw0rd # 統(tǒng)計頁面用戶名和密碼設(shè)置
# states hide-version # 隱藏統(tǒng)計頁面上HAProxy的版本信息
# HAProxy監(jiān)聽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 # 簡單輪詢
# check inter 5000 是檢測心跳,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.啟動haproxy
systemctl start proxy
打完收工??!
2023.7.14補充:
收工太早了。。。
想想 如果haproxy服務(wù)掛了 或者所在的服務(wù)器斷電了怎么搞?
所以需要對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é)議) 來解決單點失效的問題,它通常由一組一備兩個節(jié)點組成,同一時間內(nèi)只有主節(jié)點會提供對外服務(wù),并同時提供一個虛擬的 IP 地址(Virtual Internet Protocol Address ,簡稱 VIP) 。 如果主節(jié)點故障,那么備份節(jié)點會自動接管 VIP 并成為新的主節(jié)點 ,直到原有的主節(jié)點恢復(fù)。
相關(guān)配置網(wǎng)上一大堆,自己找吧。