当前位置: 首页 > news >正文

RabbitMQ 从入门到精通:从工作模式到集群部署实战(五)

#作者:闫乾苓

系列前几篇:
《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》:link

《RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)》: link

《RabbitMQ 从入门到精通:从工作模式到集群部署实战(三)》:link

《RabbitMQ 从入门到精通:从工作模式到集群部署实战(四)》:link

文章目录

  • 日志检查
    • 日志相关时间关键字
    • 常见错误日志及处理方法
      • 内存不足 memory alarm
      • 磁盘空间不足 disk alarm
      • 连接错误 connection error
      • 队列阻塞 queue blocked
      • 消息丢失警告 message dropped
      • 权限错误 access refused
      • 节点通信错误 cluster_node_down
      • 插件启动失败 plugin startup error
  • 深度巡检
  • 监控指标
    • 集群指标
    • 节点指标
    • 单个队列
  • 备份恢复
    • 拓补(元数据)数据备份恢复
    • 消息数据备份和恢复
    • 在web页面模拟数据被删除
    • 消息数据恢复
  • 数据迁移
    • 元数据迁移
    • 消息数据迁移
    • 开启shovel插件
  • 数据持久化
    • 容器

日志检查

可以使用命令查看日志

rabbitmq-diagnostics consume_event_stream

日志相关时间关键字

队列、交换和绑定事件
queue.deleted
queue.created
exchange.created
exchange.deleted
binding.created
binding.deleted

连接和通道事件
connection.created
connection.closed
channel.created
channel.closed

消费者事件
consumer.created
consumer.deleted

策略和参数事件
policy.set
policy.cleared
parameter.set
parameter.cleared

虚拟机活动
vhost.created
vhost.deleted
vhost.limits.set
vhost.limits.cleared

用户管理事件
user.authentication.success
user.authentication.failure
user.created
user.deleted
user.password.changed
user.password.cleared
user.tags.set

权限事件
permission.created
permission.deleted
topic.permission.created
topic.permission.deleted

报警事件
alarm.set
alarm.cleared

Shovel事件
shovel.worker.status
shovel.worker.removed

联邦事件
federation.link.status
federation.link.removed

如何将日志写入rabbitmq队列
RabbitMQ 可以将日志条目转发到系统exchange,该exchange将在默认虚拟主机amq.rabbitmq.log中声明。

默认情况下,此功能已停用。要激活此日志记录,请将配置log.exchange键设置为true

log.exchange.level可用于控制此日志记录目标将使用的日志级别:

log.exchange = true
log.exchange.level = warning

amq.rabbitmq.log是topic ex,可以按此使用。日志条目以消息形式发布。消息正文包含已记录的消息,路由密钥设置为日志级别。

常见错误日志及处理方法

关注这些 RabbitMQ 错误和警告日志,可以有效地预防和诊断潜在的系统问题,保证 RabbitMQ 集群的正常运行。

内存不足 memory alarm

=WARNING REPORT==== 
rabbit@hostname === memory resource limit alarm set on node rabbit@hostname

原因
RabbitMQ 使用内存来缓存消息,如果节点内存使用量超过限制(默认是物理内存的 40%),会触发内存报警,停止接收新的消息。

解决方法

  • 检查内存使用情况,关闭不必要的应用进程。
  • 调整 vm_memory_high_watermark 参数,增加允许的内存占用比例。
  • 增加服务器的物理内存或调整消息持久化策略,将消息写入磁盘,减小内存消耗。

磁盘空间不足 disk alarm

=WARNING REPORT==== 
rabbit@hostname === disk free space alarm set on node rabbit@hostname

原因
当可用磁盘空间低于阈值(默认是 50MB)时,RabbitMQ 会停止接受新的消息发布,以防止因磁盘空间不足导致的系统崩溃。

解决方法

  • 清理磁盘空间,例如删除旧日志文件和不必要的数据。
  • 调整磁盘报警阈值 disk_free_limit
  • 增加服务器的磁盘空间。

连接错误 connection error

=ERROR REPORT==== 
connection <0.2001.0> closing due to an error: missed heartbeats from client, timeout

原因
此错误通常由于 RabbitMQ 客户端没有在指定时间内发送心跳信号,可能是网络连接不稳定或客户端发生异常。

解决方法

  • 检查网络连接,确保客户端和 RabbitMQ 服务器之间的网络稳定。
  • 增加心跳超时设置(在客户端和服务器端都需要配置)。
  • 检查客户端是否有性能瓶颈,是否超时未能发送心跳。

队列阻塞 queue blocked

=WARNING REPORT==== 
rabbit@hostname === queue 'queue_name' in vhost '/' is blocked

原因
当队列的消息数超过允许限制时,RabbitMQ 会阻止该队列接收新的消息,以防止因队列过大而导致系统崩溃。

解决方法

  • 增加队列的最大长度限制,配置 max-lengthmax-length-bytes 参数。
  • 优化消费者速度,确保及时处理队列中的消息。
  • 设置消息的 TTL(生存时间),自动清理队列中过期的消息。

消息丢失警告 message dropped

=WARNING REPORT==== 
rabbit@hostname === messages are being dropped due to high load or resource constraints

原因
在高负载或资源受限的情况下,RabbitMQ 可能会丢弃某些非持久化消息,以保持系统的稳定性。

解决方法
优化生产者速率,减轻 RabbitMQ 的负载。
将重要的消息标记为持久化,减少被丢弃的风险。
扩展 RabbitMQ 集群,分担消息负载。

权限错误 access refused

=ERROR REPORT==== 
access to vhost 'vhost_name' refused for user 'username': vhost not found or permissions denied

原因
用户没有访问某个 vhost 的权限,可能是配置错误或没有正确分配权限。

解决方法
检查 RabbitMQ 用户权限,确保用户有正确的访问权限。
使用 rabbitmqctl 设置权限:

  rabbitmqctl set_permissions -p vhost_name username ".*" ".*" ".*"

节点通信错误 cluster_node_down

=ERROR REPORT==== 
cluster_node_down, 'rabbit@other_node'

原因
集群中的一个节点无法与其他节点通信,可能是网络问题或该节点发生了故障。

解决方法

  • 检查网络连接和各节点的状态,确保网络畅通。
  • 检查该节点的资源使用情况,确保内存和磁盘空间充足。
  • 如果节点无法恢复,可能需要重新启动或重新加入集群。

插件启动失败 plugin startup error

=ERROR REPORT==== 
plugin error: "some_plugin" failed to start due to missing dependencies or configuration issues

原因
RabbitMQ 插件无法启动,可能是依赖关系错误或插件配置不正确。

解决方法

  • 确认所需的依赖插件已安装并启用。
  • 检查插件的配置,确保配置项无误。
  • 查看 RabbitMQ 文档中该插件的安装和配置指南,检查是否有遗漏步骤。

深度巡检

关键配置参数说明

total_memory_available_override_value = 3GiB
vm_memory_high_watermark.relative = 0.6
vm_memory_high_watermark.absolute = 2GiB
vm_memory_high_watermark_paging_ratio = 0.5
#disk_free_limit.absolute = 500MB
disk_free_limit.relative = 0.05
vm_memory_calculation_strategy = rss
cluster_partition_handling = autoheal

vm_memory_high_watermark

  1. 定义了 RabbitMQ 在何时会因为内存使用过高而发出警告,并可能阻塞发布者的连接。它是一个内存阈值,用于控制 RabbitMQ 的流控机制。当 RabbitMQ 的内存使用超过这个阈值时,它会触发流控机制,如阻塞发布者的连接,以防止内存耗尽导致的服务崩溃。
  2. 可以使用命令动态调整(使用此方式配置的参数,服务重启后,配置会恢复默认值),可以通过设置内存的绝对值或者比例设置参数值,最大值为total_memory_available_override_value 参数所指定的值。所以不管使用那种方式,设置完成的值都不会超过此值。

命令行动态设置

# 设置绝对值
rabbitmqctl set_vm_memory_high_watermark absolute 2GB# 也可以通过设置比例调整
rabbitmqctl set_vm_memory_high_watermark  0.6

动态设置完成后,可以使用下面的命令查看:

# rabbitmqctl status |grep 'Memory high watermark setting'
Memory high watermark setting: 0.4 of available memory, computed to: 1.4286 gb
  1. rabbitmq 官方文档中在k8s中部署rabbitmq 节点集群中此参数的值为:1717986919,单位为字节。约为1.6G
  2. 在rabbitmq.conf 配置文件中需要如下配置:
vm_memory_high_watermark.relative = 0.6
# 或者
vm_memory_high_watermark.absolute = 1Gib

vm_memory_high_watermark_paging_ratio

  1. 在实际应用中,vm_memory_high_watermark_paging_ratio 与 vm_memory_high_watermark 一起构成了 RabbitMQ 的内存管理策略。通过合理配 置这两个参数,可以在确保系统稳定运行的同时,最大化地利用内存资源来处理消息。
  2. 在某个 Broker 节点触及vm_memory_high_watermark 设置的内存阈值并阻塞生产者之前,它会尝试将队列中的消息从内存换页到磁盘以释放内存空间。持久化和非持久化的消息都会被转储到磁盘中,其中持久化的消息本身就在磁盘中有一份副本,这里会将持久化的消息从内存中清除掉。例如,如果 vm_memory_high_watermark 设置为 0.4(即物理内存的 40%),(官方建议设置此值区间为:0.4~0.66 ,不建议取值超过 0.7)vm_memory_high_watermark_paging_ratio 设置为 0.75(即 vm_memory_high_watermark 的 75%),则当内存使用量达到物理内存的 30%(即 0.4 * 0.75)时,RabbitMQ 将开始分页操作。这有助于在内存使用量较高时释放部分内存空间,并防止内存溢出。

命令行动态设置:

rabbitmqctl set_vm_memory_high_watermark paging_ratio 0.6

rabbitmq.conf中配置:

#当内存使用量达到高水位的 50% 时,RabbitMQ 开始将消息移到磁盘
vm_memory_high_watermark_paging_ratio = 0.5

total_memory_available_override_value

  1. 它影响 RabbitMQ 对内存使用的整体评估,从而影响内存相关的决策,如消息分页、内存警告等
  2. total_memory_available_override_value 设置的内存总量是 RabbitMQ 进行内存管理和决策的基础,而 vm_memory_high_watermark 则是在这个基础上设定的一个内存使用阈值。因此,vm_memory_high_watermark 的设置应该考虑到 total_memory_available_override_value 所设定的内存总量。
  3. 这个参数允许管理员手动设置 RabbitMQ 节点可用的总内存量。在容器化部署中特别有用,因为容器通常会有自己的内存限制。
# rabbitmq.conf 
total_memory_available_override_value = 4GB

不支持命令行动态修改
disk_free_limit.absolute

  1. RabbitMQ 在触发磁盘空间警报之前,磁盘上必须保留的最小可用空间量。
  2. 当剩余磁盘空间低于配置的阈值时,rabbitmq也会阻塞生产者,通过设置此参数可以避免因非持久化的消息持续换页,从而耗尽磁盘空间导致服务崩溃。
  3. 默认情况下,磁盘阈值为 50MB,表示当磁盘剩余空间低于50MB时,会阻塞生产者并停止内存中消息的换页动作
  4. 所需的最低磁盘可用空间量,确保 RabbitMQ 在有足够的磁盘空间来支持其操作的同时,避免因磁盘空间不足而导致性能下降或崩溃的问题
# rabbitmq.conf
# 设置绝对磁盘空间限制
disk_free_limit.absolute = 500MBrabbitmqctl set_disk_free_limit 500MB

disk_free_limit.relative

  1. 根据服务器上安装的内存容量来动态设置磁盘可用空间的相对阈值,例如,要将磁盘可用空间阈值设置为服务器内存容量的 50%,你可以这样配置: disk_free_limit.relative = 0.5
  2. 命令行动态调整,比如rabbitmq 官方文档中在k8s中部署rabbitmq 3节点集群中此参数的值为 disk_free_limit.absolute = 2GB
    pod中的配置文件路径:/etc/rabbitmq/conf.d/10-operatorDefaults.conf
# rabbitmq.conf
disk_free_limit.relative = 0.05rabbitmqctl set_disk_free_limit  mem_relative 0.05

vm_memory_calculation_strategy

Erlang虚拟机内存消耗计算策略,默认为rss策略,可选策略有:allocated 、 rss 、 legacy
rss 使用操作系统特定的方式查询内核来查找节点操作系统进程的 RSS(驻留集大小)值。此策略最为精确,并且默认在 Linux、MacOS、BSD 和 Solaris 系统上使用。使用此策略时,RabbitMQ 每秒运行一次短暂的子进程。
allocate 是一种查询运行时内存分配器信息的策略。它通常非常接近 rss 策略报告的值。 Windows 上默认使用此策略。
egacy使用遗留内存报告。这是RabbitMQ早期版本的内存报告方式,可能在某些情况下不够准确。为了向后兼容,RabbitMQ仍然保留了这种策略,但不建议在新版本中使用。

# rabbitmq.conf
vm_memory_calculation_strategy = rss

不支持动态设置
cluster_partition_handling

# rabbitmq.conf 
cluster_partition_handling = autoheal

不支持动态设置

配置文件(如果没有配置)默认是 ignore 模式,即不自动处理网络分区,所以在这种模式下,当网络分区的时候需要人工介入
3种方法自动地处理网络分区 pause_minority 模式、pause_if_all_down 模式和 autoheal 模式,可以更加不同业务场景进行选择。

pause_minority

  • 发生分区后,会自动关闭处于少数分区的节点,并在网络恢复后自动重新加入
  • 适用于跨机架或可用区群集时,在单个区域中丢失大多数节点(区域)的概率被认为是非常低的情况。此模式会牺牲一些可用性,但具有自动恢复的能力。
  • 在这种模式下,RabbitMQ的节点数量应为奇数(如3个或5个),以确保在分区时能够明确区分多数派和少数派。

autoheal

  • 发生分区后,各分区下的节点正常工作,网络恢复后,会选出一个连接数最多、分区内节点数最多的节点为winner节点,并重启其他节点,其他节点从winner节点同步数据。
  • 当更关注服务的连续性而不是跨节点的数据一致性时,可以采用此策略。
  • 在网络恢复后,需要确保选出的winner节点具有最新的数据,以避免数据不一致的问题。

pause-if-all-down

  • 在关注的节点全部下线后会关闭自己,在关注的节点上线后,可以选择忽略或通过autoheal机制来恢复。
  • 此策略可以根据具体的业务需求进行灵活配置,适用于对节点状态有特定关注的情况。
  • 需要配置关注的节点列表,并根据业务需求选择合适的恢复策略(ignore或autoheal)。

ignore

  • 在网络可靠性达到最高实际可能的情况下使用,节点可用性是最重要的。此时,RabbitMQ会忽略网络分区事件,不做任何处理。
  • 所有集群节点都可以位于同一机架或等效机架中,与交换机连接,该交换机也是路由对外界时,可以采用此策略。
  • 采用此策略时,需要确保网络具有高可靠性,以避免因网络故障导致的消息丢失或系统不可用问题。

监控指标

集群指标

集群范围的指标提供了集群状态的高级视图。其中一些指标描述了节点之间的交互。此类指标的示例包括集群链接流量和检测到的网络分区。其他指标结合了所有集群成员的指标。所有节点的完整连接列表就是一个例子。这两种类型都是对基础设施和节点指标的补充。
GET /api/overview是返回集群范围指标
在这里插入图片描述

节点指标

有两个 HTTP API端点可以提供对节点特定指标的访问:

GET /api/nodes/{node}返回单个节点的统计信息
GET /api/nodes返回所有集群成员的统计数据
后一个端点返回一个对象数组。支持(或可以支持)该端点作为输入的监控工具应该优先选择该端点,因为它可以减少请求数量。如果不是这种情况,请使用前一个端点依次检索每个集群成员的统计信息。这意味着监控系统知道集群成员列表。

大多数指标都表示某个时间点的绝对值。有些指标表示最近一段时间内的活动(例如,GC 运行和回收的字节数)。后者指标在与之前的值和历史平均值/百分位值进行比较时最有用。

在这里插入图片描述

单个队列

各个队列指标可通过端点的HTTP API获得GET /api/queues/{vhost}/{qname}。
需要注意vhost / 在URL中需要使用URL编码 “%2F”替代。
比如: http://192.168.18.11:15672/api/queues/%2F/queue-quorum-01
在这里插入图片描述
下表列出了一些可用于监控队列状态的关键指标。其他一些指标(如队列状态和“空闲时间”)应被视为 RabbitMQ 贡献者使用的内部指标。
在这里插入图片描述
开启rabbitmq_prometheus 插件

[root@rbt01 ~]# rabbitmq-plugins enable rabbitmq_prometheus
Enabling plugins on node rabbit@rbt01:
rabbitmq_prometheus
The following plugins have been configured:rabbitmq_federationrabbitmq_managementrabbitmq_management_agentrabbitmq_prometheusrabbitmq_web_dispatch
Applying plugin configuration to rabbit@rbt01...
The following plugins have been enabled:rabbitmq_federationrabbitmq_prometheus

查看prometheus端口15692是否开启监听

[root@rbt01 ~]# netstat -ntlp |grep 15692
tcp        0      0 0.0.0.0:15692           0.0.0.0:*               LISTEN      1797/beam.smp

http://192.168.18.11:15692/metrics
在这里插入图片描述

备份恢复

拓补(元数据)数据备份恢复

节点和集群存储的信息可以被认为是模式、元数据或拓扑。用户、虚拟主机、队列、交换、绑定、运行时参数都属于这一类。在 RabbitMQ 术语中,这些元数据称为定义。
可以将定义导出到文件,然后导入到另一个集群或用于架构备份。

定义文件可以在节点启动期间或之后导入。在多节点集群中,启动时导入实际上会导致节点在启动时执行重复工作。对于较小的定义文件,这无关紧要;但对于较大的文件,建议在集群部署(形成)后,在节点启动后导入定义

rabbitmqctl export_definitions
导出(备份)到文件:

[root@rbt01 ~]# rabbitmqctl export_definitions export01.json
Exporting definitions in JSON to a file at "export01.json" ...

从(备份)文件导入集群:

[root@rbt01 ~]# rabbitmqctl import_definitions export02.json
Importing definitions in JSON from a file at "export02.json" ...
Successfully started definition import. This process is asynchronous and can take some time. Watch target node logs for completion.

在这里插入图片描述
API /api/definitions

通过API /api/definitions接口导出

[root@rbt01 ~]# curl -o export_by_api_01.json -u admin:Admin.123 -X GET http://127.0.0.1:15672/api/definitions% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100  2149  100  2149    0     0   699k      0 --:--:-- --:--:-- --:--:--  699k

通过API /api/definitions接口导入备份的数据
curl -u {username}:{password} -H “Content-Type: application/json” -X POST -T /path/to/definitions.file.json http://{hostname}:15672/api/definitions

curl -u admin:Admin.123 -H "Content-Type: application/json" -X POST -T export_by_api_01.json http://127.0.0.1:15672/api/definitions

消息数据备份和恢复

使用 durable=true 选项声明队列时,这确保了队列的元数据(比如队列的名称和属性)在 RabbitMQ 服务器重启后仍然存在。
要达到消息持久化的目的,在发布消息时,需要将消息的 delivery_mode 设置为 2(持久化消息)。这通常是在发送消息时通过 AMQP 客户端库的相应方法设置的。
如果只durable=true,而在发布消息是没有将delivery_mode 设置为 2,服务器重启后,元数据任然存在,消息数据会丢失。

消息数据备份
RabbitMQ官方文档描述子3.7.0 版本开始,所有消息数据全部存储在msg_stores/vhosts,所以只需备份此目录下的数据即可。
但经过实际测试,classic类型的队列(没开启镜像复制)使用下面的备份步骤,可以恢复数据,quorum类型的队列数据会全部丢失,所以quorum类型的队列不适合此方法备份恢复数据。
rabbitmqctl eval ‘rabbit_mnesia:dir().’
在这里插入图片描述

rabbitmq-diagnostics status | grep -A 2 -B 2 "Node data directory"
Data directoryNode data directory: /opt/rabbitmq_server-3.13.7/var/lib/rabbitmq/mnesia/rabbit@rbt01
Raft data directory: /opt/rabbitmq_server-3.13.7/var/lib/rabbitmq/mnesia/rabbit@rbt01/quorum/rabbit@rbt01

备份消息数据前,需要先停止app

[root@rbt01 ~]# rabbitmqctl start_app
Starting node rabbit@rbt01 ...

备份数据目录:

cd /opt/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@rbt01/msg_stores/vhosts
cp -r 628WB79CIFDYO9LJI6DKMI09L/ /databak/rabbit_bak01/

在web页面模拟数据被删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

消息数据恢复

恢复数据前关闭rabbitmq服务

rabbitmqctl shutdown

将备份目录恢复

/opt/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@rbt01/msg_stores/vhosts
scp -r /databak/rabbit_bak01/628WB79CIFDYO9LJI6DKMI09L/* 628WB79CIFDYO9LJI6DKMI09L/

启动rabbitmq服务

rabbitmq-server -detached

查看数据已经恢复

在这里插入图片描述

数据迁移

元数据迁移

可以参考“数据备份恢复”章节,元数据(拓补数据)可以使用“导出,导入”的方式,classia类型的队列中的消息数据可以通过备份数据目录的方式,将数据同步到新环境。quorum类型的队列数据迁移因为不支持备份数据目录的方式,建议自行开发或者使用第三方工具,将消息数据导出,被同步到新环境的方式进行。

消息数据迁移

Rabbitmq shovel插件允许在不同的RabbitMQ实例或集群之间复制消息,实现数据迁移。

开启shovel插件

在k8s使用RabbitMQ Cluster Kubernetes Operator部署的Rabbitmq集群,需要源和目的集群都启用shovel插件,在yaml资源清单增加如下配置:

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:name: rabbitmq-cluster02namespace: rabbitmq-shovel
spec:replicas: 3image: rabbitmq:3.13.7-managementrabbitmq:additionalPlugins:- rabbitmq_shovel- rabbitmq_shovel_management

将资源清单文件apply到k8s后,插件启用,通过web UI是否启用成功:
在这里插入图片描述
在web UI 界面配置shove 迁移(动态)
在shovel managenment中增加shove
下面示例是在k8s中部署的2个Rabbitmq集群配置队列数据迁移的shove配置

rabbitmq-cluster01
namespace:rabbitmq-test
k8s svc:	 rabbitmq-cluster01.rabbitmq-test.svc.cluster.localvhost:	/  (默认/ 虚拟主机在amqp中需要使用“%2F”转义	)queue: queue_quorum_01
账号密码:admin/Admin.123rabbitmq-cluster02
namespace:rabbitmq-shovel
queue:	queue-quorum-02
k8s svc:	 rabbitmq-cluster02.rabbitmq-shovel.svc.cluster.localvhost:	/  (默认/ 虚拟主机在amqp中需要使用“%2F”转义	)queue: 	queue-quorum-02
账号密码:admin/Admin.123

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置完成后rabbitmq-cluster01中queue_quorum_01队列中的消息数据就被迁移到 rabbitmq-cluster02中的queue-quorum-02队列中了。
在这里插入图片描述
在这里插入图片描述
数据迁移完成后,如果不需要后期继续使用,可以进行删除。
在这里插入图片描述
使用API配置创建shove
192.168.123.240:64790 为Rabbitmq的webUI管理界面的IP和端口,本例为k8s中Rabbitmq svc的nodeport.

curl -v -u admin:Admin.123 -X PUT http://192.168.123.240:64790/api/parameters/shovel/%2f/my-shovel-01 \-H "content-type: application/json" \-d @- <<EOF
{"value": {"src-protocol": "amqp091","src-uri": "amqp://admin:Admin.123@rabbitmq-cluster01.rabbitmq-test.svc.cluster.local:5672/%2F","src-queue": "queue_quorum_01","dest-protocol": "amqp091","dest-uri": "amqp://admin:Admin.123@rabbitmq-cluster02.rabbitmq-shovel.svc.cluster.local:5672/%2F","dest-queue": "queue-quorum-02"}
}
EOF

在这里插入图片描述
查看已经创建shovel

curl -v -u admin:Admin.123 -X GET http://192.168.123.240:64790/api/shovels/

删除不需要的shovel

curl -v -u admin:Admin.123 -X DELETE http://192.168.123.240:64790/api/shovels/vhost/%2f/my-shovel-01

数据持久化

容器

组件数据
在k8s中使用RabbitMQ Cluster Kubernetes Operator 部署的Rabbitmq集群的持久化方案是在k8s集群中需要已经有部署好的storageClass,通过指定k8s storageClass的名字(本例为nfs)和需要的磁盘容量(本例为20G)来创建pv, storageClass会自动创建pvc,并与pv进行动态绑定。pv 挂在到rabbitmq pod中指定的目录,实现将pod中的数据写入storageClass 底层的存储服务器中。

下面是yaml配置

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:name: rabbitmq-cluster01namespace: rabbitmq-testspec:replicas: 3image: rabbitmq:3.13.7-managementrabbitmq:persistence:storageClassName: nfsstorage: "20Gi"

日志数据
在k8s中使用RabbitMQ Cluster Kubernetes Operator 部署的Rabbitmq集群中,Rabbitmq pod中的日志默认输出到stdout,如果需要持久存储,需要在yaml文件中增加日志写入文件的配置。
具体参考一下yaml:

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:name: rabbitmq-cluster01namespace: rabbitmq-test
spec:replicas: 3tls:secretName: tls-secret-01image: rabbitmq:3.13.7-managementrabbitmq:additionalConfig: |log.file = /var/log/rabbitmq/rabbit.log

相关文章:

RabbitMQ 从入门到精通:从工作模式到集群部署实战(五)

#作者&#xff1a;闫乾苓 系列前几篇&#xff1a; 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》&#xff1a;link 《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;二&#xff09;》&#xff1a; lin…...

清理服务器/docker容器

清理服务器 服务器或docker容器清理空间。 清理conda环境 删除不用的conda虚拟环境&#xff1a; conda env remove --name python38 conda env remove --name python310清理临时目录&#xff1a;/tmp du -sh /tmp # 查看/tmp目录的大小/tmp 目录下的文件通常是可以直接删除…...

【专题】2024-2025人工智能代理深度剖析:GenAI 前沿、LangChain 现状及演进影响与发展趋势报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p39630 在科技飞速发展的当下&#xff0c;人工智能代理正经历着深刻的变革&#xff0c;其能力演变已然成为重塑各行业格局的关键力量。从早期简单的规则执行&#xff0c;到如今复杂的自主决策与多智能体协作&#xff0c;人工智能代理…...

广度优先搜索(BFS)算法详解——以走迷宫问题为例

引言&#xff1a;当算法遇见迷宫 想象你置身于一个复杂的迷宫&#xff0c;如何在最短时间内找到出口&#xff1f;这个问题不仅存在于童话故事中&#xff0c;更是计算机科学中经典的路径搜索问题。本文将带你通过走迷宫问题&#xff0c;深入理解广度优先搜索&#xff08;BFS&am…...

【大数据技术】用户行为日志分析(python+hadoop+mapreduce+yarn+hive)

用户行为日志分析(python+hadoop+mapreduce+yarn+hive) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 本机PyCharm远程连接虚拟机Python 搭建完全分布式高可用大数据集群(MySQL+Hive)...

C语言基础之【数组和字符串】(上)

C语言基础之【数组和字符串】&#xff08;上&#xff09; 概述一维数组一维数组的定义一维数组的初始化一维数组的访问一维数组的遍历数组名一维数组的常用数据强化训练一维数组的最值一维数组的逆置一维数组的排序&#xff08;冒泡排序&#xff09; 二维数组二维数组的定义二维…...

Maven插件—flatten-maven-plugin:工程模块统一版本依赖

文章目录 前言一、认识flatten-maven-plugin插件二、如何使用flatten-maven-plugin插件&#xff1f;未使用flatten-maven-plugin插件之前的情况描述配置flatten-maven-plugin插件步骤1&#xff1a;最外层父模块安装插件&配置版本变量步骤2&#xff1a;各个自模块使用版本使…...

Linux系统 环境变量

环境变量 写在前面概念查看环境变量main函数的参数argc & argvenv bash环境变量 写在前面 对于环境变量&#xff0c;本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”&#xff0c;我们会更详细讲解&#xff1b;理解环境变量的全局…...

TAPEX:通过神经SQL执行器学习的表格预训练

摘要 近年来&#xff0c;语言模型预训练的进展通过利用大规模非结构化文本数据取得了巨大成功。然而&#xff0c;由于缺乏大规模高质量的表格数据&#xff0c;在结构化表格数据上应用预训练仍然是一个挑战。本文提出了TAPEX&#xff0c;通过在一个合成语料库上学习神经SQL执行…...

Ruby:从宝石到编程语言的奇妙联系(中英双语)

Ruby&#xff1a;从宝石到编程语言的奇妙联系 在珠宝世界中&#xff0c;红宝石&#xff08;Ruby&#xff09;是一种象征热情、力量和高贵的珍贵宝石&#xff1b;而在编程世界中&#xff0c;Ruby则是一门灵活、优雅且富有创造力的编程语言。那么&#xff0c;这两者究竟有何联系…...

RLHF中的on-policy和off-policy的区别

在LLM&#xff08;大语言模型&#xff09;和RLHF&#xff08;基于人类反馈的强化学习&#xff09;中&#xff0c;on-policy和off-policy的主要区别在于数据的来源和策略更新的方式。以下是两者的详细对比以及各自的典型算法&#xff1a; On-policy 和 Off-policy 的区别 特性…...

计算机考研复试上机02

目录 3、排序 1)排序(华中科技大学复试上机题) 2)成绩排序(清华大学复试上机题) 3)特殊排序(华中科技大学复试上机题) 4)整数奇偶排序(北京大学复试上机题) 5)小白鼠排队(北京大学复试上机题) 4、查找 1)找 x(哈尔滨工业大学复试上机题) 2)查找(北…...

利用ETL工具进行数据挖掘

ETL的基本概念 数据抽取&#xff08;Extraction&#xff09;&#xff1a;从不同源头系统中获取所需数据的步骤。比如从mysql中拿取数据就是一种简单的抽取动作&#xff0c;从API接口拿取数据也是。 数据转换&#xff08;Transformation&#xff09;&#xff1a;清洗、整合和转…...

02DevOps基础环境准备

准备两台Linux的操作系统&#xff0c;最简单的方式就是在本机上使用虚拟机搭建两个操作系统&#xff08;实际生产环境是两台服务器&#xff0c;虚拟机的方式用于学习使用&#xff09; 我搭建的两台服务器的ip分别是192.168.1.10、192.168.1.11 192.168.1.10服务器用于安装doc…...

Kafka 入门与实战

一、Kafka 基础 1.1 创建topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test --create 1.2 查看消费者偏移量位置 kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group test 1.3 消息的生产与发送 #生产者 kafka-cons…...

VM虚拟机安装群晖系统

下载群晖系统 https://download.csdn.net/download/hmxm6/90351935 安装群晖连接软件 synology-assistant-6.2-24922(在上面的压缩包里面) 准备好VM虚拟机 创建群晖虚拟机 打开下载下来的虚拟机 添加硬盘 选择类型 创建新的磁盘 指定容量 指定存储文件 完成硬盘添加…...

关于ESP-IDF 5.4 中添加第三方组件esp32-camera找不到文件,编译错误解决办法(花了一天时间解决)

最近需要使用ESP32-S3-CAM 的OV2640摄像头采集图像&#xff0c;为了加速开发进度&#xff0c;于是选择了esp32-camera组件&#xff0c;该组件不是官方组件&#xff0c;需要自己git clone。但在为项目添加esp32-camera组件时&#xff0c;一直编译错误&#xff0c;找不到头文件&a…...

【C++】C++11

目录 C11简介 统一的列表初始化 {}初始化 std::initializer_list 声明 auto decltype nullptr 范围for循环 智能指针 STL中的一些变化 右值引用和移动语义 左值引用和右值引用 右值引用的意义 完美转发 lambda表达式 新的类功能 可变参数模版 包装器 func…...

Intellij IDEA如何查看当前文件的类

快捷键&#xff1a;CtrlF12&#xff0c;我个人感觉记快捷键很麻烦&#xff0c;知道具体的位置更简单&#xff0c;如果忘了快捷键&#xff08;KeyMap&#xff09;看一下就记起来了&#xff0c;不需要再Google or Baidu or GPT啥的&#xff0c;位置&#xff1a;Navigate > Fi…...

CF 278A.Circle Line

题目分析 输入n个数据作为路径&#xff0c;求从a到b的最短距离&#xff0c;需要将其相成一个圆圈&#xff0c;既可以从小往大走又可以从大往小走 思路分析 依然将数据存为数组&#xff0c;通过下标进行操作&#xff0c;既然说了有两种方式那就计算两种方式哪个更快就输出谁 代…...

Naive UI去掉n-select下拉框边框,去掉n-input输入框边框

1、第一种通过js去掉 <template><div><div style"margin-top:10px;width: 100%;"><dade-descriptions><tr><dade-descriptions-item label"代理名称"><dade-input placeholder"代理名称"></dade-…...

(文末提供数据集下载)ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练

文章目录 (文末提供数据集下载)ML.NET库学习001&#xff1a;基于PCA的信用卡异常检查之样本处理与训练目标项目概述代码结构概述1. **主要类和文件**2. **命名空间和使用指令**3. **数据类 (TransactionObservation)**4. **主程序入口 (Main 方法)**5. **数据预处理 (DataPrepr…...

疯狂SQL转换系列- SQL for Milvs2.4

鉴于Milvus仍在不停的迭代新版本&#xff0c;推出新功能&#xff0c;其SDK目前并不稳定。目前其2.4版本的SDK接口已与之前的2.2版本有了较大的差别&#xff0c;功能上也有了一定的调整。为此&#xff0c;我们重新提供了针对[Milvus2.4](https://github.com/colorknight/moql-tr…...

C++的 I/O 流

本文把复杂的基类和派生类的作用和关系捋出来&#xff0c;具体的接口请参考相关文档 C的 I/O 流相关的类&#xff0c;继承关系如下图所示 https://zh.cppreference.com/w/cpp/io I / O 的概念&#xff1a;内存和外设进行数据交互称为 I / O &#xff0c;例如&#xff1a;把数…...

基于ansible部署elk集群

ansible部署 ELK部署 ELK常见架构 &#xff08;1&#xff09;ElasticsearchLogstashKibana&#xff1a;这种架构是最常见的一种&#xff0c;也是最简单的一种架构&#xff0c;这种架构通过Logstash收集日志&#xff0c;运用Elasticsearch分析日志&#xff0c;最后通过Kibana中…...

4.Python字符串和列表:字符串输入、字符串输出、下标和切片、字符串常见函数、列表(list)、列表的循环遍历、列表的增删改查、列表的嵌套、列表的切片

1. Python 字符串 1.1 字符串输入 input() 函数用于从用户获取字符串输入。它总是返回一个字符串类型的值。 # 从用户输入字符串 name input("请输入你的名字&#xff1a;") print(f"你好, {name}")1.2 字符串输出 字符串的输出通常使用 print() 函数…...

51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤

一、Keil uVision5创建工程步骤 1.点击项目&#xff0c;新建 2.新建目录 3.选择目标机器&#xff0c;直接搜索at89c52选择&#xff0c;然后点击OK 4.是否添加起吊文件&#xff0c;一般选择否 5.再新建的项目工程中添加文件 6.选择C文件 7.在C文件中右键&#xff0c;添加…...

Redis - 全局ID生成器 RedisIdWorker

文章目录 Redis - 全局ID生成器 RedisIdWorker一、引言二、实现原理三、代码实现代码说明 四、使用示例示例说明 五、总结 Redis - 全局ID生成器 RedisIdWorker 一、引言 在分布式系统中&#xff0c;生成全局唯一ID是一个常见的需求。传统的自增ID生成方式在分布式环境下容易出…...

Linux ftrace 内核跟踪入门

文章目录 ftrace介绍开启ftraceftrace使用ftrace跟踪指定内核函数ftrace跟踪指定pid ftrace原理ftrace与stracetrace-cmd 工具KernelShark参考 ftrace介绍 Ftrace is an internal tracer designed to help out developers and designers of systems to find what is going on i…...

Visual Studio(VS)没有显示垂直滚轮or垂直滚轮异常显示

前言&#xff1a; 前段时间&#xff0c;我换上了新电脑。满心欢喜地安装好 VS&#xff0c;准备大干一场时&#xff0c;却发现了一个小麻烦 —— 垂直滚轮显示异常&#xff08;如图 1&#xff09;。这种显示方式实在让我难以适应&#xff0c;每一次操作都觉得别扭。 于是&#…...

大数据数仓实战项目(离线数仓+实时数仓)3

1.课程内容和课程目标 2.订单时间维度指标需求分析 根据时间数据&#xff0c;生成一个时间维度表&#xff0c;我们后面还可以去复用这个时间维度表 3.使用kettle生成日期维度数据 Hive创建日期维度表 使用Kettle构建以下组件结构图 使用kettle生成日期维度数据插入到我们的hi…...

通过acme生成与续签ssl证书,并部署到nginx

通过acme生成与续签ssl证书&#xff0c;并部署到nginx 介绍 官方介绍&#xff1a; acme.sh 实现了 acme 协议&#xff0c;可以从 ZeroSSL&#xff0c;Lets Encrypt 等 CA 生成免费的证书。 安装 acme.sh 1. curl方式 curl https://get.acme.sh | sh -s emailmyexample.com…...

c语言对应汇编写法(以中微单片机举例)

芯片手册资料 1. 赋值语句 C语言&#xff1a; a 5; b a; 汇编&#xff1a; ; 立即数赋值 LDIA 05H ; ACC 5 LD R01,A ; R01 ACC&#xff08;a5&#xff09;; 寄存器间赋值 LD A,R01 ; ACC R01&#xff08;读取a的值&#xff09; LD R02,A ; R02 ACC&…...

React基础内容(面试一)

React大厂常见的面试题目涉及多个方面&#xff0c;包括React的基本概念、组件、状态管理、生命周期、性能优化等。以下是对这些面试题目的详细解析&#xff1a; 一、React基本概念 解释React是什么以及它的主要特点 React是一个用于构建用户界面的JavaScript库&#xff0c;由F…...

2025年软件测试五大趋势:AI、API安全、云测试等前沿实践

随着软件开发的不断进步&#xff0c;测试方法也在演变。企业需要紧跟新兴趋势&#xff0c;以提升软件质量、提高测试效率&#xff0c;并确保安全性&#xff0c;在竞争激烈的技术环境中保持领先地位。本文将深入探讨2025年最值得关注的五大软件测试趋势。 Parasoft下载https://…...

常用工具类——Collections集合框架

常用工具类——Collections集合框架 Collections 是 JDK 提供的一个工具类&#xff0c;提供了一系列静态方法&#xff0c;分类来复习&#xff01; 1.排序操作 reverse(List list) :反转顺序shuffle(List list) &#xff1a; 洗牌&#xff0c;将顺序打乱sort(List list) &…...

【大数据技术】搭建完全分布式高可用大数据集群(ZooKeeper)

搭建完全分布式高可用大数据集群(ZooKeeper) apache-zookeeper-3.8.4-bin.tar.gz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 ZooKeeper 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件…...

Docker Desktop安装kubernetes时一直在Starting:Kubernetes failed to start

原因&#xff1a;由于墙的问题&#xff0c;导致拉取国外的K8s镜像失败 解决&#xff1a; 下载 k8s-for-docker-desktop 选中自己的kubernetes 版本 下载zip包 PowerShell运行load_images.ps1文件 重启docker kubernetes运行成功...

物流中的物联网:其含义、应用和优势

随着世界联系日益紧密&#xff0c;物流格局正经历重大变革。科技已成为供应链管理的支柱&#xff0c;推动物流公司迈入效率与连通性兼具的新时代。 物联网&#xff08;IoT&#xff09;是一股变革性力量&#xff0c;重塑着物流与运输行业的架构。物联网在物流领域并非昙花一现的…...

Axure设计教程:动态排名图(中继器实现)

一、开篇 在Axure原型设计中&#xff0c;动态图表是展示数据和交互效果的重要元素。今天&#xff0c;我们将学习如何使用中继器来创建一个动态的排名图&#xff0c;该图表不仅支持自动轮播&#xff0c;还可以手动切换&#xff0c;极大地增强了用户交互体验。此教程旨在提供一个…...

【人工智能】掌握图像风格迁移:使用Python实现艺术风格的自动化迁移

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 图像风格迁移(Image Style Transfer)是一种基于深度学习的计算机视觉技术,通过将一张图像的内容与另一张图像的艺术风格结合,生成一幅具…...

# C指针地址CUP寄存器访问IO内存映射

C指针地址&CUP寄存器访问&IO内存映射 在裸机编程中&#xff0c;C语言可以像汇编语言一样直接操作芯片寄存器地址进行读取和写入&#xff0c;主要是由于以下几个原因&#xff1a; 1. 裸机环境下没有操作系统的干预 裸机编程是指直接在硬件上运行程序&#xff0c;没有…...

UE5 蓝图学习计划 - Day 14:搭建基础游戏场景

在上一节中&#xff0c;我们 确定了游戏类型&#xff0c;并完成了 项目搭建、角色蓝图的基础设置&#xff08;移动&#xff09;。今天&#xff0c;我们将进一步完善 游戏场景&#xff0c;搭建 地形、墙壁、机关、触发器 等基础元素&#xff0c;并添加角色跳跃功能&#xff0c;为…...

浅尝yolo11全程记录1-准备环境+官网模型推理(个人备份)

准备工作&#xff08;虚拟环境、导入项目&#xff09; 安装Anaconda 主要是为了创建和管理虚拟环境&#xff0c;在pycharm里按照项目里的requirments.txt安装依赖的时候&#xff0c;使用虚拟环境会好很多&#xff08;我记得不用Anaconda也可以直接在pycharm的terminal里头创建…...

用 Python 给 Excel 表格截图(20250207)

我搜索了网络上的方案&#xff0c;感觉把 Excel 表格转换为 HTML 再用 platwright 截图是比较顺畅的路径&#xff0c;因为有顺畅的工具链。如果使用的是 Windows 系统则不需要阅读此文&#xff0c;因为 win32com 库更方便。这篇文章中 Excel 转 HTML 的方案&#xff0c;主要弥补…...

Office/WPS接入DS等多个AI工具,开启办公新模式!

在现代职场中&#xff0c;Office办公套件已成为工作和学习的必备工具&#xff0c;其功能强大但复杂&#xff0c;熟练掌握需要系统的学习。为了简化操作&#xff0c;使每个人都能轻松使用各种功能&#xff0c;市场上涌现出各类办公插件。这些插件不仅提升了用户体验&#xff0c;…...

智能化转型2.0:从“工具应用”到“价值重构”

过去几年&#xff0c;“智能化”从一个模糊的概念逐渐成为企业发展的核心议题。2024年&#xff0c;随着生成式AI、大模型、智能体等技术的爆发式落地&#xff0c;中国企业正式迈入智能化转型的2.0时代。这一阶段的核心特征是从单一场景的“工具应用”转向全链条的“价值重构”&…...

深度整理总结MySQL——索引工作原理

B树索引数据结构 前言什么样的索引数据结构是好的搜索速度要求支持范围查找寻求适合查找的算法寻求合适的数据结构二叉查找树自平衡二叉树B树B树数据结构B与B树比较 总结 前言 相信你在面试时&#xff0c;通常会被问到“什么是索引&#xff1f;”而你一定要能脱口而出&#xf…...

基于asr的所见即可说方案

年前写的文章对所见即可说方案进一步调研-CSDN博客&#xff0c;针对rk3568定制版&#xff0c;进行了Accessibility实现所见即可说功能的验证与调研&#xff0c;结论是不可行。 最终解决方案是&#xff1a;结合科大讯飞的AI大模型智能助手&#xff0c;使用rk3588板&#xff08;…...

【截图】selenium自动通过浏览器截取指定元素div的图片

【截图】selenium自动通过浏览器截取指定元素div的图片 思路 截取完整网页截图 通过元素的坐标 截图到指定位置的图片 前提是已经获取到 driver 了 # 定位目标divtarget_div driver.find_element(By.CLASS_NAME, headlines-right)# 获取div的位置和大小location target_div…...