漫游Kafka设计篇之数据持久化,漫游kafka


转载注明出处:http://blog.csdn.net/honglei915/article/details/37564595

不要畏惧文件系统!

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提供了很好的机动性和灵活性,这点在今后的文章中会有详述。

桌面虚拟化技术里什是持久化的终端用户虚拟机?

终端虚拟化,也就是最终用户桌面在中央储存库的虚拟化,在很多方面不同于服务器虚拟化。一个主要的区别是终端用户虚拟机的构造。创建桌面虚拟机有两种方法,这两种方法分别提供不同的终端虚拟化模式。
  持久化的终端用户虚拟机:
  在确定你的终端虚拟化模式时,你首先需要考虑的是创建持久化的还是非持久化的。持久化的最终用户虚拟机每个用户使用一个专用的虚拟机。这个专用的虚拟机将包括最终用户必需的应用程序、数据还有虚拟机内部用户状态以及不支持外部服务的要求。然而,由于虚拟机的磁盘文件随着使用而增加,在集中化存储结构下这种终端虚拟化模式将需要大量的存储空间。
  这意味着虚拟机的磁盘文件需要长期的管理,通过使用碎片整理、压缩和虚拟磁盘文件维护工具来帮助控制虚拟机的一致性和大小。持久化的虚拟机每个磁盘文件通常以10GB为起点,随着用户在虚拟机内增加数据磁盘文件大小可能显著增加。
  但是持久化的虚拟机没有解决组织机构在运行物理桌面时面临的许多问题。因为最终用户数据在虚拟机内部存放,(也就是物理桌面内部)组织机构必须使用各种方式,通常是通过终端虚拟化备份工具来保护数据。
  非持久化的最终用户虚拟机:
  非持久化的最终用户虚拟机没有上述要求。因为在用户登录时临时被创建。非持久化的虚拟机需要三个核心组件才能正常工作--事实上,这三个核心组件中最关键的终端虚拟化构建模式是下述说明的第一部分:
  源端桌面虚拟机,只包含已更新的操作系统和必需的实用程序,比如管理和反恶意软件工具。
  虚拟化应用程序或者通过应用程序虚拟化(application virtualization,AppV)工具处理过的程序来捕获它们的运行状态而不是安装过程。因此虚拟应用程序没有被安装而是传输到终端上,这个过程在最终用户真正使用这个程序时启动--正因为如此,在用户登录时虚拟应用程序可以被应用到任何虚拟机。
  用户状态虚拟化(User state virtualization,USV),通过终端虚拟化套件中的定制工具或者标准的微软工具,比如文件夹重定向和漫游配置文件实现。USV持续的保护最终用户数据因为它将用户数据保存在虚拟机外,这也适用于用户登录到该虚拟机时。
  实际上,因为虚拟机只包含OS,程序和最终用户数据只在登录时被应用,每个虚拟机是非持久化的,因为一旦用户注销虚拟机就能被丢弃。因此终端虚拟化的非持久化虚拟机模式比持久化模式更加通用。
  因为不再需要存储单个的虚拟机,这种终端虚拟化模式也大大节省了存储空间。相反,你存储虚拟机的原始拷贝根据需要创建新的虚拟机。需要指出的是AppV和USV都有他们自己独立于终端虚拟化的优势。
  最后,终端虚拟化虚拟机在大小和复杂性上随最终用户工作类型的不同而不同。VMware将最终用户划分为三种不同的类型,每种具有他们自己的需求:
  任务型员工关注基于少量应用的一小部分重复活动,因此对虚拟机需求相对较低。
  知识工作者依靠效能工具来管理信息,他们通常需要完整的生产力套件比如微软Office,同时他们需要经常访问互联网。对虚拟机的需求是中等的。
  高级用户使用复杂的应用程序比如开发工具或者绘图工具,对虚拟机的需求更加迫切。
  制定终端虚拟化需要的服务器资源计划时,理解你的用户需求是必要的,因为每个虚拟机都需要适量的内存,适当大小的分页文件以减少磁盘访问以及合适的虚拟磁盘文件大小。
  考虑持久化的和非持久化的最终用户虚拟机这两种模式,以确定哪种终端虚拟化架构对你的基础设施来说是最好的。...余下全文>>
 


相关内容