深入拆解消息队列 47 讲
许文强
前腾讯云 Kafka 技术负责人
5385 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
深入拆解消息队列 47 讲
15
15
1.0x
00:00/00:00
登录|注册

37|云原生:MQ的分层存储架构都有哪些实现方案?

你好,我是文强。
这节课我们来看看消息队列中分层存储的功能。很多人对分层存储的概念比较模糊,经常会将它和存算分离混淆在一起。从功能上来看,两者是完全不一样的。存算分离架构主要解决的是集群架构的弹性问题,而分层存储架构解决的是低成本存储冷数据的问题。
下图是两种形态的架构对比,存算分离是将计算层和存储层独立开来,分别负责计算相关逻辑和存储数据。而分层存储在本地完成计算和存储逻辑,然后将 Broker 本地的冷数据上传到远程进行存储,需要时再拉下来处理。
从技术上看,左边的存算分离架构也可以支持分层存储的特性,即把存储层中的冷数据再导入到另外一个存储系统存储。
那分层存储是怎么实现的呢?业界主流消息队列是如何支持分层存储的呢? 带着这两个问题,我们开始今天的课程。

什么是分层存储

首先,我们来了解一下什么是分层存储。
消息队列中的分层存储,就是我们经常见到的冷热数据分开存储。在存算一体的消息队列架构中,消息数据是以分段的形式存储在本地硬盘中的。一般情况下,消息数据保留的时间比较短,大部分在一天左右。而如果要保留长时间的数据,就需要占用大量的本地硬盘空间,这会导致存储成本较高。
为了降低存储成本,消息队列参考了冷热数据分离的思路,提出了分层存储的概念。如下图所示,写入数据的时候还是将数据写入到本地,然后通过在 Broker 中设置一定的策略将 Broker 上的老数据上传到远程的分布式文件系统中。在消费的时候,再从远程拉取数据到本地,给消费端消费。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

消息队列(MQ)的分层存储架构是一种重要的成本优化手段,通过将数据存储到远程位置,降低了本地硬盘的负载压力,从而降低了存储成本。本文介绍了分层存储的实现方案,包括远程文件系统的选择、生产性能优化、消费性能优化等技术要点。在消费性能优化方面,文章探讨了远程数据的读取方式,以及资源隔离、限流、集群回滚等操作。此外,对业界主流消息队列的架构分析,重点分析了Kafka和RocketMQ的分层存储实现。RocketMQ采用准实时的消息上传方式,而Kafka则采用异步上传方式。分层存储是一种可选项,而不是必选项,是一个用户可控开关的特性。从技术实现上看,Kafka的分层存储核心思路是将底层分区维度的分段数据上传到远端存储,在消费时再从远端读取数据返回给客户端。社区版本的Kafka的分层存储目前还在开发阶段,还不能在业务中使用。RocketMQ需要将开启分层存储的Topic的数据从Broker维度的CommitLog中分离出来,重新构建Topic维度的CommitLog,然后将新的CommitLog上传到远程。总的来说,分层存储的核心作用是降低成本,但性能必然会有所降低。因此在一些对性能不敏感的场景,分层存储能起到节省成本的作用。而在性能敏感的场景,不建议开启分层存储。分层存储的基础是选择合适的远程文件系统,云厂商提供的对象存储服务是一个比较优的选择。生产和消费的性能优化是分层存储的核心,集群资源的隔离性以及回滚方案设计,能够极大地提高消息队列集群的稳定性。业界主流消息队列的分层思路,主要有实时写入和异步上传两种方式,选择主要和消息队列集群的特性相关。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解消息队列 47 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • Geek_ec80d2
    bundle除了用于负载均衡外,引入bundle可以大大降低元数据的数量,zk里面只需要保存bundle与broker的对应关系即可,不需要保存topic与broker的对应关系,这也是为什么pulsar可以实现百万topic管理的原因。

    作者回复: “pulsar可以实现百万topic管理”从实践上来看是值的商榷的。这一点就不展开在这里讨论,有兴趣的话,大佬,我们加群细聊~。

    2023-09-27归属地:北京
  • shan
    分层存储总结 分层存储指的是冷热数据分开存储,在数据写入的时候将数据写入本地,然后通过一定策略将一部分数据上传到远程分布式文件系统中,在消费的时候,再从远程拉取数据到本地,以此降低本地磁盘的负载压力和存储成本。 不过远程存储存在以下问题: (1)远程存储性能比本地硬盘低; (2)引入第三方存储,会影响系统的稳定性; 至于是否需要分层存储,一般结合业务场景,如果是大流量、对稳定性要求不高的场景中,分层存储是一个很重要的优化手段,如果对可靠性、稳定性要求较高的场景,则不适合分层存储。 分层存储需要关注的几个地方 1. 远程文件系统选择 各个云厂商提供的对象存储服务比较适合分层存储,稳定性和成本都比较有优势,如果自建服务,一般选择HDFS。 2. 生产性能优化 如果异步写入,对于生产端一般影响不大。如果是同步写入,性能会受到影响。 3. 消费者 消费者主要的问题在于,如果消费的数据不在本地,需要从远程获取,一般有以下两种方案: (1)远程文件先下载到本地(可以设计一个预读算法,将数据提前下载到本地),消费时从本地读取; (2)数据在本地就在本地读取,在远程就直接流式从远程读取; 4. 隔离性 隔离性指的是避免远程上传下载文件过度挤占资源,影响正常消息的生产与消费。有以下几点可以参考: (1)CPU进行绑核操作,比如将上传下载文件的线程绑定到一个固定的CPU上; (2)对于内存方面,可以通过堆外内存、DirectID等手段控制,避免占用过多内存; (3)对于网卡方面,可以控制同一时间上传上线文件的速度,避免网卡带宽资源用光; (4)硬盘IO方面,可以通过扩容存储空间解决; 5. 回滚 回滚指的是当远程存储出现问题时,需要将集群切回到非分层的状态,对于消息有以下两种处理方案: (1)新增数据不再上传到远程存储,保存在本地; (2)消费的数据在远程存储时,给出提示,保证只允许消费在本地的数据;
    2023-09-25归属地:河南
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部