🌈🌈🌈🌈🌈🌈🌈🌈
【11来了】文章导读地址:点击查看文章导读!
🍁🍁🍁🍁🍁🍁🍁🍁
Broker 基于 DLedger 的数据写入流程
DLedger 是一套基于 Raft 协议的分布式日志存储组件,部署 RocketMQ 时可以根据需要选择使用 DLeger 来替换原生的副本存储机制
leader 对外提供读写服务:
在 Raft 协议之下,选举出 leader 之后,只有 leader 对外提供读和写的服务,而 follower 对外是不提供服务的,仅仅是用于数据复制的同步
在 Raft 协议之下,如果是一边写 leader,一边从 follower 去读,会存在这样一个问题:
在 leader 写入数据时,有一个过半写入成功机制,即对于当前主从架构中只有半数以上节点写入,才会返回写入成功,那么此时去 follower 中读取数据的时候,可能正好读取到没有写入成功的 follower 节点数据,会造成 数据不一致 的问题
基于 DLedger 数据写入流程如下:
那么 DLedger 处理 leader 中数据写入,为了保证数据写入的 性能,需要尽可能去减少数据写入时的阻塞时间,流程如下:
- 首先还是基于 MappedFile 机制,将日志写入到磁盘文件在内存中的映射区域
page cache,page cache 中的数据等待后台线程异步刷入磁盘即可 - 之后向 follower 中去进行
异步日志复制,等待半数以上 follower 将日志数据写入 page cache 之后,leader 再向用户返回消息写入成功
Broker 引入 DLedger 后的存储兼容设计:
引入 DLedger 之前,RocketMQ 数据时存储在 commitlog 中,但是在 DLedger 中写入的 日志格式 的数据,之后再写入到 commitlog 中,就需要做 日志数据 与 commitlog 之间格式的兼容
首先 DLedger 中的日志包括了 header 和 body 两个部分,将原始的 commitlog 里的数据放入到日志的 body 中去,做到数据的兼容