为什么kafka索引文件使用内存Map文件,而日志文件不使用?

s4n0splo  于 2021-06-07  发布在  Kafka
关注(0)|答案(4)|浏览(700)

我们知道kafka使用内存Map文件作为索引文件,但是它的日志文件不使用内存Map文件技术。
我的问题是为什么索引文件使用内存Map文件,而日志文件不使用?

5fjcxozz

5fjcxozz1#

在只附加写的数据库中,使用快速索引来提高读性能是一种常见的优化方法(几乎所有lstm数据库都会这样做)。也正如其他人所指出的:
索引是稀疏的,所以内存占用更小。即使索引的稀疏性也是可配置的,这在数据增长时也很有用。
只附加写模式比随机寻道更快(对于ssd尤其如此),因此在优化时不需要太多注意。

a0zr77ik

a0zr77ik2#

可以Map到内存中的字节数与地址空间有关。例如,32位体系结构只能处理4gb甚至更小的文件部分。Kafka日志通常足够大,可能一次只Map部分,因此使读取变得复杂。
但是,索引文件是稀疏的,这意味着它们的大小相对较小。将它们Map到内存可以加快查找过程,这是内存Map文件提供的主要好处。

fdbelqdn

fdbelqdn3#

日志是存储消息的地方,索引文件指向日志中的位置。
有一个很好的,丰富多彩的博客文章,解释是怎么回事。

4xy9mtcn

4xy9mtcn4#

用mmap方法实现日志和索引并置会带来数据一致性问题。mmap不能100%保证将数据从内存刷新到文件(假设操作系统上的flush应答而不是显式调用munmap(2)),如果索引更新被刷新,但是由于某种原因日志数据没有被成功刷新,那么日志中的数据就不能再被理解了。
顺便说一句,对于一个只追加的数据,在写的方向上,我们只需要关心下一个写块(buffer),所以庞大的数据应该不会影响这一点。

相关问题