rocketmq消息持久化到mysql_探秘RocketMQ消息持久化机制我们知道 RocketMQ 是⼀款⾼性能、⾼可靠的分布式消息中间件,⾼性能和⾼可靠是很难兼得的。因为要保证⾼可靠,那么数据就必须持久化到磁盘上,将数据持久化到磁盘,那么可能就不能保证⾼性能了。
RocketMQ 在兼容这两⽅⾯做的不错,先从磁盘说起,现代的磁盘都是⾼性能的,写速度并不⼀定⽐⽹络的数据传输速度慢。⽐如 SSD 固态硬盘在 M.2 NVMe协议下,顺序写的速度可以达到 1500 MB/s,就算是普通磁盘,如果性能⽐较⾼的话,顺序写的速度可以达到
450MB/s~600MB/s。
在顺序写的情况下是这速度,但是不⼈为控制的话,磁盘采⽤的是随机写,在随机写的情况下,磁盘的写⼊速度急速下降,磁盘的随机写速度可能只有⼏百KB/s,这远远要慢于⽹络传输速度,所以它并不能满⾜⾼性能的要求。
RocketMQ 在持久化的设计上,采取的是消息顺序写、随机读的策略,利⽤磁盘顺序写的速度,让磁盘的写速度不会成为系统的瓶颈。并且采⽤ MMPP 这种“零拷贝”技术,提⾼消息存盘和⽹络发送的速度。极⼒满⾜ RocketMQ 的⾼性能、⾼可靠要求。
上述从硬件的⾓度聊聊了⾼性能的保证,这些咱也不懂,还是来看看 RocketMQ 持久化机制的架构图吧。
在 RocketMQ 持久化机制中,涉及到了三个⾓⾊:
CommitLog:消息真正的存储⽂件,所有消息都存储在 CommitLog ⽂件中。
ConsumeQueue:消息消费逻辑队列,类似数据库的索引⽂件。
IndexFile:消息索引⽂件,主要存储消息 Key 与 offset 对应关系,提升消息检索速度。
咱们逐⼀聊聊吧,CommitLog ⽂件是存放消息数据的地⽅,所有的消息都将存⼊到 CommitLog ⽂件中。⽣产者将消息发送到RocketMQ 的 Broker 后,Broker 服务器会将消息顺序写⼊到 CommitLog ⽂件中,这也就是 RocketMQ ⾼性能的原因,因为我们知道磁盘顺序写特别快,RocketMQ 充分利⽤了这⼀点,极⼤的提⾼消息写⼊效率。
但是消费者消费消息的时候,可能就会遇到⿇烦,每⼀个消费者只能订阅⼀个主题,消费者关⼼的是订阅主题下的所有消息,但是同⼀主题的消息在 CommitLog ⽂件中可能是不连续的,那么消费者消费消息的时候,需要将 CommitLog ⽂件加载到内存中遍历查订阅主题下的消息,频繁的 IO 操作,性能就会急速下降。
为了解决这个问题,RocketMQ 引⼊了 Consumequeue ⽂件。Consumequeue ⽂件可以看作是索引⽂件,类似于 MySQL 中的⼆级索引。在存放了同⼀主题下的所有消息,消费者消费的时候只需要去对应的 Consumequeue 组中取消息即可。Consumequeue ⽂件不会存储消息的全量信息,了解 MySQL 索引的话,应该好理解这⾥,具体存储的字段,我在上图已经标注。这样做可以带来以下两个好处:
由于 Consumequeue ⽂件内容⼩,可以尽可能的保证 Consumequeue ⽂件全部读⼊到内存,提⾼消费效率。
Consumequeue ⽂件也是会持久化的,不存全量信息可以节约磁盘空间。
IndexFile 是 RocketMQ 为消息订阅构建的索引⽂件,⽤来提⾼根据主题与消息队列检索消息的速度,这个就不细说了。
RocketMQ 持久化机制原理差不多就这些了,接下来聊⼀聊消息数据刷盘吧。
因为操作系统 PAGECACHE 的存在,PageCache是OS对⽂件的缓存,⽤于加速对⽂件的读写,所以⼀般都是先写⼊到 PAGECACHE 中,然后再持久化到磁盘上。我们熟悉的其他组件,MySQL、Redis 等都是如此。RocketMQ 也不列外。
在 RocketMQ 中提供了同步刷盘和异步刷盘两种刷盘⽅式,可以通过 Broker 配置⽂中中的 flushDiskType 参数来设置
(SYNC_FLUSH、ASYNC_FLUSH)。
异步刷盘⽅式(默认):消息写⼊到内存的 PAGECACHE中,就⽴刻给客户端返回写操作成功,当 PAGECACHE 中的消息积累到⼀定的量时,触发⼀次写操作,将 PAGECACHE 中的消息写⼊到磁盘中。这种⽅式吞吐量⼤,性能⾼,但是 PAGECACHE 中的数据可能丢失,不能保证数据绝对的安全。
同步刷盘⽅式:消息写⼊内存的 PAGECACHE 后,⽴刻通知刷盘线程刷盘,然后等待刷盘完成,刷
盘线程执⾏完成后唤醒等待的线程,返回消息写成功的状态。这种⽅式可以保证数据绝对安全,但是吞吐量不⼤。
关于RocketMQ 持久化机制的分享就这些,感谢您的阅读,希望这篇⽂章对您的学习或者⼯作有⼀点帮助。有收获的话,也可以帮忙推荐给其他的⼩伙伴,让更多的⼈受益,万分感谢。
mysql下载哪个盘
欢迎关注【互联⽹平头哥】。这⾥有职场感悟、Java 技术,虽然不⾼⼤上,但通俗易懂。今天最好的是明天最低的要求,愿你我共同进步。