我们知道kafka使用内存映射文件来获取它的索引文件,但是它的日志文件并没有使用内存映射文件技术。
我的问题是为什么索引文件使用内存映射文件,但日志文件不是<?p?
答案 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数据库都采用这种形式)。就像其他人指出的那样: