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代表一个会话任务
工作流程
- 生产者发送消息:生产者通过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_(除了在rabbitmq-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 安装
- 安装生成的证书
相关文章:
RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)
#作者:闫乾苓 文章目录 RabbitMQ简介RabbitMQ与VMware的关系架构工作流程RabbitMQ 队列工作模式及适用场景简单队列模式(Simple Queue)工作队列模式(Work Queue)发布/订阅模式(Publish/Subscribeÿ…...
Unity中的虚拟相机(Cinemachine)
Unity Cinemachine详解 什么是Cinemachine Cinemachine是Unity官方推出的智能相机系统,它提供了一套完整的工具来创建复杂的相机运动和行为,而无需编写大量代码。它能够大大简化相机管理,提高游戏开发效率。 Cinemachine的主要组件 1. Vi…...
响应式编程_04Spring 5 中的响应式编程技术栈_WebFlux 和 Spring Data Reactive
文章目录 概述响应式Web框架Spring WebFlux响应式数据访问Spring Data Reactive 概述 https://spring.io/reactive 2017 年,Spring 发布了新版本 Spring 5, Spring 5 引入了很多核心功能,这其中重要的就是全面拥抱了响应式编程的设计思想和实…...
网络设备的安全加固
设备的安全始终是信息网络安全的一个重要方面,攻击者往往通过控制网络中设备来破坏系统和信息,或扩大已有的破坏。网络设备包括主机(服务器、工作站、PC)和网络设施(交换机、路由器等)。 一般说来ÿ…...
OpenCV:特征检测总结
目录 一、什么是特征检测? 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT(尺度不变特征变换) 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…...
Java高频面试之SE-17
hello啊,各位观众姥爷们!!!本牛马baby今天又来了!哈哈哈哈哈嗝🐶 Java缓冲区溢出,如何解决? 在 Java 中,缓冲区溢出 (Buffer Overflow) 虽然不是像 C/C 中那样直接可见…...
移动机器人规划控制入门与实践:基于navigation2 学习笔记(一)
课程实践: (1)手写A*代码并且调试,总结优缺点 (2)基于Gazebo仿真,完成给定机器人在给定地图中的导航调试 (3)使用Groot设计自己的导航行为树 掌握一门技术 规划控制概述 常见移动机器人...
每日一题洛谷P5721 【深基4.例6】数字直角三角形c++
#include<iostream> using namespace std; int main() {int n;cin >> n;int t 1;for (int i 0; i < n; i) {for (int j 0; j < n - i; j) {printf("%02d",t);t;}cout << endl;}return 0; }...
RTMP 和 WebRTC
WebRTC(Web Real-Time Communication)和 RTMP(Real-Time Messaging Protocol)是两种完全不同的流媒体协议,设计目标、协议栈、交互流程和应用场景均有显著差异。以下是两者的详细对比,涵盖协议字段、交互流程及核心设计思想。 一、协议栈与设计目标对比 特性RTMPWebRTC传…...
数据库技术基础
1 数据库系统概述 1.1 数据库的4个概念 (1)数据(信息) 数据:指已记录或可获取的事实,是数据库存储的最小单元。除文本、数字外,还有图形、图像、声音等。 数据由于能为用户利用才被记录和保…...
如何获取sql数据中时间的月份、年份(类型为date)
可用自带的函数month来实现 如: 创建表及插入数据: create table test (id int,begindate datetime) insert into test values (1,2015-01-01) insert into test values (2,2015-02-01) 执行sql语句,获取月份: select MONTH(begindate)…...
每日Attention学习18——Grouped Attention Gate
模块出处 [ICLR 25 Submission] [link] UltraLightUNet: Rethinking U-shaped Network with Multi-kernel Lightweight Convolutions for Medical Image Segmentation 模块名称 Grouped Attention Gate (GAG) 模块作用 轻量特征融合 模块结构 模块特点 特征融合前使用Group…...
分析用户请求K8S里ingress-nginx提供的ingress流量路径
前言 本文是个人的小小见解,欢迎大佬指出我文章的问题,一起讨论进步~ 我个人的疑问点 进入的流量是如何自动判断进入iptables的四表?k8s nodeport模式的原理? 一 本机环境介绍 节点名节点IPK8S版本CNI插件Master192.168.44.1…...
TensorFlow是个啥玩意?
TensorFlow是一个开源的机器学习框架,由Google开发。它可以帮助开发者构建和训练各种机器学习模型,包括神经网络和深度学习模型。TensorFlow的设计理念是使用数据流图来表示计算过程,其中节点表示数学运算,边表示数据流动。 Tens…...
初识C语言、C语言的学习方向总述与入门
目录 1. 什么是C语言? 2. 第一个C语言程序 3. 数据类型 4. 变量、常量 4.1 定义变量的方法 4.2 变量的命名 4.3 变量的分类 4.4 变量的作用域和生命周期 4.5 常量 5. 字符串转义字符注释 5.1 字符串 5.2 转义字符 6. 注释 7. 选择语句 8. 循环语句 …...
零基础学习书生.浦语大模型-入门岛
第一关:Linux基础知识 任务一:Cursor连接SSH运行代码 使用Remote - SSH插件即可 运行指令 python hello_world.py端口映射 ssh -p 46561 rootssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyCheckingno 注:46561&a…...
【R语言】获取数据
R语言自带2种数据存储格式:*.RData和*.rds。 这两者的区别是:前者既可以存储数据,也可以存储当前工作空间中的所有变量,属于非标准化存储;后者仅用于存储单个R对象,且存储时可以创建标准化档案,…...
MongoDB学习笔记-解析jsonCommand内容
如果需要屏蔽其他项目对MongoDB的直接访问操作,统一由一个入口访问操作MongoDB,可以考虑直接传入jsonCommand语句解析执行。 相关依赖包 <!-- SpringBootDataMongodb依赖包 --> <dependency><groupId>org.springframework.boot</…...
国产编辑器EverEdit - 工具栏说明
1 工具栏 1.1 应用场景 当用户想显示/隐藏界面的标签栏、工具栏、状态栏、主菜单等界面元素时,可以通过EverEdit的菜单选项进行设置。 1.2 使用方法 选择菜单查看 -> 工具栏,在工具栏的子菜单中选择勾选或去掉勾选对应的选项。 标签栏࿱…...
linux 函数 sem_init () 信号量、sem_destroy()
(1) (2) 代码举例: #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h>sem_t semaphore;void* thread_function(void* arg) …...
制造业设备状态监控与生产优化实战:基于SQL的序列分析与状态机建模
目录 1. 背景与挑战 2. 数据建模与采集 2.1 数据表设计 设备状态表(记录设备实时状态变更)...
密码学的数学基础1-素数和RSA加密
数学公式推导是密码学的基础, 故开一个新的课题 – 密码学的数学基础系列 素数 / 质数 质数又称素数。 一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数࿰…...
C++ Primer 算术运算符
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
计算图 Compute Graph 和自动求导 Autograd | PyTorch 深度学习实战
前一篇文章,Tensor 基本操作5 device 管理,使用 GPU 设备 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started PyTorch 计算图和 Autograd 微积分之于机器学习Computational Graphs 计算图Autograd…...
Vue 图片引用方式详解:静态资源与动态路径访问
目录 前言1. 引用 public/ 目录2. assets/ 目录3. 远程服务器4. Vue Router 动态访问5. 总结6. 扩展(图片不显示) 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 在 Vue 开发中&#x…...
熟练掌握Http协议
目录 基本概念请求数据Get请求方式和Post请求方式 响应数据响应状态码 基本概念 Http协议全称超文本传输协议(HyperText Transfer Protocol),是网络通信中应用层的协议,规定了浏览器和web服务器数据传输的格式和规则 Http应用层协议具有以下特点&#…...
爬虫学习笔记之Robots协议相关整理
定义 Robots协议也称作爬虫协议、机器人协议,全名为网络爬虫排除标准,用来告诉爬虫和搜索引擎哪些页面可以爬取、哪些不可以。它通常是一个叫做robots.txt的文本文件,一般放在网站的根目录下。 robots.txt文件的样例 对有所爬虫均生效&#…...
血压计OCR文字检测数据集VOC+YOLO格式2147张11类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2147 标注数量(xml文件个数):2147 标注数量(txt文件个数):2147 …...
正则表达式详细介绍
目录 正则表达式详细介绍什么是正则表达式?元字符转义字符字符类限定字符字符分枝字符分组懒惰匹配和贪婪匹配零宽断言 正则表达式详细介绍 什么是正则表达式? 正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想…...
初识ArkTS语言
文章目录 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,保持了TS的基本风格,同时通过规范定义强化开发期静态检查和分析,提升程序执行稳定性和性能。 从…...
Go语言并发之美:构建高性能键值存储系统
摘要 本文介绍了基于Go语言实现的高性能并发键值存储系统。通过深入探讨Go语言在并发编程中的优势,文章详细阐述了系统的锁机制、分片优化、内存管理和持久化设计等关键环节。这些设计展示了如何在系统开发中进行有效的权衡,以确保最优性能。该系统不仅充…...
6. k8s二进制集群之各节点部署
获取kubernetes源码安装主节点(分别执行以下各节点命令)安装工作节点(同步kebelet和kube-proxy到各工作节点)总结 继续上一篇文章《k8s二进制集群之ETCD集群部署》下面介绍一下各节点的部署与配置。 获取kubernetes源码 https:/…...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架
目录 前言 环境介绍 代码与动机 架构设计,优缺点 博客系列指引 前言 笔者前段时间花费了一周,整理了一下自从TM1637开始打算的,使用OLED来搭建一个通用的显示库的一个工程。笔者的OLED库已经开源到Github上了,地址在…...
spring基础总结
先修知识:依赖注入,反转控制,生命周期 IDEA快捷键 Ctrl Altm:提取方法,设置trycatch 通用快捷键: Ctrl F:在当前文件中查找文本。Ctrl R:在当前文件中替换文本。Ctrl Z:撤销…...
基础相对薄弱怎么考研
复习总体规划 明确目标 选择专业和院校:根据你的兴趣、职业规划和自身实力,选择适合自己的专业和院校。可以参考往年的分数线、报录比、复试难度等。了解考试科目:不同专业考试科目不同,一般包括: 公共课:…...
代码随想录36 动态规划
leetcode 343.整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 1…...
p5r预告信生成器API
p5r预告信生成器API 本人将js生成的p5r预告信使用go语言进行了重写和部署,并开放了其api,可以直接通过get方法获取预告信的png。 快速开始 http://api.viogami.tech/p5cc/:text eg: http://api.viogami.tech/p5cc/persona5 感谢p5r风格字体的制作者和…...
React图标库: 使用React Icons实现定制化图标效果
React图标库: 使用React Icons实现定制化图标效果 图标库介绍 是一个专门为React应用设计的图标库,它包含了丰富的图标集合,覆盖了常用的图标类型,如FontAwesome、Material Design等。React Icons可以让开发者在React应用中轻松地添加、定制各…...
说说Redis的内存淘汰策略?
大家好,我是锋哥。今天分享关于【说说Redis的内存淘汰策略?】面试题。希望对大家有帮助; 说说Redis的内存淘汰策略? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 提供了多种内存淘汰策略,用于在内存达到限制时决定如何…...
【C语言】自定义类型讲解
文章目录 一、前言二、结构体2.1 概念2.2 定义2.2.1 通常情况下的定义2.2.2 匿名结构体 2.3 结构体的自引用和嵌套2.4 结构体变量的定义与初始化2.5 结构体的内存对齐2.6 结构体传参2.7 结构体实现位段 三、枚举3.1 概念3.2 定义3.3 枚举的优点3.3.1 提高代码的可读性3.3.2 防止…...
机器学习8-卷积和卷积核1
机器学习8-卷积和卷积核1 卷积与图像去噪卷积的定义与性质定义性质卷积的原理卷积步骤卷积的示例与应用卷积的优缺点优点缺点 总结 高斯卷积核卷积核尺寸的设置依据任务类型考虑数据特性实验与调优 高斯函数标准差的设置依据平滑需求结合卷积核尺寸实际应用场景 总结 图像噪声与…...
3、C#基于.net framework的应用开发实战编程 - 实现(三、三) - 编程手把手系列文章...
三、 实现; 三.三、编写应用程序; 此文主要是实现应用的主要编码工作。 1、 分层; 此例子主要分为UI、Helper、DAL等层。UI负责便签的界面显示;Helper主要是链接UI和数据库操作的中间层;DAL为对数据库的操…...
PHP 中 `foreach` 循环结合引用使用时可能出现的问题
问题背景 假设你有如下 PHP 代码: <?php $arr array(1, 2, 3, 4);// 使用引用遍历并修改数组元素 foreach ($arr as &$value) {$value $value * 2; } // 此时 $arr 变为 array(2, 4, 6, 8)// 再使用非引用方式遍历数组 foreach ($arr as $key > $val…...
go gin配置air
一、依赖下载 安装最新,且在你工作区下进行安装,我的是D:/GO是我的工作区,所有项目都在目录下的src, go install github.com/air-verse/airlatest 如果出现类似报错: 将图中第三行 github.com/air-verse/air 替换最…...
在 Spring Boot 项目中,bootstrap.yml 和 application.yml文件区别
在 Spring Boot 项目中,bootstrap.yml 和 application.yml 是两个常用的配置文件,它们的作用和加载顺序有所不同。以下是它们的详细说明: 1. bootstrap.yml 作用: bootstrap.yml 是 Spring Cloud 项目中的配置文件,用于…...
Excel中Address函数的用法
Excel中Address函数的用法 1. 函数详细讲解1.1 函数解释1.2 使用格式1.3 参数定义1.4 要点 2. 实用演示示例2.1 函数需求2.2 公式编写2.3 计算过程 3. 注意事项4. 文档下载5. 其他文章6. 获取全部Excel练习素材快来试试吧🥰 函数练习素材👈点击即可进行下…...
游戏引擎 Unity - Unity 打开项目、Unity Editor 添加简体中文语言包模块、Unity 项目设置为简体中文
Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...
智能家居监控系统数据收集积压优化
亮点:RocketMQ 消息大量积压问题的解决 假设我们正在开发一个智能家居监控系统。该系统从数百万个智能设备(如温度传感器、安全摄像头、烟雾探测器等)收集数据,并通过 RocketMQ 将这些数据传输到后端进行处理和分析。 在某些情况下…...
Zabbix7.0安装(Ubuntu24.04+LNMP)
1.选择版本 下载Zabbix 2.安装虚拟机 这里选择在Ubuntu24.04上安装Zabbix. 安装链接https://blog.csdn.net/weixin_58189050/article/details/145446065 配置源 vim /etc/apt/sources.list deb https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multive…...
SpringBoot+Dubbo+zookeeper 急速入门案例
项目目录结构: 第一步:创建一个SpringBoot项目,这里选择Maven项目或者Spring Initializer都可以,这里创建了一个Maven项目(SpringBoot-Dubbo),pom.xml文件如下: <?xml versio…...