tongchenkeji 发表于:2023-12-13 21:46:120次点击 已关注取消关注 关注 私信 我想问下,rocketmq是怎么存储消息的,一组主从broker都挂了,是不是会丢数据?[阿里云] 暂停朗读为您朗读 我想问下,rocketmq是怎么存储消息的,一组主从broker都挂了,是不是会丢数据? 「点点赞赏,手留余香」 赞赏 还没有人赞赏,快来当第一个赞赏的人吧! 海报 阿里云# RocketMQ973# 云消息队列 MQ1430# 存储536# 消息中间件1371
小周sirAM 2023-12-21 7:34:56 1 RocketMQ的消息存储主要通过三种文件类型来实现:CommitLog、ConsumeQueue和IndexFile。其中,CommitLog是消息主体以及元数据的存储主体,存储了生产者端写入的消息主体内容,消息内容不是定长的。单个文件大小默认为1G,文件名长度为20位,左边补零,剩余为起始偏移量。例如,第一个文件的起始偏移量为0,文件大小为1G=1073741824;当第一个文件写满了,第二个文件的起始偏移量为1073741824,以此类推。 ConsumeQueue则是用来存储 CommitLog 的索引,以提高消息消费的性能。而IndexFile则提供了一种可以通过key或时间区间来查询消息的方法。 至于你提到的主从Broker都挂掉的情况,RocketMQ会保证在一段时间内消息不会丢失。这是由于RocketMQ使用了一种基于日志的存储方式,将消息以顺序写入的方式追加到文件中,从而实现高性能的消息存储和读取。此外,Apache RocketMQ 使用存储时长作为消息存储的依据,即每个节点对外承诺消息的存储时长。在存储时长范围内的消息都会被保留,无论消息是否被消费;超过时长限制的消息则会被清理掉。因此,只要消息的存储时长未超过规定的时间,即使主从Broker出现问题,数据也不会丢失。
RocketMQ的消息存储主要通过三种文件类型来实现:CommitLog、ConsumeQueue和IndexFile。其中,CommitLog是消息主体以及元数据的存储主体,存储了生产者端写入的消息主体内容,消息内容不是定长的。单个文件大小默认为1G,文件名长度为20位,左边补零,剩余为起始偏移量。例如,第一个文件的起始偏移量为0,文件大小为1G=1073741824;当第一个文件写满了,第二个文件的起始偏移量为1073741824,以此类推。
ConsumeQueue则是用来存储 CommitLog 的索引,以提高消息消费的性能。而IndexFile则提供了一种可以通过key或时间区间来查询消息的方法。
至于你提到的主从Broker都挂掉的情况,RocketMQ会保证在一段时间内消息不会丢失。这是由于RocketMQ使用了一种基于日志的存储方式,将消息以顺序写入的方式追加到文件中,从而实现高性能的消息存储和读取。此外,Apache RocketMQ 使用存储时长作为消息存储的依据,即每个节点对外承诺消息的存储时长。在存储时长范围内的消息都会被保留,无论消息是否被消费;超过时长限制的消息则会被清理掉。因此,只要消息的存储时长未超过规定的时间,即使主从Broker出现问题,数据也不会丢失。
异步刷盘会丢 同步刷盘不会丢 ,此回答整理自钉群“群2-Apache RocketMQ 中国开发者钉钉群”