专栏文章 基于 NSQ 搭建高可用分布式消息队列

opentest-oper@360.cn · 2021年04月06日 · 最后由 dxx4396 回复于 2021年09月14日 · 4340 次阅读

基于 NSQ 搭建高可用分布式消息队列

NSQ 介绍

简介

NSQ 是一款 Go 语言编写的开源分布式消息队列中间件,具备非常好的性能、易用性和可用性。

性能方面,采用了分布式可横向扩展的架构,让其适用于超大规模的消息实时处理,能够满足绝大部业务量级的需要;

易用性方面,NSQ 配置和部署都非常的简便,提供了清晰的文档和多语言且功能全面的 SDK,同时还提供了浏览器 nsqadmin、nsqlookupd 等非常好用的易用性组件,nsqadmin 可以实现可视化的管理消息集群;

可用性方面,NSQ 具备非常高质量的工程实现,程序鲁棒性非常好,完全具备长期自动稳定运行的能力。在架构上,NSQ 采用了分布式和去中心化的拓扑结构,可实现无单点的高可用部署。在消息消费上采用了 RDY-FIN 设计,确保消息被可靠消费。

NSQ 是一款非常成熟的消息队列中间件,已在大规模生成环境下应用验证。

核心组件

nsqd、nsqlookupd、nsqadmin 是 NSQ 的三个关键组件,三个组件独立部署运行。

nsqd 是 NSQ 最核心的组件,负责接收消息,存储队列和将消息发送给客户端。nsqd 可以多机器部署,当使用客户端向一个 topic 发送消息时,可以配置多个 nsqd 地址,消息会随机的分配到各个 nsqd 上,nsqd 优先把消息存储到内存 channel 中(也可以通过配置让消息全部落盘存储),当内存 channel 满了之后,则把消息写到磁盘文件中。nsqd 可以独立运行。

一个 nsqd 中可以创建多个队列(topic)。支持组播,一个队列可以有多个通道(channel)来同时消费,每个通道都将接收到这个队列中所有消息的副本,保证每个通道中消费到的消息一致,各通道可以有自己的消费进度,互相不会影响。

nsqlookupd 负责管理拓扑信息,提供最终一致服务发现能力。客户端可以通过查询 nsqlookupd 来发现指定队列(topic)的 nsqd 地址。

nsqadmin 提供了一个非常好用的可视化管理后台,可以可视化的管理队列和查询消息处理情况。

通常在生成环境中,这三个组件会一起部署。

搭建高可用集群

部署拓扑

虽然机器故障是小概率事件,但是也无法彻底避免,我们要提供高可用的服务,就必要考虑机器故障。NSQ 采用的是一个完全分布式的拓扑结构,非常适合构建起一个高可用的消息集群。

要实现高可用,有多个等级,比如部分兼容机器故障、兼容单机房故障、兼容地域主干网络故障等等。绝大部分的业务场景下,做到兼容部分机器故障是基本要求,这里我们主要总结下如何兼容部署机器故障,如果要做到更高的可用性部署拓扑也类似,就是多机房、多地域部署。

nsqd 的数量决定整个集群的吞吐能力,NSQ 具备非常好的消息处理性能,具体按实际业务量级决定部署 nsqd 节点规模,但考虑到可用性, 最少不要少于 3 个 nsqd 节点,同样也不要少于 3 个 nsdlookupd 节点。

示例部署拓扑:

启动 3 个 nsdlookupd,所有 nsqd 都连接到这三个 nsdlookupd。生成消息是直接通过负载均衡写入到 nsqd,如果那个 nsqd 挂掉,生产者就无法继续往这个 nsqd 写消息了。消费消息通过 nsdlookupd 做服务发现,配置 3 个 +nsdlookupd,其中某个挂掉不会影响消息消费,nsqd 仍然可以通过其他 nsdlookupd 被发现。nsqadmin 是个 web-ui 管理后台,无任何本地状态,单机部署多机部署都可以。

消息备份/回放

前面我们做到了一个高可用的部署拓扑,但是由于消息是写到一个单一的 nsqd 的,如果那个 nsqd 部署机器挂掉无法恢复,可能会导致这个 nsqd 中积压的消息丢失。所以我们还需要设计消息备份和异常回放的机制。

备份

NSQ 提供了 nsq_to_file 工具,可以用来做消息备份。所有消息实时备份到本地文件,按小时切割文件,消息文件三备份,备份数据存储 n 天。

需要备份的消息使用 nsq_to_nsq 工具,同步写入备份队列,备份机器上运行 nsq_to_file 订阅备份队列的数据,写到磁盘备份。

回放

1.机器挂掉能重启恢复,重启恢复后重启服务即可,nsqd 的内存队列大小设置为 0,数据全部落盘,重启不会丢失数据。
2.机器不能重启恢复的情况下,从备份数据中回放该 nsqd 的备份消息。 需要注意回放时对消息去重,因为写备份时采用全部备份写成功才算成功的方案,可能会导致消息重复。

集群监控

同时我们还需要部署监控,实时监控 NSQ 集群的运行情况,以便出现问题时能技术感知修复。

  1. 机器状态:cpu、内存、磁盘、网络等。
  2. 服务状态:进程、端口存活等。
  3. 消息队列:队列数量、队列积压情况等。

这样就可以做到整个系统无单点,数据三备份,及时感知集群异常。做到一个基础的可用性要求,能够满足绝大部分的场景使用了。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 1 条回复 时间 点赞

nsq 集群的监控有方案可以分享下吗😍

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册