不要畏惧文件系统!

Kafka大量依赖文件系统去存储和缓存消息。对于硬盘有个传统的观念是硬盘总是很慢,这使很多人怀疑基于文件系统的架构能否提供优异的性能。实际上硬盘的快慢完全取决于使用它的方式。设计良好的硬盘架构可以和内存一样快。

在6块7200转的SATA RAID-5磁盘阵列的线性写速度差不多是600MB/s,但是随即写的速度却是100k/s,差了差不多6000倍。现代的操作系统都对次做了大量的优化,使用了 read-ahead 和 write-behind的技巧,读取的时候成块的预读取数据,写的时候将各种微小琐碎的逻辑写入组织合并成一次较大的物理写入。对此的深入讨论可以查看这里,它们发现线性的访问磁盘,很多时候比随机的内存访问快得多。

为了提高性能,现代操作系统往往使用内存作为磁盘的缓存,现代操作系统乐于把所有空闲内存用作磁盘缓存,虽然这可能在缓存回收和重新分配时牺牲一些性能。所有的磁盘读写操作都会经过这个缓存,这不太可能被绕开除非直接使用I/O。所以虽然每个程序都在自己的线程里只缓存了一份数据,但在操作系统的缓存里还有一份,这等于存了两份数据。

另外再来讨论一下JVM,以下两个事实是众所周知的:

Java对象占用空间是非常大的,差不多是要存储的数据的两倍甚至更高。

随着堆中数据量的增加,垃圾回收回变的越来越困难。

基于以上分析,如果把数据缓存在内存里,因为需要存储两份,不得不使用两倍的内存空间,Kafka基于JVM,又不得不将空间再次加倍,再加上要避免GC带来的性能影响,在一个32G内存的机器上,不得不使用到28-30G的内存空间。并且当系统重启的时候,又必须要将数据刷到内存中( 10GB 内存差不多要用10分钟),就算使用冷刷新(不是一次性刷进内存,而是在使用数据的时候没有就刷到内存)也会导致最初的时候新能非常慢。但是使用文件系统,即使系统重启了,也不需要刷新数据。使用文件系统也简化了维护数据一致性的逻辑。

所以与传统的将数据缓存在内存中然后刷到硬盘的设计不同,Kafka直接将数据写到了文件系统的日志中。

常量时间的操作效率

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

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

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

kafka与mysql持久化_漫游Kafka设计篇之数据持久化相关推荐

  1. 漫游Kafka设计篇之数据持久化

    转载注明出处:http://blog.csdn.net/honglei915/article/details/37564595 Kafka视频教程同步首发,欢迎观看! 不要畏惧文件系统! Kafka大 ...

  2. kafka配置文件 中文乱码_使用kafka consumer api时,中文乱码问题

    使用Intelli idea调试kafka low consumer时,由于broker存储的message有中文, idea中console端是可以正确显示的 然后mvn package打包到服务器 ...

  3. ezdml 支付mysql 吗_数据库表设计工具EZDML使用教程

    表结构设计器(EZDML) 这是一个数据库建表的小软件,可快速的进行数据库表结构设计,建立数据模型.类似大家常用的数据库建模工具如PowerDesigner.ERWIN.ER-Studio和Ratio ...

  4. 网校mysql设计规范_网校数据库设计

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  5. jquery mysql表格_使用jQuery设计数据表格:设计表格基类

    [IT168专稿]当前在Web开发中,jQuery和PHP无疑是绝佳的配合.其中PHP由于其简单易用,深得开发者的喜爱,而jQuery则由于在前端开发中的灵活和简单,功能强大,可以做出很多很眩目的效果 ...

  6. 汽车站订票系统mysql实验_数据库课程设计报告-车站售票管理系统

    数据库课程设计报告-车站售票管理系统 吉林工程技术师范学院 课程设计报告 设计名称: 车站售票信息管理系统 姓 名: 孟祥丽 学 号: 23号 专 业: 计算机科学与技术 班 级: C1042 院 系 ...

  7. kafka 统计消息总数_查看kafka消息队列的积压情况

    创建topic kafka-topics --create --zookeeper master:2181/kafka2 --replication-factor 2 --partitions 3 - ...

  8. 怎么让修改的html持久化_一文让你明白Redis持久化

    网上虽然已经有很多类似的介绍了,但我还是自己总结归纳了一下,自认为内容和细节都是比较齐全的. 文章篇幅有 4k 多字,货有点干,断断续续写了好几天,希望对大家有帮助.不出意外地话,今后会陆续更新 Re ...

  9. golang mysql加锁_使用golang实现类InnoDB数据行锁效果

    在关系型数据库领域,为人津津乐道的一个特性,便是数据库的锁设计及事务隔离级别. 本文通过golang系统库sync,来实现简单的数据库数据读写操作. 场景说明 小明经营一家水果店,创业初始资金为100 ...

  10. mongodb转mysql思路_脚本 将阿里云 mongodb数据转成mysql

    思路:mongodb是阿里云上,有定时备份,用python脚本去下载备份文件,恢复到我的环境 中,用脚本查出数据转换成sql插入mysql. 我的环境python是2.7.5.注:mysql端要预先建 ...

最新文章

  1. java注解的执行顺序_深入理解Spring的@Order注解和Ordered接口
  2. NEO从源码分析看NEOVM
  3. C语言程序设计之最大公约数与最小公倍数算法
  4. IntelliJ IDEA教程之如何clean或者install Maven项目
  5. JDK8那些惊为天人的新特性
  6. 【Linux入门学习之】Linux连接文件:硬连接和软连接
  7. java 画多边形_javascript绘制一个多边形
  8. 使用WebStorm将项目部署到IIS
  9. 何时适合进行自动化测试?(上)
  10. android 指南针传感器,android 传感器使用 Compass指南针的实现功能
  11. http://acm.whu.edu.cn/land/problem/detail?problem_id=1464
  12. 降噪滤波器的简单使用
  13. 办公室计算机打印机共享,办公室小技巧:如何设置共享打印机
  14. Linux下载HTTP文件
  15. annotate 函数的用法
  16. java 将html转为word导出 (富文本内容导出word)
  17. 技术负责人如何搞定老板之我所见
  18. iOS开发——仿微信图片浏览交互的实现(向下拖拽图片退出图片浏览器)
  19. Linux介绍及视频教程
  20. 观看2022年卡塔尔世界杯的感想

热门文章

  1. 朋友圈我快看不下去了!
  2. SQL Server用户权限详解
  3. android控件布局
  4. Spring Boot 中实现定时任务的常用方式@Scheduled
  5. synchronized工作原理剖析(二)
  6. 解决Xshell连接linux失败的问题
  7. java中的反射(二)
  8. 高通利用DMCA通知迫使GitHub关闭100+代码库
  9. String字符串格式化为:00001
  10. 讨论一下c++中由外部os向主线程中传入参数的问题