消息存储介绍
如何保证消息可靠性:数据持久化存储
存储介质
如何保证消息的快速读写
磁盘顺序写(600mb/s)超过一般网卡速度,而随机写(100kb/s)
零拷贝:避免CPU做大量的数据拷贝任务,从而提高消息存盘和网络发送的速度
限制:文件大小1.5~2G (commitLog文件大小1G)
消息存储结构
. CommitLog文件:消息真正的物理存储文件
. ConsumerQueue文件:类型于数据库中的索引文件,存储的是指向物理存储的地址
. IndexFile文件:通过key或时间区间查询消息的索引文件(控制台查询)
消息存储结构
1、同步刷盘+同步复制 保证master、slave都能落盘,耗时最长
2、同步刷盘+异步复制 只保证master能落盘(当master繁忙或者不可用,则消息消费不到)
3、异步刷盘+同步复制 保证master、slave数据都能刷到内存,可能引起数据丢失(推荐使用)
4、异步刷盘+异步复制 保证master数据能刷到内存,可能引起数据丢失(当master繁忙或者不可用,则消息消费不到),耗时最短,吞吐量最高
文件过期策略
为什么会有文件过期删除机制
由于MetaQ操作CommitLog、ConsumeQueue文件是基于文件内存映射机制,并且在启动的时候会将所有的文件加载,为了避免内存与磁盘的浪费、能够让磁盘能够循环利用、避免因为磁盘不足导致消息无法写入等引入了文件过期删除机制
过期文件
文件默认超过3天(不会关注该文件的内容是否全部被消费)
触发删除过期文件
每天4点DTS触发、磁盘空间不足(当磁盘使用率大于磁盘空间警戒线水位【默认是90%】,会阻止消息写入,当超过85%时会删除过期文件)、人工触发