RabbitMQ 從入門到精通:從工作模式到集群部署實戰(一)

#作者:閆乾苓

文章目錄

  • RabbitMQ簡介
    • RabbitMQ與VMware的關系
    • 架構
    • 工作流程
    • RabbitMQ 隊列工作模式及適用場景
      • 簡單隊列模式(Simple Queue)
      • 工作隊列模式(Work Queue)
      • 發布/訂閱模式(Publish/Subscribe)
      • 路由模式(Routing)
      • 主題模式(Topics)
      • RPC模式(Remote Procedure Call)
    • RabbitMQ Streams流工作模式及適用場景
      • 多消費者共享消息模式
    • 消息重放與時間點讀取模式
  • 安裝部署
    • 官方支持及版本選擇
    • RabbitMQ與Erlang的版本匹配
    • 容器環境部署
    • Docker部署單實例
    • Kubernetes環境部署RabbitMQ集群
      • 1.安裝RabbitMQ Cluster Kubernetes Operator
      • 2.通過Operator創建RabbitMQ 集群
      • 3.RabbitMQ集群節點擴縮容
      • 4.安裝RabbitMQ Messaging Topology Operator

RabbitMQ簡介

RabbitMQ 是一款可靠且成熟的消息傳遞和流式傳輸代理,可輕松部署在云環境、本地和本地計算機上。目前全球有數百萬用戶在使用。

它實現了高級消息隊列協議(AMQP),并且支持多種消息協議(如MQTT、STOMP)廣泛應用于分布式系統和微服務架構中,提供高性能、可靠的消息傳遞服務。其主要特點包括多協議支持、豐富的消息路由功能、消息持久化、高可用性、插件系統以及管理和監控功能等。

自 2007 年首次發布以來,RabbitMQ 一直是免費的開源軟件,RabbitMQ 在 Apache 許可證 2.0 和 Mozilla 公共許可證 2 下獲得雙重許可。可以自由地使用和修改 RabbitMQ。

RabbitMQ與VMware的關系

收購歷程

  • 2009年,SpringSource收購了Rabbit Technologies Ltd.,這推動了RabbitMQ的發展。隨后,SpringSource成為Pivotal(由EMC、VMware和GE聯合成立的公司)的一部分,RabbitMQ也因此繼續得到支持和發展。
  • 2013年,RabbitMQ的主要開發者成立了RabbitMQ Inc.,這是一家專注于RabbitMQ商業支持和服務的獨立公司。
  • 2019年,VMware收購了Pivotal,RabbitMQ因此成為了VMware的一部分。
    當前關系
  • 作為VMware旗下的一部分,RabbitMQ繼續得到VMware的支持和發展。RabbitMQ仍然是一個活躍的開源項目,定期發布新版本,添加新功能和改進。
  • VMware為RabbitMQ提供了商業支持,并推動了其在企業中的應用和普及。

架構

在這里插入圖片描述

  • Broker:簡單來說就是消息隊列服務器實體。
  • Exchange:消息交換機,它指定消息按什么規則,路由到哪個隊列。
  • Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
  • Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
  • Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
  • vhost:虛擬主機,一個broker里可以開設多個vhost,用作不同用戶的權限分離。
  • producer:消息生產者,就是投遞消息的程序。
  • consumer:消息消費者,就是接受消息的程序。
  • channel:消息通道,在客戶端的每個連接里,可建立多個channel,每個channel代表一個會話任務

工作流程

  1. 生產者發送消息:生產者通過RabbitMQ的客戶端庫創建消息,并指定交換機的名稱和路由鍵。然后,生產者將消息發送到RabbitMQ服務器上的指定交換機。
  2. 交換機接收并路由消息:交換機接收到生產者的消息后,根據配置的路由規則和路由鍵將消息分發到相應的隊列中。如果消息沒有匹配到任何隊列,則可能會被丟棄或返回給生產者。
  3. 消費者消費消息:消費者連接到RabbitMQ服務器,并監聽指定的隊列。當隊列中有新消息時,消費者從隊列中獲取并處理消息。處理完成后,消費者可以選擇發送確認消息給RabbitMQ服務器,以表示消息已被成功處理。

RabbitMQ 隊列工作模式及適用場景

RabbitMQ 3.9.0 或更高版本適用

簡單隊列模式(Simple Queue)

在這里插入圖片描述

  • 特點:最簡單的收發模式,只包含一個生產者和一個消費者。生產者將消息發送到隊列中,消費者從隊列中接收消息。
  • 場景:適用于消息處理流程簡單、不需要并發處理的場景。例如,一個OA系統中,用戶通過接收手機驗證碼進行注冊,驗證碼被放入消息隊列,短信服務從隊列中獲取驗證碼并發送給用戶。

工作隊列模式(Work Queue)

在這里插入圖片描述

  • 特點:多個消費者可以監聽同一個隊列,但每個消息只能被一個消費者處理。RabbitMQ通過內部機制確保消息的唯一性,避免重復處理。此外,消息隊列默認采用輪詢的方式將消息平均發送給消費者。
  • 場景:適用于分布式任務處理場景,多個消費者共享處理一組任務,從而提高系統的并發性能和吞吐量。例如,一個電商平臺中,有多個訂單服務,用戶下單時,任意一個訂單服務消費用戶的下單請求生成訂單即可。
  • 動態負載均衡:RabbitMQ會根據消費者的處理能力動態分配消息。如果某個消費者處理速度較快,它會接收到更多的消息;如果某個消費者處理速度較慢或處于空閑狀態,它會接收到較少的消息。

發布/訂閱模式(Publish/Subscribe)

在這里插入圖片描述

  • 特點:相對于簡單隊列模式和工作隊列模式,發布/訂閱模式多了一個交換機(Exchange)。生產者先把消息發送到交換機,再由交換機把消息發送到綁定的隊列中,每個綁定的隊列都能收到由生產者發送的消息。
  • 場景:適用于需要將消息廣播給多個消費者的場景。例如,用戶通知系統,當用戶充值成功或轉賬完成時,系統通過短信、郵件等多種方式通知用戶。

路由模式(Routing)

在這里插入圖片描述

  • 特點:在發布/訂閱模式的基礎上,增加了路由鍵(Routing Key)的概念。生產者發送消息時,需要指定一個路由鍵,交換機根據路由鍵將消息發送到匹配的隊列中。
  • 場景:適用于需要根據不同的路由鍵將消息發送到不同隊列的場景。例如,一個日志系統可能需要根據日志級別(INFO、ERROR等)將日志發送到不同的隊列中。

主題模式(Topics)

  • 特點:主題模式是一種更靈活的路由模式,它允許使用通配符(如和#)來匹配路由鍵。例如,可以匹配一個單詞,#可以匹配零個或多個單詞。
  • 場景:適用于需要根據復雜的路由規則將消息發送到不同隊列的場景。例如,一個新聞系統可能需要根據新聞類別(如體育、娛樂等)和新聞來源(如新浪、騰訊等)將新聞發送到不同的隊列中。

RPC模式(Remote Procedure Call)

在這里插入圖片描述

  • 特點:RPC模式允許一個客戶端遠程調用另一個服務的方法,就像調用本地方法一樣。RabbitMQ提供了一個簡單的RPC機制,使得客戶端可以發送請求到隊列中,服務器監聽隊列并處理請求,然后將結果發送回客戶端。
  • 場景:適用于需要遠程調用服務的場景。例如,一個分布式系統中,一個服務需要調用另一個服務的方法來獲取數據或執行操作。

以上是RabbitMQ的六種主要隊列工作模式,每種模式都有其獨特的特點和適用場景。根據實際需求選擇合適的工作模式,可以提高系統的性能、可靠性和可擴展性。

RabbitMQ Streams流工作模式及適用場景

RabbitMQ中的Streams是一種持久復制數據結構,它提供了與傳統隊列不同的消息存儲和消費方式。

多消費者共享消息模式

在這里插入圖片描述
場景描述:
當需要將相同的消息傳遞給多個訂閱者時,傳統的RabbitMQ隊列需要為每個消費者綁定一個專用隊列,這在消費者數量較大時可能變得效率低下,特別是當需要持久性和/或復制時。而Streams允許任意數量的消費者以非破壞性的方式消費來自同一隊列的相同消息,從而避免了綁定多個隊列的需要。

特點:

  • 消息持久化:Streams默認持久化隊列和消息,確保消息不會因消費者消費而被刪除。
  • 非破壞性消費:消費者可以多次讀取相同的消息,而不會導致消息從隊列中刪除。
  • 負載均衡:Stream消費者可以從副本中讀取數據,允許讀取負載在集群中分布。

消息重放與時間點讀取模式

在這里插入圖片描述
場景描述:
傳統的RabbitMQ隊列具有破壞性消費行為,即當消費者用完消息時,消息將從隊列中刪除,因此不可能重新讀取已消費的消息。而Streams允許消費者從日志中的任何點連接并從那里讀取,這為實現消息重放和從特定時間點讀取消息提供了可能。

特點:

  • 消息重放:消費者可以從隊列的開始或任意時間點開始讀取消息,實現消息的重放功能。
  • 時間點讀取:通過指定時間戳或偏移量,消費者可以精確地讀取隊列中特定位置的消息。
  • 高性能設計:Streams旨在以有效的方式存儲大量數據,并將內存開銷降至最低,同時提供與現有基于日志的消息傳遞系統競爭的吞吐量。

在實際應用中,RabbitMQ Streams的這兩種模式并不是孤立的,而是可以根據具體需求靈活組合使用的。例如,在一個需要同時支持多消費者共享消息和消息重放的場景中,可以配置一個Streams隊列,并允許任意數量的消費者以非破壞性的方式讀取消息,同時根據需要實現消息的重放和從特定時間點讀取消息的功能。

安裝部署

官方支持及版本選擇

本文檔以v3.13.7版本進行說明
在這里插入圖片描述

RabbitMQ與Erlang的版本匹配

RabbitMQ使用Erlang語言編寫, Erlang是RabbitMQ的核心開發語言。Erlang作為一種函數式編程語言,具有并發性強、可靠性高等特點,非常適合用于開發高性能、高可靠性的消息中間件。
RabbitMQ的許多核心功能和特性都是基于Erlang的并發模型和可靠性機制實現的。因此,Erlang的運行環境對RabbitMQ的穩定性和性能具有重要影響。
安裝RabbitMQ之前,可以訪問RabbitMQ官網(https://www.rabbitmq.com/docs/which-erlang)查看所需的Erlang版本,并確保兩者版本匹配,以發揮最佳性能。

下面是RabbitMQ 3.13.x 與Erlang的版本適配關系截圖:
在這里插入圖片描述

容器環境部署

操作系統版本:
BigCloud Enterprise Linux For Euler 21.10
(GNU/Linux 4.19.90-2107.6.0.0100.oe1.bclinux.x86_64 x86_64)

Docker環境的安裝請自行查閱相關文檔。

Docker版本信息:

root@k8s-master1:[/root]docker version
Client:Version:           20.10.14API version:       1.41Go version:        go1.16.15Git commit:        a224086Built:             Thu Mar 24 01:45:09 2022OS/Arch:           linux/amd64Context:           defaultExperimental:      trueServer: Docker Engine - CommunityEngine:Version:          20.10.14API version:      1.41 (minimum version 1.12)Go version:       go1.16.15Git commit:       87a90dcBuilt:            Thu Mar 24 01:49:54 2022OS/Arch:          linux/amd64Experimental:     truecontainerd:Version:          v1.5.11GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8runc:Version:          1.0.3GitCommit:        v1.0.3-0-gf46b6ba2docker-init:Version:          0.19.0GitCommit:        de40ad0

Docker部署單實例

使用docker啟動單機實例,一般用于學習測試,因其不具體高可用,不建議生產環境使用。

[root@k8s-master2 ~]# docker run -it -- rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.13.6-management

參數:

--it		啟動一個交互式shell終端
--rm		容器停止后自動刪除容器
--name	    給定容器啟動后的名字
-p 		    端口映射 [宿主機端口] :[容器內端口]

如果需要以daemon后臺方式啟動容器,請使用以下命令:

[root@k8s-master2 ~]# docker run -d --name rabbitmq2 -p 5673:5672 -p 15673:15672 rabbitmq:3.13.6-management

參數:

	-d	容器以后臺方式啟動,不可以與—rm參數同時使用-p  將容器內的5672端口映射到宿主機5673端口,注意端口沖突。

容器啟動后顯示如下內容即為啟動成功。

Time to start RabbitMQ: 9033 ms

另外可以通查看端口是正常監聽,5672為RabbitMQ服務默認端口,15672是RabbitMQ管理界面的默認端口。

[root@k8s-master2 ~]# ss -ntlp |grep 5672
LISTEN   0         128                  0.0.0.0:15672            0.0.0.0:*       users:(("docker-proxy",pid=53310,fd=4))                               
LISTEN   0         128                  0.0.0.0:5672             0.0.0.0:*       users:(("docker-proxy",pid=53381,fd=4))                               
LISTEN   0         128                     [::]:15672               [::]:*       users:(("docker-proxy",pid=53317,fd=4))                               
LISTEN   0         128                     [::]:5672                [::]:*       users:(("docker-proxy",pid=53395,fd=4))

通過瀏覽器訪問web UI 管理頁面,默認賬號和密碼都為:guest
在這里插入圖片描述

Kubernetes環境部署RabbitMQ集群

在Kubernetes(以下簡稱k8s)上部署RabbitMQ集群,官方文檔使用Operator進行部署。
RabbitMQ 團隊開發并維護兩個kubernetes Operators

1.安裝RabbitMQ Cluster Kubernetes Operator

功能說明
自動配置、管理和操作在 Kubernetes 上運行的 RabbitMQ 集群
源碼:https://github.com/rabbitmq/cluster-operator
operator版本
v2.11.0
https://github.com/rabbitmq/cluster-operator/releases

operator適配的rabbitmq和k8s版本
默認使用 RabbitMQ 3.13.7
可適用于任何受支持的 RabbitMQ 版本和 Kubernetes 版本。官方建議使用Kubernetes 1.19 或更高版本(建議使用1.25 或更高版本,特別是對于使用RabbitMQ Streams的環境)

安裝步驟

# 下載cluster-operator.yml
wget https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml# 將yaml文件apply到k8s集群
kubectl apply –f cluster-operator.yml
# 以下為k8s的輸出信息,可以看到都創建了哪些資源
namespace/rabbitmq-system created
customresourcedefinition.apiextensions.k8s.io/rabbitmqclusters.rabbitmq.com created
serviceaccount/rabbitmq-cluster-operator created
role.rbac.authorization.k8s.io/rabbitmq-cluster-leader-election-role created
clusterrole.rbac.authorization.k8s.io/rabbitmq-cluster-operator-role created
clusterrole.rbac.authorization.k8s.io/rabbitmq-cluster-service-binding-role created
rolebinding.rbac.authorization.k8s.io/rabbitmq-cluster-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/rabbitmq-cluster-operator-rolebinding created
deployment.apps/rabbitmq-cluster-operator created

安裝 Cluster Operator 會創建大量 Kubernetes 資源

  • 一個新的命名空間rabbitmq-system。
    Cluster Operator 部署在此命名空間中創建,并在此名稱空間中創建rabbitmq的控制器的相關資源,確保pod rabbitmq-cluster-operato-xxxx-xxxx 為running狀態,可能會因網絡原因pod的imags 不能下載導致pod啟動失敗,可視具體情況進行修復。
root@k8s-master1:[/root/rabbitmq]kubectl get all -n rabbitmq-system
NAME                                             READY   STATUS    RESTARTS      AGE
pod/rabbitmq-cluster-operator-5645454b96-mpt4h   1/1     Running   2 (51s ago)   52sNAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/rabbitmq-cluster-operator   1/1     1            1           52sNAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/rabbitmq-cluster-operator-5645454b96   1         1         1       52s
  • 新的自定義資源rabbitmqclusters.rabbitmq.com
    自定義資源允許我們定義用于創建 RabbitMQ 集群的 API。
root@k8s-master1:[/root/rabbitmq]kubectl get customresourcedefinitions.apiextensions.k8s.io |grep rabbit
rabbitmqclusters.rabbitmq.com                          2024-10-23T08:41:55Z
  • 一些 RBAC 角色
    Operator需要這些角色來創建、更新和刪除 RabbitMQ 集群

2.通過Operator創建RabbitMQ 集群

通過以上步驟我們已經部署了 Operator,現在可以創建 RabbitMQ 集群了。

創建RabbitMQ 集群,通過編寫k8s的yaml資源清單文件,可以參考官方示例:
https://github.com/rabbitmq/cluster-operator/tree/main/docs/examples

準備RabbitMQ 集群的yaml文件
下面即為參考官方示例編寫的創建RabbitMQ 集群的yaml文件:

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:name: rabbitmq-cluster-01namespace: rabbitmq-cluster-01
spec:replicas: 3image: rabbitmq:3.12.16-managementresources:requests:cpu: 2000mmemory: 4Gilimits:cpu: 2000mmemory: 4Girabbitmq:additionalConfig: |cluster_partition_handling = pause_minoritydisk_free_limit.relative = 1.0collect_statistics_interval = 10000channel_max = 1050vm_memory_high_watermark_paging_ratio = 0.7total_memory_available_override_value = 4GBpersistence:storageClassName: nfsstorage: "20Gi"affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: app.kubernetes.io/nameoperator: Invalues:- rabbitmq-cluster-01podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: app.kubernetes.io/nameoperator: Invalues:- rabbitmq-cluster-01topologyKey: kubernetes.io/hostnameservice:type: NodePort

yaml資源清單文件詳細解釋

  • 基本信息
    apiVersion: 指定了所使用的 API 版本,這里是 rabbitmq.com/v1beta1。
    kind: 表示資源類型,這里是 RabbitmqCluster,意味著這是一個 RabbitMQ 集群的定義。
    metadata:
    name: 集群的名稱是 rabbitmq-cluster01。
    namespace: 資源所在的命名空間是 rabbitmq-test。

  • 集群規格
    spec:
    replicas: 集群中的副本數量,這里設置為 3,表示會運行 3 個 RabbitMQ 實例。
    image: 使用的 RabbitMQ 鏡像版本是 rabbitmq:3.13.7-management,包含管理插件。
    在實際生產環境部署時,為避免因網絡等因素導致鏡像下載失敗,可以提前下載好鏡像,并上傳到內網私有鏡像倉庫(harbor,nexus等),在此處將鏡像改為從內網私有鏡像倉庫下載。

  • 資源管理
    resources:
    requests: 資源請求,表示每個 Pod 至少需要 500m 的 CPU 和 1Gi 的內存。
    limits: 資源限制,表示每個 Pod 最多可以使用 2000m 的 CPU 和 4Gi 的內存。
    請根據業務并發或者長期監控,酌情調整此處的資源值。

  • RabbitMQ 配置
    rabbitmq:
    additionalConfig: 自定義 RabbitMQ 配置參數,后面將對一下參數進行詳細描述。此處簡要標出主要意思。
    cluster_partition_handling = pause_minority: 當集群分區時,暫停少數節點。
    disk_free_limit.relative = 1.0: 設置磁盤空間限制。
    collect_statistics_interval = 10000: 統計收集間隔設置為 10 秒。
    channel_max = 1050: 每個節點最多支持 1050 個通道。
    vm_memory_high_watermark_paging_ratio = 0.7: 設置高水位標記。
    total_memory_available_override_value = 4GB: 內存可用總量設置為 4GB。

  • 持久化設置
    persistence:
    storageClassName: 指定存儲類為的名字 nfs,用于持久化存儲。需要注意的是,nfs的持久化存儲需要事先部署完成,也可以是其他類型的后端持久化存儲比如cephfs.后端相關。
    storage: 為 RabbitMQ 指定了 20Gi 的存儲空間。

  • 調度策略
    affinity: 親和性設置,確保 Pod 在不同節點上調度。
    podAntiAffinity: 指定 Pod 反親和性規則,確保同一 RabbitMQ 集群的 Pod 不會在同一節點上運行,提升集群高可用性

另外如果想將rabbit的pod調度到指定的node節點,也就使用node節點親和性并給某些node節點打labels實現。

    podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: app.kubernetes.io/nameoperator: Invalues:- rabbitmq-cluster
  • 服務配置
    service:
    type: 設置svc類型為NodePort,這樣方便通過節點的 IP 地址和指定端口進行訪問。比如通過瀏覽器訪問RabbitMQ的web UI 管理界面。

此處經查看不支持設置固定的NodePort端口。
在這里插入圖片描述
如果image為私有倉庫,并且 需要賬號密碼身份驗證,則需要按照以下步驟允許 Kubernetes 拉取映像

apiVersion: v1
kind: ServiceAccount
metadata:name: rabbitmq-cluster-operatornamespace: rabbitmq-systemkubectl -n rabbitmq-system create secret \
docker-registry rabbitmq-cluster-registry-access \
--docker-server=DOCKER-SERVER \
--docker-username=DOCKER-USERNAME \
--docker-password=DOCKER-PASSWORD

DOCKER-SERVER 私有倉庫的URL。
DOCKER-USERNAME 私有倉庫的用戶名。
DOCKER-PASSWORD 是私有倉庫的密碼。

比如

kubectl -n rabbitmq-system create secret \
docker-registry rabbitmq-cluster-registry-access \
--docker-server=docker.io/my-registry \
--docker-username=my-username \
--docker-password=example-password1

將創建RabbitMQ集群的資源清單文件應用到k8s

root@k8s-master1:[/root/rabbitmq]kubectl apply -f rabbitmq-cluster.yaml
rabbitmqcluster.rabbitmq.com/rabbitmq-cluster01 configured

等待幾分鐘后,查看rabbitmq-test 名稱空間中資源創建是符合預期,重點關注pod的數量和運行狀態,是否調度到了不同的node節點。另外還有webUI的端口及nodeport隨機映射端口,此處為15672映射為64650。
在這里插入圖片描述
獲取Management UI default-user賬號和密碼

# 查看default-user的secrets 名稱
root@k8s-master1:[/root]kubectl get secrets -n rabbitmq-test
NAME                                    TYPE                                  DATA   AGE
default-token-rc7gm                     kubernetes.io/service-account-token   3      162m
rabbitmq-cluster01-default-user         Opaque                                7      157m
rabbitmq-cluster01-erlang-cookie        Opaque                                1      157m
rabbitmq-cluster01-server-token-w7k9f   kubernetes.io/service-account-token   3      162m# 通過secrets 獲取賬號和密碼
root@k8s-master1:[/root]username="$(kubectl get secrets rabbitmq-cluster01-default-user -n rabbitmq-test -o jsonpath='{.data.username}' | base64 --decode)"
root@k8s-master1:[/root]echo $username
default_user_iZYCpOBVHIirdDvfzGTroot@k8s-master1:[/root]password="$(kubectl get secrets rabbitmq-cluster01-default-user -n rabbitmq-test -o jsonpath='{.data.password}' | base64 --decode)"
root@k8s-master1:[/root]echo $password
zrGIIoeH0q1d9N8r1yhABG-OcmNzdKoc

通過瀏覽器訪問Management UI
http://192.168.123.240:64650 輸入上面步驟獲取的賬號和密碼登錄。
在這里插入圖片描述
登錄后查看集群狀態正常,可以進行后續其他操作。
在這里插入圖片描述

RabbitMQ集群參數優化
集群的參數優化,RabbitMQ operator 提供了在創建集群時在YAML文件中增加相關的配置的參數的方式對集群參數進行優化,如下圖
在這里插入圖片描述
集群創建后,會在RabbitMQ 集群節點pod中存放到以下文件中:
/etc/rabbitmq/conf.d/90-userDefinedConfiguration.conf
在這里插入圖片描述
在這里插入圖片描述
如果是集群剛創建成功,還沒有創建exchang,queue時,對YAML文件中相關參數進行修改并提交k8s,集群會觸發滾動更新,從數值編號大的pod開始重啟并加載修改的參數值。如果集群中已經有數據了,則不會執行滾動更新。
在這里插入圖片描述
設置環境變量
RabbitMQ 使用的所有環境變量都使用前綴RABBITMQ_(除了在r??abbitmq-env.conf或 rabbitmq-env-conf.bat中定義的)
RabbitMQ使用rabbitmq-env.conf覆蓋 RabbitMQ 腳本和 CLI 工具中內置的默認值,spec.rabbitmq.envConfig的值將寫入/etc/rabbitmq/rabbitmq-env.conf
比如:RABBITMQ_DISTRIBUTION_BUFFER_SIZE用于節點間通信連接的傳出數據緩沖區大小限制(以千字節為單位)。不建議使用低于 64 MB 的值。默認值:128M

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:name: rabbitmqcluster-sample
spec:rabbitmq:envConfig: |RABBITMQ_DISTRIBUTION_BUFFER_SIZE=256000

其他變量可以參考官方文檔:
https://www.rabbitmq.com/docs/3.13/configure#supported-environment-variables

附加啟動更多插件
RabbitMQ Cluster Kubernetes Operator默認情況下
已啟用rabbitmq_peer_discovery_k8s、rabbitmq_prometheus、rabbitmq_management
如需啟用更多插件,比如增加聯邦,鏟子的插件,請進行如下配置:

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:name: rabbitmqcluster-sample
spec:rabbitmq:additionalPlugins:- rabbitmq_federation- rabbitmq_federation_management- rabbitmq_shovel- rabbitmq_shovel_management

如果需要配置社區插件,則應將其包含在自定義鏡像中或在節點啟動時下載

RabbitMQ 高級配置
將寫入/etc/rabbitmq/advanced.config文件的高級配置。
比如:配置 RabbitMQ 的預寫日志 (WAL) 的存儲路徑。

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:name: rabbitmqcluster-sample
spec:rabbitmq:advancedConfig: |[{ra, [{wal_data_dir, '/var/lib/rabbitmq/quorum-wal'}]}].

更多高級配置請參考官方文檔:https://www.rabbitmq.com/docs/3.13/configure#advanced-config-file

3.RabbitMQ集群節點擴縮容

RabbitMQ官方建議集群節點為大于等于3的奇數個,比如3, 5, 7… ,原因為rabbitmq中的個高可用方案中,使用了鏡像隊列或者仲裁隊列,為避免集群有節點故障是產生腦裂(leader選舉過半機制)和集群資源利用最大化(3節點和4節點集群在1個節點故障時高可用性是一樣的),關于鏡像隊列和仲裁隊列的詳細信息,后面章節將會詳細描述。

在k8s環境部署的RabbitMQ集群擴縮容比較簡單,只需修改創建RabbitMQ集群時的資源清單文件中的metadata.spec.replicas 的值即可,比如從3個節點改為5個節點。

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:name: rabbitmq-cluster01namespace: rabbitmq-test
spec:replicas: 5

修改完成后,將yaml文件重新apply到k8s集群,RabbitMQ operater會自動完成集群節點的增減操作。

root@k8s-master1:[/root/rabbitmq]kubectl apply -f rabbitmq-cluster.yaml
rabbitmqcluster.rabbitmq.com/rabbitmq-cluster01 configured

在這里插入圖片描述
在這里插入圖片描述
RabbitMQ Operator 暫不支持集群縮容
RabbitMQ 官方 Operator 的設計主要是為了簡化集群管理和操作。在這種設計中,集群節點的擴容和縮容操作受到一定限制,原因如下:

  1. 數據一致性:RabbitMQ 集群通過共享狀態和隊列實現數據一致性。減少節點數量可能導致數據遷移和分配問題,從而影響系統的穩定性和數據完整性。
  2. 高可用性:在高可用模式下,RabbitMQ 通過復制隊列來確保數據的可靠性。如果減少節點,可能會影響到已有的復制策略,導致高可用性受到威脅。
  3. 操作復雜性:縮容操作通常涉及復雜的數據遷移和狀態更新,這可能會增加系統出錯的風險。相較之下,擴容操作相對簡單,系統能自動處理新節點的加入。
  4. 集群配置管理:RabbitMQ 官方 Operator 旨在提供一致的集群管理體驗,縮容操作的復雜性使得其難以在 Operator 的邏輯中實現自動化管理。
    因此,雖然技術上可以實現縮容操作,但為了維護系統的穩定性和數據安全性,RabbitMQ 官方 Operator 選擇限制該功能,只支持擴容。

將修改YAML文件中的metadata.spec.replicas 的值由7改為5并提交k8s執行時,可以從RabbitMQ operater pod的日志中查詢相關限制縮容的相關信息。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

4.安裝RabbitMQ Messaging Topology Operator

Messaging Topology Operator可以管理通過 RabbitMQ Cluster Kubernetes Operator 部署的 RabbitMQ 集群內對象(統稱為消息傳遞拓撲),它允許通過聲明式的Kubernetes API來創建和管理部署在RabbitMQ集群中的消息拓撲。如:vhost、exchange、queue等。
源碼:https://github.com/rabbitmq/messaging-topology-operator

核心功能

  • 創建和管理RabbitMQ消息拓撲:
    該操作器可以創建和管理RabbitMQ集群中的消息拓撲,包括交換機(exchanges)、隊列(queues)、綁定(bindings)和策略(policies)。通過這些組件,開發者可以構建特定的消息傳遞或流處理場景。
  • 與RabbitMQ Cluster Operator協同工作:
    RabbitMQ Messaging Topology Operator與RabbitMQ Cluster Kubernetes Operator緊密協作。
    RabbitMQ Cluster Operator用于管理和部署RabbitMQ集群,而Messaging Topology Operator則在此基礎上進一步管理消息拓撲。

安裝要求

  • Kubernetes 1.19 或更高版本
  • RabbitMQ Cluster Operator 1.7.0+

安裝 Operator 有兩種方式

  1. 使用 cert-manager 安裝
  2. 安裝生成的證書

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/68194.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/68194.shtml
英文地址,請注明出處:http://en.pswp.cn/web/68194.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

探索 Spring Cloud Alibaba:開啟微服務架構新時代

一、引言 在當今數字化浪潮中,軟件系統的規模和復雜度不斷攀升,傳統的單體架構逐漸難以滿足快速迭代、高并發處理以及靈活擴展的需求。微服務架構應運而生,它將一個大型的應用拆分成多個小型、自治的服務,每個服務專注于特定的業務…

Linux基礎命令之Nginx中的rewrite功能(重新)

一、什么是Rewrite Rewrite也稱URL Rewrite,即URL重寫,就是把傳入Web的請求重定向到其他URL的過程。 1. URL Rewrite最常見的應用是URL偽靜態化,是將動態頁面顯示為靜態頁面方式的一種技術。比如http://www.123.com/news/index.php?id123 使…

anaconda使用

anaconda配置鏡像源: 引用:https://zhuanlan.zhihu.com/p/17776864328 # 顯示所有的鏡像源 conda config --show channels # 設置鏡像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add c…

DeepSeek 闡述 2025年前端發展趨勢

預測2025年前端的發展趨勢。首先,我需要考慮當前的前端 技術發展情況,以及近幾年的變化趨勢。比如,框架方面,React、Vue、Angular這些主流框架的更新方向和社區活躍度。可能用戶想知道未來哪些技術會更流行,或者需要學…

RK3568平臺開發系列講解(ConfigFS篇)ConfigFS核心數據結構

??返回專欄總目錄 文章目錄 一、數據結構二、結構體關系三、案例3.1、configfs_subsystem 實例3.2、config_group 實例化四、屬性和方法五、config_item實例化沉淀、分享、成長,讓自己和他人都能有所收獲!?? 理解 ConfigFS 的核心數據結構對于深入使用和定制 ConfigFS 非…

【實戰篇】巧用 DeepSeek,讓 Excel 數據處理更高效

一、為何選擇用 DeepSeek 處理 Excel 在日常工作與生活里,Excel 是我們頻繁使用的工具。不管是統計公司銷售數據、分析學生成績,還是梳理個人財務狀況,Excel 憑借其強大的功能,如數據排序、篩選和簡單公式計算,為我們提供了諸多便利。但當面對復雜的數據處理任務,比如從…

微信小程序案例1——制作貓眼電影底部標簽導航欄

文章目錄 一、項目步驟1 新建一個無AppID的movie項目2將準備好的底部標簽導航圖標拷貝到movie項目下面(將圖標文件夾image放到項目文件夾里)3 打開App.json配置文件,在pages數組里添加4個頁面路徑:電影“pages/movie/movie”、影院“pages/cinema/cinema…

CSS 偽類(Pseudo-classes)的詳細介紹

CSS 偽類詳解與示例 在日常的前端開發中,CSS 偽類可以幫助我們非常精準地選擇元素或其特定狀態,從而達到豐富頁面表現的目的。本文將詳細介紹以下偽類的使用: 表單相關偽類 :checked、:disabled、:enabled、:in-range、:invalid、:optional、…

docker多個容器的相互通信

在同一臺宿主機上運行多個 Docker 容器時,容器之間可以通過以下幾種方式實現通信: 1. 使用 Docker 默認網絡(Bridge 網絡) Docker 默認會為每個容器分配一個 bridge 網絡,容器可以通過 IP 地址或容器名稱互相通信。 …

Elasticsearch 開放推理 API 增加了 Azure AI Studio 支持

作者:來自 Elastic Mark Hoy Elasticsearch 開放推理 API 現已支持 Azure AI Studio。在此博客中了解如何將 Azure AI Studio 功能與 Elasticsearch 結合使用。 作為我們持續致力于為 Microsoft Azure 開發人員提供他們選擇的工具的一部分,我們很高興地宣…

基于Bootstrap + Java + Oracle實現的電商平臺

以下是基于Bootstrap Java Oracle實現的電商平臺開發方案(簡化版): 一、系統架構設計 前端:Bootstrap 5 jQuery 后端:Java Spring Boot 數據庫:Oracle 19c 自動化:Spring Scheduler Oracle…

JUC學習筆記02

文章目錄 JUC筆記2練習題:手寫線程池代碼解釋:AdvancedThreadPool 類:WorkerThread 內部類:AdvancedThreadPoolExample 類: 線程池的思考CPU密集型IO密集型 練習題:手寫自動重試機練習題:手寫定…

【Unity】從父對象中獲取子對象組件的方式

1.GetComponentInChildren 用于獲取對與指定組件或游戲對象的任何子級相同的游戲對象上的組件類型的引用。 該方法在Unity腳本API的聲明格式為: public T GetComponentInChildren(bool includeInactive false) includeInactive參數(可選&#xff09…

Redis性能優化

1.是否使用復雜度過高的命令 首先,第一步,你需要去查看一下 Redis 的慢日志(slowlog)。 Redis 提供了慢日志命令的統計功能,它記錄了有哪些命令在執行時耗時比較久。 查看 Redis 慢日志之前,你需要設置慢…

baigeiRSA

baigeiRSA 打開附件有兩個: 1.import libnumfrom Crypto.Util import numberfrom secret import flag?size 128e 65537p number.getPrime(size)q number.getPrime(size)n p*q?m libnum.s2n(flag)c pow(m, e, n)?print(n %d % n)print(c %d % c)??2.n…

【csp-j學習完C++語法后,如何進階學習C++算法和數據結構?】

在掌握了 CSP - J 的 C 語法基礎后,接下來的進階學習需要系統地掌握各類算法和數據結構知識,并通過大量練習來鞏固和提高應用能力。以下是一份詳細的進階學習規劃: 第一階段:基礎算法學習(1 - 2 個月) 排…

QT中解決使用QCustomplot繪制高速大量數據時頻譜圖卡頓問題

[!!!核心方法!!!] 使用帶參數的replot()函數繪制m_pCustomPlot>replot(QCustomPlot::rpQueuedReplot) 1. replot() 方法 void QCustomPlot::replot(QCustomPlot::RefreshPriority refreshPriority rp…

【AI】卷積神經網絡CNN

不定期更新,建議關注收藏點贊。 目錄 零碎小組件經驗總結早期的CNN 零碎小組件 全連接神經網絡 目前已經被替代。 每個神經元都有參與,但由于數據中的特征點變化大,全連接神經網絡把所有數據特征都學習了,故效果不好。感受野&…

YOLOv11-ultralytics-8.3.67部分代碼閱讀筆記-downloads.py

downloads.py ultralytics\utils\downloads.py 目錄 downloads.py 1.所需的庫和模塊 2.def is_url(url, checkFalse): 3.def delete_dsstore(path, files_to_delete(".DS_Store", "__MACOSX")): 4.def zip_directory(directory, compressTrue, ex…

微信小程序~電器維修系統小程序

博主介紹:?程序猿徐師兄、8年大廠程序員經歷。全網粉絲15w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? 🍅文末獲取源碼聯系🍅 👇🏻 精彩專欄推薦訂閱👇…