首页 > 其他分享 >RabbitMQ 集群迁移与监控

RabbitMQ 集群迁移与监控

时间:2022-10-08 17:01:25浏览次数:53  
标签:交换器 队列 RabbitMQ 集群 迁移 数据 连接

一、集群迁移   RabbitMQ 中的集群迁移更多的是用来解决集群故障不可短时间内修复而将所有的数据、客户端连接等迁移到新的集群中,以确保服务的可用性。迁移过程包括元数据重建、数据迁移,以及与客户端连接的切换。 1. 元数据重建   元数据重建是指在新的集群中创建原集群的队列、交换器、绑定关系、vhost、用户、权限和Parameter 等数据信息。元数据重建之后才可将原集群中的消息及客户端连接迁移过来。   重建元数据最高效的手段莫过于通过 Web 管理界面的方式重建:在旧集群的 Web 管理界面下载集群的元数据信息文件,然后在新集群上的 Web 管理界面上传并导入集群的元数据信息文件,如果顺利的话,元数据重建成功。   如果新集群有数据与 metadata.json 中的数据相冲突,对于交换器、队列及绑定关系这类非可变对象而言会报错,而对于其他可变对象如 Parameter、用户等则会被覆盖,没有发生冲突的则不受影响。如果过程中发生错误,则导入过程终止,导致 metadata.json 中只有部分数据加载成功。   通过此种方式重建元数据需要考虑三个问题: (1)问题一   如果原集群突发故障,又或者开启 RabbitMQ Management 插件的那个节点机器故障不可修复,就无法获取原集群的元数据 metadata.json,这样元数据重建就无从谈起。 解决方案:   可以采取一个通用的备份任务,在元数据有变更或者达到某个存储周期时将最新的 metadata.json 备份至另一处安全的地方。这样在遇到需要集群迁移时,可以获取到最新的元数据。 (2)问题二   如果新旧集群的RabbitMQ版本不一致时会出现异常情况(新旧版本元数据不相同)。 解决方案:   需要做一些改动,例如,利用新版本的元数据替换部分旧版本的元数据,然后再导入。 (3)问题三   如果采用上面的方法将元数据在新集群上重建,则所有的队列都只会落到同一个集群节点上,而其他节点处于空置状态,这样所有的压力将会集中到这单台节点之上。 解决方案:   通过程序(或者脚本)的方式在新集群上建立元数据,而非简单地在页面上上传元数据文件而已。方法有二: <1>通过使用 Gson 解析 metadata.json 文件,进而使用 HttpClient 调用相应的 HTTP API 在随机的节点上创建相应的队列进程,从而达到了集群节点负载均衡的目的。 <2>客户端通过连接不同的 IP 地址来创建不同的 connection 和 channel,然后将 channel 存入一个缓冲池。之后随机从缓冲池中获取一个 channel,再根据队列列表中的信息创建相应的队列。 2. 数据迁移和客户端连接的切换 (1)生产者连接切换   直接将生产者的客户端与原 RabbitMQ 集群的连接断开,然后再与新的集群建立新的连接,这样就可以将新的消息流转入到新的集群中。 (2)消费者连接切换   分两种情况: <1>原集群正常:等待原集群中的消息全部消费完之后再将连接断开,然后与新集群建立连接进行消费作业。 <2>原集群服务不可用或者出现故障:及时将消费者客户端的连接切换到新的集群中,待原集群修复后再将残留未被消费的消息数据迁移到新集群中。   数据迁移主要原理:先从原集群中将数据消费出来,然后存入一个缓存区中,另一个线程读取缓存区中的消息再发布到新的集群中。流程如图: 3. 自动化迁移 (1)在 zookeeper 或 etcd 中保存 RabbitMQ 生产者和消费者客户端相关的交换器、队列、集群信息,其中每个交换器和队列都有对应的集群信息; (2)每次在 RabbitMQ 创建交换器或队列的同时,在 zookeeper 中创建相应的节点保存交换器或队列的属性和对应的集群信息; (3)客户端程序需要与交换器或队列进行交互时,先连接 zookeeper 获取对应节点的相关信息,与对应的 RabbitMQ 集群连接,进行数据操作;同时在 zookeeper 中对应的节点添加 watcher,以便在数据发生变更时进行相应的变更,从而达到自动化迁移的目的; (4)RabbitMQ 集群迁移时,先在新集群中进行元数据重建,然后通过脚本或程序将 zookeeper 中原集群对应的交换器和队列指向的集群名称改为新集群名称。此时,watch 这些交换器和队列节点的客户端程序会立刻感知变化,关闭与原集群的连接,建立与新集群的连接。最后,使用事先写好的数据迁移工具将原集群中未被消费的消息数据迁移到新集群中。至此,集群迁移完成。   二、集群监控 1. 通过 HTTP API 接口提供监控数据 (1)相关 HTTP API 接口 集群节点信息:/api/nodes 交换器信息:/api/exchanges/{vhost-name}/{exchange-name} 队列信息:/api/queues/{vhost-name}/{queue-name} (2)数据采集与处理过程示例   首先采集程序通过定时调用 HTTP API 接口获取 JSON 数据,然后进行 JSON 解析之后再进行持久化处理。对于这种基于时间序列的数据非常适合使用 OpenTSDB 来进行存储。监控管理系统可以根据用户的检索条件来从 OpenTSDB 中获取相应的数据并展示到页面之中。监控管理系统本身还可以具备报表、权限管理等功能,同时也可以实时读取所采集的数据,对其进行分析处理,对于异常的数据需要及时报告给相应的人员。 2. 通过客户端提供监控数据   也可以通过各个语言版本的客户端接口连接 RabbitMQ 请求相关数据,例如消息数量、消费者实例数等。 3. 检测 RabbitMQ 服务是否健康 (1)外部监控   使用 AMQP 协议来构建一个类似于 TCP 协议中的 Ping 的检测程序,这个程序做的事情只是与 RabbitMQ 建立连接并创建 AMQP 信道而不操作消息数据。   当这个测试程序与 RabbitMQ 服务无法建立 TCP 协议层面的连接,或者无法构建 AMQP 协议层面的连接,再或者构建连接超时时,则可判定 RabbitMQ 服务处于异常状态而无法正常为外部应用提供相应的服务。 (2)内部监控   RabbitMQ Management 插件提供了 /api/aliveness-test/vhost 的 HTTP API 形式的接口,这个接口通过 3 个步骤来验证 RabbitMQ 服务的健康性: <1>创建一个以“aliveness-test”为名称的队列来接收测试消息。 <2>用队列名称,即“aliveness-test”作为消息的路由键,将消息发往默认交换器。 <3>到达队列时就消费该消息,否则就报错。   这个 HTTP API 接口背后的检测程序也称之为 aliveness-test,其运行在 Erlang 虚拟机内部,因此它不会受到网络问题的影响。 4. 元数据管理和监控   RabbitMQ 元数据如交换器、队列、绑定关系等被误删也会对应用造成一定的影响,所以对元数据也需要进行管理和监控。比如通过专用的“元数据审核系统”来配置相应的元数据资源,提供给业务方使用的用户只有可读和可写的权限,这样可以进一步降低风险。   所有的业务应用都需要通过元数据审核系统来申请创建(当然也可以包含查询、修改及删除)相应的元数据信息,将 RabbitMQ 元数据入库,例如为交换器、队列各创建一个数据表。在申请动作完成之后,由专门的人员进行审批,之后在数据库中存储和在 RabbitMQ 集群中创建相应的元数据,这两个步骤可以同时进行,而且也无须为这两个动作添加强一致性的事务逻辑。在数据库和 RabbitMQ 集群之间会有一个元数据一致性校验程序来检测元数据不一致的地方,然后将不一致的数据上送到监控管理系统。监控管理系统中可以显示元数据不一致的记录信息,也可以以告警的形式推送出来,然后相应的管理人员可以选择手动或者自动地进行元数据修正。   元数据一致性检测程序可以通过 /api/definitions 的 HTTP API 接口获取集群的元数据信息,通过解析之后与数据库中的记录一一比对,查看是否有不一致的地方。

标签:交换器,队列,RabbitMQ,集群,迁移,数据,连接
From: https://www.cnblogs.com/wujuntian/p/16769478.html

相关文章

  • 5 分钟完成 ZooKeeper 数据迁移
    作者:草谷前言MSE提供了托管版的ZooKeeper,包含比开源ZooKeeper更强大更稳定的功能,能帮助您免去运维ZooKeeper集群的烦恼,当我们需要从自建ZooKeeper迁移到MSEZooKee......
  • 5 分钟完成 ZooKeeper 数据迁移
    作者:草谷前言MSE提供了托管版的ZooKeeper,包含比开源ZooKeeper更强大更稳定的功能,能帮助您免去运维ZooKeeper集群的烦恼,当我们需要从自建ZooKeeper迁移到MSEZoo......
  • RabbitMQ
    helloworld官方教程​​​http://www.rabbitmq.com/tutorials/tutorial-one-java.html​​生产者​​​https://github.com/kunpengku/farmer/blob/master/rabbitmq/hel......
  • 11-RabbitMQ高级特性-消息可靠性投递
    11-RabbitMQ高级特性-消息可靠性投递消息的可靠投递在使用RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ为我们提供了两种方式用来控制......
  • 什么是虚拟计算机集群
    这个问题来自近期几位网友的私信,他们不约而同问到一个问题:什么是虚拟计算机集群?Laxcus分布式操作系统是如何做的?下面就正式回答一下这个问题。​在我们传统的认知里,或者大家......
  • Ubuntu迁移mysql数据库到新的目录下
    1.先使用下面命令将mysql数据库服务停止:sudosystemctlstopmysql2.迁移到挂载新盘/mnt/data/方式一:sudomv/var/lib/mysql/mnt/data/方式二:sudocp-a/var/l......
  • KingbaseES V8R6集群运维案例之---自动清理集群主库wal日志
    ​案例说明:在KingbaseESV8R6主备流复制的集群,配置复制槽(replicationslot)。复制槽提供了一种自动化的方法来确保主控机在所有的后备机收到WAL段之前不会移除它们,并......
  • 【图解源码】Zookeeper3.7源码剖析,Session的管理机制,Leader选举投票规则,集群数据同步
    Zookeeper3.7源码剖析能力目标掌握Zookeeper中Session的管理机制能基于Client进行Debug测试Session创建/刷新操作能搭建Zookeeper集群源码配置掌握集群环境下Leader选举启动......
  • 史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置
    1Nacos安装Nacos是Alibaba微服务生态组件中的重要组件之一,主要用它实现应用的动态服务发现、配置管理、服务管理。​​github.com/alibaba/spr…​​1.1Nacos概要Nacos是......
  • kubesphere集群ldap集成
    kubesphere集群版本v3.1.1kubectleditconfigmaps-nkubesphere-systemkubesphere-configapiVersion:v1data:kubesphere.yaml:|authentication:au......