前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kafka 存储系统设计原理

kafka 存储系统设计原理

原创
作者头像
erili
发布2020-08-25 08:21:42
9270
发布2020-08-25 08:21:42
举报
文章被收录于专栏:技术论坛

目标

  • 高吞吐量. 支持大量的事件流, 如日志aggregation
  • 优雅的处理巨量数据日志以支持周期性的离线数据加载
  • 低延迟提交
  • 支持分区, 分布式, 实时处理
  • 当数据发送到其它系统时, 需要知道这个系统是可以容错的(fault-tolerance)

kafka为了做到这一点, 系统设计更加接近数据库的日志系统而非传统消息队列

难点

硬盘读写问题

写入银盘慢? 实际上使用恰当, 写入硬盘也很快,如7200转的机械硬盘, 线性写入的性能大概是600MB/s, 而随机写入的性能大概是 100K/s, 相差6000多倍

现代操作系统一般都会有缓存, 也就是写入文件时会先写入内存cache 再写入硬盘, 所以数据会保存两份, 或者更多

更糟糕的是使用jvm的场景, 1. java 对象的额外数据很大, 一般会是数据的两倍甚至更多. 2. 当堆内存增加时GC 会非常复杂且非常慢.

综上, kafka的设计很简单, 直接写入文件系统(kernel cachepage)而不经过任何缓存.

在硬盘数据结构上kafka不选择常用的Btree, 虽然有O(logN)的速度, 但是机械硬盘并不如此, 机械硬盘每一次跳动要10ms

kafka 的消息被消费后, 并不会立即删除, 而是会保留一段时间

大量小io

kafka 抽象了一个消息集(message set), kafka 视情况, 可能一次网络请求发送一组消息, 而不是一个消息一个网络请求. 消费者消费时可能是一次读取多个消息.

通过这个简单的优化可以充分理由每一次网络请求, 提高硬盘io的顺序性, 以及提高物理内存的连续性

字节复制(零拷贝)

根据生产者,代理(broker) ,消费者分割消息, 传输时无需修改.

broker 维护消息日志. 消息日志保存在一个文件目录以生产者与消费者使用的格式保存

kafka 以零拷贝的方式直接把消息写入内核pagecache

更多 关于java 零拷贝的信息: https://developer.ibm.com/articles/j-zerocopy/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目标
  • 难点
    • 硬盘读写问题
      • 大量小io
        • 字节复制(零拷贝)
        相关产品与服务
        消息队列 CMQ
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档