#作者:閆乾苓
文章目錄
- 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代表一個會話任務
工作流程
- 生產者發送消息:生產者通過RabbitMQ的客戶端庫創建消息,并指定交換機的名稱和路由鍵。然后,生產者將消息發送到RabbitMQ服務器上的指定交換機。
- 交換機接收并路由消息:交換機接收到生產者的消息后,根據配置的路由規則和路由鍵將消息分發到相應的隊列中。如果消息沒有匹配到任何隊列,則可能會被丟棄或返回給生產者。
- 消費者消費消息:消費者連接到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 的設計主要是為了簡化集群管理和操作。在這種設計中,集群節點的擴容和縮容操作受到一定限制,原因如下:
- 數據一致性:RabbitMQ 集群通過共享狀態和隊列實現數據一致性。減少節點數量可能導致數據遷移和分配問題,從而影響系統的穩定性和數據完整性。
- 高可用性:在高可用模式下,RabbitMQ 通過復制隊列來確保數據的可靠性。如果減少節點,可能會影響到已有的復制策略,導致高可用性受到威脅。
- 操作復雜性:縮容操作通常涉及復雜的數據遷移和狀態更新,這可能會增加系統出錯的風險。相較之下,擴容操作相對簡單,系統能自動處理新節點的加入。
- 集群配置管理: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 有兩種方式:
- 使用 cert-manager 安裝
- 安裝生成的證書