为什么kafka索引文件使用内存映射文件,但日志文件不是吗?

时间:2018-02-07 13:37:46

标签: apache-kafka

我们知道kafka使用内存映射文件来获取它的索引文件,但是它的日志文件并没有使用内存映射文件技术。

我的问题是为什么索引文件使用内存映射文件,但日志文件不是<?p?

4 个答案:

答案 0 :(得分:3)

使用mmap方法同时实现日志和索引附加会带来数据一致性问题。如果索引更新被刷新但由于某种原因日志数据未成功刷新,mmap不能100%保证将数据从内存刷新到文件(假设在OS上进行刷新回复,而不是在munmap(2)上进行显式调用) ,则无法再理解日志中的数据。

顺便说一句,对于仅追加数据,在写入方向上,我们只需要关心下一个要写入的块(缓冲区),因此庞大的数据不会对此产生影响。

答案 1 :(得分:1)

可以将多少字节映射到内存中与地址空间有关。例如,32位架构只能处理4GB甚至更小的文件部分。通常较大的Kafka日志可能一次只映射部分,因此使读取变得复杂。

但是,索引文件稀疏,这意味着它们的大小相对较小。将它们映射到内存可以加快查找过程,这是内存映射文件提供的主要好处。

答案 2 :(得分:0)

日志是存储消息的位置,索引文件指向日志中的位置。

有一个很好的,色彩鲜艳的blog post, explaining what is going on

答案 3 :(得分:0)

具有快速索引以提高读取性能是写仅追加的数据库中的常见优化(几乎所有LSTM数据库都采用这种形式)。就像其他人指出的那样:

  • 索引稀疏,因此内存占用较小。甚至索引的稀疏性都是可配置的,这在数据增长时很有用。
  • 仅追加写入模式比随机寻道要快(对于SSD尤其如此),因此不需要太多的注意力来进行优化。