1.6.2 Flush机制
Last updated
Last updated
在介绍 Flush 机制之前,先看一看 Kafka中对于日志管理系统的初始化:
注意到,Kafka在初始化时通过scheduler起了四个后台线程(我认为就类似OSlab中扔进ready queue的操作),其中就有我们之前提到的负责删除、清理segment的机制,以及我们这里提到的flush操作。
那什么是flush机制呢?首先对于Linux中的FS,我们知道其有Page\Buffer cache的存在:
有了缓存的存在,用户进程就可以避免数据读写时对磁盘进行的访问,而是改为通过处在内核空间的缓存进行数据交互。
对Kafka而言,其就利用了Linux中的这种设计机制。在Kafka收到数据后,写磁盘时只是将数据写入Page Cache,并不保证数据一定完全写入磁盘。Follower从Leader Fetch数据时,也可通过Page Cache完成,而不一定要真正去读盘。
具体到代码:
也就是说,只有在后台线程检测到超过设定时间之后,缓存中的内容才会真正被flush到磁盘。显然,这种设计减少了访存开销,有利于进一步提高其性能。
那如果数据还没flush到磁盘就宕机掉电了怎么办嘞?答案是不能怎么办,不过好在Kafka还有我们之前所提到的副本机制,其依然可以从副本恢复数据,保障其数据安全。