浅谈大数据里的Kafka (6) Kafka高效读写数据

Kafka实现高效数据读写方式:

一、顺序写磁盘
 Kafka的producer生产数据,要写入到log文件中,写的过程是一直追加到文件末端,为顺序写。根据官网数据表明,同样的磁盘,顺序写能到到600M/s,而随机写只有100k/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。

二、应用Pagecache
 Kafka数据持久化是直接持久化到Pagecache中,这样会有几个优势:
  (1)I/O Scheduler 会将连续的小块写组装成大块的物理写从而提高性能。

  (2)I/O Scheduler 会尝试将一些写操作重新按顺序排好,从而减少磁盘头的移动时间。

  (3)充分利用所有空闲内存(非 JVM 内存)。如果使用应用层 Cache(即 JVM 堆内存),会增加 GC 负担。

  (4)读操作可直接在 Page Cache 内进行。如果消费和生产速度相当,甚至不需要通过物理磁盘(直接通过 Page Cache)交换数据。

  (5)假如使用JVM堆内存,则如果进程重启,JVM 内的 Cache 会失效,但 Page Cache 仍然可用。

  尽管持久化到Pagecache上可能会造成宕机丢失数据的情况,但这可以被Kafka的Replication(多副本)机制解决。如果为了保证这种情况下数据不丢失而强制将 Page Cache 中的数据 Flush 到磁盘,反而会降低性能。

三、零拷贝技术
浅谈大数据里的Kafka (6) Kafka高效读写数据
  使用零拷贝技术,消除传输数据在存储器之间不必要的中间拷贝次数,直接从内核页空间的页缓存写入写出,从而有效地提高数据传输效率,并减少CPU工作量。