RabbiMQ簡介
RabbitMQ是用Erlang開發的,集群非常方便,因為Erlang天生就是一門分布式語言,但其本身并不支持負載均衡,
RabbitMQ模式
RabbitMQ模式大概分為以下三種:
(1)單一模式,
(2)普通模式(默認的集群模式),
(3)鏡像模式(把需要的佇列做成鏡像佇列,存在于多個節點,屬于RabbitMQ的HA方案,在對業務可靠性要求較高的場合中比較適用),
要實作鏡像模式,需要先搭建一個普通集群模式,在這個模式的基礎上再配置鏡像模式以實作高可用,
RabbitMQ特點
RabbitMQ的集群節點包括:記憶體節點、磁盤節點,RabbitMQ支持訊息的持久化
也就是資料寫在磁盤上,最合適的方案就是既有記憶體節點,又有磁盤節點,
節點環境
192.168.1.17 rabbitmq3 記憶體節點
192.168.1.18 rabbitmq2 記憶體節點
192.168.1.19 rabbitmq1 磁盤節點
注意: RabbitMQ集群節點必須在同一網段里,如果是跨廣域網,效果會變差,
RabbitMQ普通集群配置
配置hosts檔案
更改三臺MQ節點的計算機名分別為rabbitmq1、rabbitmq2 和rabbitmq3,然后修改hosts組態檔
#查看主機名
hostname
#修改主機名
hostnamectl set-hostname rabbitmq1
#或者
vim /etc/hostname //其他兩臺相同
rabbitmq1
vim /etc/hosts
192.168.1.17 rabbitmq3
192.168.1.18 rabbitmq2
192.168.1.19 rabbitmq1
#如果先安裝了rabbitMQ后改的主機名,啟動可能會有問題
#分別在三臺機器上 創建檔案
vim /etc/rabbitmq/rabbitmq-env.conf
NODENAME=rabbit@rabbitmq1 #注意這里的主機名修改對應的節點主機名
rabbitmq軟體安裝
分別安裝三臺的rabbitMQ
Centos離線安裝RabbitMQ并開啟MQTT
arm架構安裝RabbitMQ并升級erlang解決Requires: erlang >= 23.2
#洗掉rabbitmq之前啟動過生成的檔案
cd /var/lib/rabbitmq/
rm -rf *
#重啟
sudo systemctl restart rabbitmq-server.service
#停止
sudo systemctl stop rabbitmq-server.service
#查看服務啟動狀態
sudo systemctl status rabbitmq-server.service
#查看開機自啟動狀態
sudo systemctl is-enabled rabbitmq-server.service
#查看狀態
rabbitmqctl status
#創建用戶admin和密碼beyond_2021
rabbitmqctl add_user admin beyond_2021
#設定admin角色
rabbitmqctl set_user_tags admin administrator
#分配權限
rabbitmqctl set_permissions -p "/" admin '.*' '.*' '.*'
#RabbitMQ提供了一個非常友好的圖形化監控頁面插件(rabbitmq_management),讓我們可以一目了然看見Rabbit的狀態或集群狀態,
#查看插件安裝情況
rabbitmq-plugins list
#開啟圖形化監控頁面插件
rabbitmq-plugins enable rabbitmq_management //管理控制臺的默認埠是15672
#開啟mqtt插件
rabbitmq-plugins enable rabbitmq_mqtt //默認埠mqtt是1883 mqtt://192.168.1.17:1883
#開啟Mqtt的websocket插件
rabbitmq-plugins enable rabbitmq_web_mqtt //默認埠websocket是15675 ws://192.168.1.17:15675/ws path是/ws
#查看監聽埠(插件監控的埠是15672)
netstat -ntap |grep 5672
拷貝erlang.cookie
Rabbitmq的集群是依附于erlang的集群來作業的,所以必須先構建起erlang的集群景象,Erlang的集群中各節點是經由程序一個magic cookie來實作的,這個cookie存放在/var/lib/rabbitmq/.erlang.cookie中,檔案是400的權限,所以必須保證各節點cookie一致,不然節點之間就無法通信,
#查看rabbitmq1的節點的cookie檔案
cat /var/lib/rabbitmq/.erlang.cookie
HKHIEHFDVNFFGGPQ
#用scp的方式將rabbitmq1節點的.erlang.cookie的值復制到其他兩個節點中,
#rabbitmq1復制到其他兩個節點中
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.1.17:/var/lib/rabbitmq/.erlang.cookie
#重啟服務
sudo systemctl restart rabbitmq-server.service
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.1.18:/var/lib/rabbitmq/.erlang.cookie
sudo systemctl restart rabbitmq-server.service
#如果報錯: 參考鏈接: https://blog.csdn.net/u014209205/article/details/106647229
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq
mkdir -pv /var/log/rabbitmq
#報錯:
failed to open log file at '/var/log/rabbitmq/rabbit@rabbitmq3.log', reason: no such file or directory
#創建檔案
vim /var/log/rabbitmq/rabbit@rabbitmq3.log
failed to open log file at '/var/log/rabbitmq/rabbit@rabbitmq3_upgrade.log', reason: no such file or directory
#創建檔案
vim /var/log/rabbitmq/rabbit@rabbitmq3_upgrade.log
將rabbitmq2、rabbitmq3作為記憶體節點加入rabbitmq1節點集群中
在rabbitmq2 rabbitmq3下執行
rabbitmqctl stop_app //停掉rabbit應用
rabbitmqctl join_cluster --ram rabbit@rabbitmq1 //加入到記憶體節點
#也可以加入到磁盤節點
#rabbitmqctl join_cluster rabbit@rabbitmq1 //加入到磁盤節點
rabbitmqctl start_app //啟動rabbit應用
#如果加入集群報錯
Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq1
Error:
incompatible_feature_flags
表示: Rabbitmq各節點版本不一致導致的
(1)默認rabbitmq啟動后是磁盤節點,在這個cluster命令下,rabbitmq2和rabbitmq3是記憶體節點,rabbitmq1是磁盤節點,
(2)如果要使rabbitmq2、rabbitmq3都是磁盤節點,去掉–ram引數即可,
(3)如果想要更改節點型別,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必須停掉rabbit應用
在RabbitMQ集群中,必須至少有一個磁盤節點,否則佇列元資料無法寫入到集群中,當磁盤節點宕掉時,集群將無法寫入新的佇列元資料資訊,
保持版本一致,rabbitmq卸載與升級
我這里有rabbitmq3.8.2和3.8.18版本的rpm包,有需要可以給我留言或評論
#查看版本
rabbitmqctl version
erl
erl -version
#查詢rpm安裝包
rpm -qa rabbitmq
rpm -qa epel-release
rpm -qa erlang
#rpm卸載老版本
sudo rpm -e rabbitmq-server-3.8.2-1.el7.noarch.rpm
sudo rpm -e erlang-22.2.8-1.el7.x86_64.rpm
sudo rpm -e epel-release-7-11.noarch.rpm
#yum查詢安裝包與卸載
yum list | grep rabbitmq
yum -y remove rabbitmq-server.noarch
yum list | grep erlang
yum remove erlang.x86_64
yum remove socat
#安裝最新的,相同的版本
sudo rpm -ivh epel-release-7-13.noarch.rpm
sudo rpm -ivh erlang-23.3.4.4-1.el7.x86_64.rpm
sudo rpm -ivh rabbitmq-server-3.8.18-1.el7.noarch.rpm
#然后重新加入到集群
rabbitmqctl join_cluster --ram rabbit@rabbitmq1
查看集群狀態
#查看集群狀態
rabbitmqctl cluster_status
#顯示如下:
Cluster status of node rabbit@rabbitmq1 ...
Basics
Cluster name: rabbit@rabbitmq1
Disk Nodes
rabbit@rabbitmq2
rabbit@rabbitmq3
rabbit@rabbitmq1
Running Nodes
rabbit@rabbitmq2
rabbit@rabbitmq3
rabbit@rabbitmq1
Versions
rabbit@rabbitmq2: RabbitMQ 3.8.18 on Erlang 23.3.4.4
rabbit@rabbitmq3: RabbitMQ 3.8.18 on Erlang 23.3.4.4
rabbit@rabbitmq1: RabbitMQ 3.8.18 on Erlang 23.3.4.4
Maintenance status
Node: rabbit@rabbitmq2, status: not under maintenance
Node: rabbit@rabbitmq3, status: not under maintenance
Node: rabbit@rabbitmq1, status: not under maintenance
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@rabbitmq2, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbitmq2, interface: [::], port: 1883, protocol: mqtt, purpose: MQTT
Node: rabbit@rabbitmq2, interface: [::], port: 15675, protocol: http/web-mqtt, purpose: MQTT over WebSockets
Node: rabbit@rabbitmq2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq3, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbitmq3, interface: [::], port: 1883, protocol: mqtt, purpose: MQTT
Node: rabbit@rabbitmq3, interface: [::], port: 15675, protocol: http/web-mqtt, purpose: MQTT over WebSockets
Node: rabbit@rabbitmq3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq4, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbitmq1, interface: [::], port: 1883, protocol: mqtt, purpose: MQTT
Node: rabbit@rabbitmq1, interface: [::], port: 15675, protocol: http/web-mqtt, purpose: MQTT over WebSockets
Feature flags
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: maintenance_mode_status, state: enabled
Flag: quorum_queue, state: enabled
Flag: user_limits, state: enabled
Flag: virtual_host_metadata, state: enabled
rabbitmq集群節點的移除
#停止rabbitmq2 rabbitmq3服務或者rabbitmqctl stop_app停止應用后
#在rabbitmq1上 從集群中 移除節點
rabbitmqctl forget_cluster_node rabbit@rabbitmq2
rabbitmqctl forget_cluster_node rabbit@rabbitmq3
#重置資料, 用戶名密碼都會要重新設定
rabbitmqctl stop_app
rabbitmqctl reset
#修改成磁盤節點
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc(ram)
rabbitmqctl start_app
登錄rabbitmq web管理控制臺,創建新的佇列
打開瀏覽器輸入任意一個節點的: 比如17節點, http://192.168.1.17:15672, 輸入之前創建的用戶Username:admin,輸入Password:beyond_2021 ,登錄后出現如圖所示的界面,

根據界面提示創建一條佇列

佇列創建成功

在RabbitMQ集群中,必須至少有一個磁盤節點,否則佇列元資料無法寫入到集群中,當磁盤節點宕掉時,集群將無法寫入新的佇列元資料資訊,
RabbitMQ鏡像集群配置
上面已經完成RabbitMQ默認集群模式,但并不保證佇列的高可用性,盡管交換機、系結這些可以復制到集群里的任何一個節點,但是佇列內容不會復制,雖然該模式解決一專案組節點壓力,但佇列節點宕機直接導致該佇列無法應用,只能等待重啟,所以要想在佇列節點宕機或故障也能正常應用,就要復制佇列內容到集群里的每個節點,必須要創建鏡像佇列,
鏡像佇列是基于普通的集群模式的,然后再添加一些策略,所以你還是得先配置普通集群,然后才能設定鏡像佇列,我們就以上面的集群接著做,
設定的鏡像佇列可以通過開啟的網頁的管理端,也可以通過命令,這里說的是其中的網頁設定方式,
創建rabbitmq策略
在任一節點控制臺上創建策略
比如:在rabbitmq1節點的控制臺上創建策略:http://192.168.1.17:15672
(1)Web網頁配置 點擊Admin選單–->右側的Policies選項–->左側最下下邊的Add/update a policy,
(2)按照圖中的內容根據自己的需求填寫,

-
Name: my_liang
-
Pattern: ^
-
Definition: ha-mode=all
-
Apply to Queues
-
Name:策略名稱
-
Pattern:匹配的規則,(^ a)表示匹配a開頭的佇列,如果是匹配所有的佇列,那就是^.
-
Definition:使用ha-mode模式中的all,也就是同步所有匹配的佇列,問號鏈接幫助檔案,
(3)點擊Add policy添加策略

此時分別登陸rabbitmq2、rabbitmq3兩個節點的控制臺,可以看到上面添加的這個策略
添加佇列
添加佇列: 可以在控制臺添加,也可以用代碼或工具訂閱會自己創建佇列
控制臺創建
在rabbitmq1節點的控制臺上添加佇列
(1)點擊Queues選單–>左側下邊的Add a new queue
(2)輸入Name和Arguments引數的值,別的值默認即可

- Name:佇列名稱
- Durability:佇列是否持久化
- Node:訊息佇列的節點
- Auto delete:自動洗掉
- Arguments:使用的策略型別
(3)點擊Add queue

將滑鼠指向+2可以顯示出另外兩臺訊息節點,
往佇列里發送訊息
(1)點擊ab佇列按鈕
(2)拖動滾動條,點擊publish message
(3)填寫相關內容

- Persistent:表示持久化
- Headers:隨便填寫即可
- Properties:點擊問號,選擇一個訊息ID號
- Payload:訊息內容
(4)點擊Publish message按鈕 發送訊息
關閉訊息發送提示視窗
點擊queue按鈕,發現ab佇列的Ready和Total中多了一條訊息記錄,

做破壞性測驗
(1)將rabbitmq1節點的服務關閉,再通過rabbitmq2和rabbitmq3查看訊息記錄是否還存在,
rabbitmqctl stop_app //停掉rabbitmq1的rabbit應用
查看rabbitmq2或rabbitmq3節點的控制臺

從中可以看到ab佇列已經從之前的+2顯示成+1了,而且訊息記錄是存在的,
(2)再將rabbitmq2節點的服務關閉,通過rabbitmq3查看訊息記錄是否還存在,
rabbitmqctl stop_app //停掉rabbitmq2的rabbit應用
從rabbitmq3控制臺中可以看到ab佇列和訊息記錄還是存在的,只是變成了一個節點了,
(3)將rabbitmq1和rabbitmq2的服務再啟動起來
rabbitmqctl start_app //啟動rabbitmq1、rabbitmq2的rabbit應用

從中可以看到ab佇列后面+2變成了粉色,滑鼠指上去顯示鏡像無法同步,如果這時候停掉rabbitmq3節點的服務,那么佇列里面的訊息將會丟失,
采取的解決辦法是選擇在rabbitmq1或rabbitmq2節點上執行同步命令,
rabbitmqctl sync_queue ab //同步ab佇列
同步完成后,+2又變成了藍色,
這樣,我們就測驗了rabbitmq集群的破壞性測驗,說明集群配置成功,
參考鏈接:
https://blog.51cto.com/11134648/2155934
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297101.html
標籤:其他
