Kafka---数据持久化

来源:互联网 发布:mysql 默认排序 编辑:程序博客网 时间:2024/05/16 09:23

        今天在学习Kafka(参考文献)的时候,看到由于Kafka是基于JVM的,而Java对象占用空间差不多是数据的两倍并且随着堆中数据量的增加垃圾回收越来越困难,因此如果把数据缓存在内存中会带来严重的GC性能影响。

        对磁盘的随机读写速度是100k/s,但采用6块7200转的SATA RAID-5磁盘阵列的线性写速度差不多是600MB/s,加上操作系统read-ahead(读的时候成块的预读数据)和write-behind(写的时候各种微小琐碎的逻辑写入组织合并成一次较大的物理写入)等技巧,发现线性访问磁盘很多时候比内存访问快得多。

        综上所述,Kafka直接将数据写到了文件系统的日志中!!!

        在大多数的消息系统中,数据持久化的机制往往是为每个Cosumer提供一个B树或者其他的随机读写的数据结构。B树当然是很棒的,但是也带了一些代价:比如B树的复杂度是O(log N),O(log N)通常被认为就是常量复杂度了,但对于硬盘操作来说并非如此。磁盘进行一次搜索需要10ms,每个硬盘在同一时间只能进行一次搜索,这样并发处理就成了问题。虽然存储系统使用缓存进行了大量优化,但是对于树结构的性能的观察结果却表明,它的性能往往随着数据的增长而线性下降,数据增长一倍,速度就会降低一倍。

        直观的讲,对于主要用于日志处理的消息系统,数据的持久化可以简单的通过将数据追加到文件中实现,读的时候从文件中读就好了。这样做的好处是读和写都是 O(1) 的,并且读操作不会阻塞写操作和其他操作。这样带来的性能优势是很明显的,因为性能和数据的大小没有关系了。

        既然可以使用几乎没有容量限制(相对于内存来说)的硬盘空间建立消息系统,就可以在没有性能损失的情况下提供一些一般消息系统不具备的特性。比如,一般的消息系统都是在消息被消费后立即删除,Kafka却可以将消息保存一段时间(比如一星期),这给consumer提供了很好的机动性和灵活性。 


参考文献

http://www.aboutyun.com/thread-12882-1-1.html

原创粉丝点击