对于 RabbitMQ 运维层面来说,扩容和迁移是必不可少的。扩容比较简单,一般向集群中加入新的集群节点即可,不过新的机器节点中是没有队列创建的,只要后面新创建的队列才有可能进入这个新的节点。
RabbitMQ 中的集群迁移更多的是用来解决集群故障不可短时间内修复而将所有的数据、客户端连接等迁移到新的集群中,以确保服务的可用性。
RabbitMQ 集群迁移包括元数据重建、数据迁移,以及客户端连接的切换。
元数据重建
元数据重建是指在新的集群中创建原集群的队列、交换器、绑定关系、vhost、用户、权限和 Parameter 等数据信息。元数据重建之后才可将原集群中的消息及客户端连接迁移过来。
重建元数据的方法:
- 手工创建
- 客户端创建
- 通过 Web 管理界面的方式重建(推荐)
可以通过 Web 管理界面下载和上传 metadata.json
,即集群的元数据信息文件。
- "Download broker definitions"
- "Upload broker definitions"
注意:如果新集群有数据与 metadata.json
中的数据相冲突,对于交换器、队列及绑定关系这类非可变对象而言会报错,而对于其他可变对象如 Parameter、用户等则会被覆盖,没有发生冲突的则不受影响。如果过程中发生错误,则导入过程终止,导致 metadata.json
中只有部分数据加载成功。
考虑三个问题:
- 原集群突发故障,又或者开启 RabbitMQ Management 插件的那个节点机器故障不可修复,就无法获取原集群的元数据
metadata.json
。 - 新旧集群的 RabbitMQ 版本不一致时会出现异常,可能元数据会不相同。一般情况下,RabbitMQ 是能够做到向下兼容的,在高版本的 RabbitMQ 中可以上传低版本的元数据文件。
- 采用上面的方法将元数据在新集群上重建,则所有的队列都只会落到同一个集群节点上,而其他节点处于空置状态,这样所有的压力将会几集中到这单台节点之上。
解决方案:通过程序(或者脚本)的方式在新建集群上建立元数据。
- 通过 HTTP API 接口创建相应的数据。
数据迁移和客户端连接的切换
考虑消费者客户端的事情,一种是等待原集群中的消息全部消费完成之后再将连接断开,然后与新集群建立连接进行消费作业。
当原集群服务不可用或者出现故障造成服务质量下降而需要迅速将消息流切换到新的集群中时,需要及时将消费者客户端的连接切换到新的集群中,那么在原集群中残留部分未被消费的消息需要做进一步的处理。
数据迁移的主要原理是先从原集群中将数据消费出来,然后存入一个缓存区中,另一个线程读取缓存区中的消息再发布到新的集群中,如此便完成了数据迁移的动作。该动作可以称为 "RabbitMQ Forward "。
RabbitMQ 本身提供的 Federation 和 Shovel 插件都可以实现 RabbitMQ Forward 的功能,不过自定义的 RabbitMQ Forward 工具可以让迁移系统更加高效、灵活。
自动化迁移
与生产者和消费者客户端相关的是交换器、队列及集群的信息,如果这 3 种类型的资源发生改变时需要让客户端迅速感知,以便进行相应的处理,则可以通过将相应的资源加载到 Zookeeper 的相应节点中,然后在客户端为对应的资源节点加入 watcher 来感知变化,当然这个功能使用 etcd 或者集成到公司层面的资源配置中心会更加标准、高效。
可以将整个 RabbitMQ 集群资源的使用分为三个部分:客户端、集群、Zookeeper 配置管理。
网友评论