Kafka为什么拥有高性能?

架构层面

1.利用Partition实现并行处理

       Kafka中的每个Topic都包含一个或多个Partition,且它们位于不同节点。同时,Partition在物理上对应一个本地文件夹,每个Partition包含一个或多个Segment,其中包含一个数据文件与一个索引文件。Partition像一个数组,可以通过索引(offset)去访问其数据。
       Kafka不仅可以实现机器间的并行处理,因为其Partition物理上对应一个文件夹,可以通过配置让同一节点的不同Partition置于不同的disk drive上,从而实现磁盘间的并行处理。具体方法:将不同磁盘mount到不同目录,在server.properties中,将log.dirs设置为多目录(逗号分隔),Kafka会自动将所有Partition均匀分配到不同disk上。
       一个Partition只能被一个Consumer消费,如果Consumer的个数多于Partition的个数,会有部分Consumer无法消费该Topic的数据,所以,Partition的个数决定了最大并行度
       如果用Spark消费Kafka数据,如果Topic的Partition数为N,则有效的Spark最大并行度也为N,即使Spark的Executor数为N+M,最多也只有N个Executor可以同时处理该Topic数据。

2.ISR实现CAP中可用性与数据一致性的动态平衡

       Kafka的数据复制方案接近于Master-Slave,不同的是,Kafka既不是完全的同步复制,也不是完全的一步复制,而是基于ISR的动态复制方案。
       ISR,In-Sync Replica,每个Partition的Leader都会维护这样一个列表,其中包含了所有与之同步的Replica。每次写入数据时,只有ISR中的所有Replica都复制完,Leader才会将这条数据置为Commit,它才能被Consumer消费。
       与同步复制不同的是,这个ISR是由Leader动态维护的,如果Follower不能紧跟上Leader,它将被Leader从ISR中移除,待它重新“跟上”Leader后,会被Leader再次加入ISR中。每次改变ISR后,Leader会将最新ISR持久化到Zookeeper中。
       那么如何判断Follower是否“跟上”Leader?

  • 如果Follower在replica.lag.time.max.ms时间内未向Leader发送Fetch请求(数据复制请求),则Leader将其从ISR中移除。
为什么要使用ISR方案?
  • Leader可移除不能及时与之同步的Follower,所以与同步复制相比可以避免最慢的Follower拖慢整体速度,提高系统可用性。
  • 从Consumer角度来看,ISR中所有Replica都始终处于同步状态,从而与异步复制相比提高了数据一致性。
ISR相关配置
  • Broker的min.insync.replicas参数制定了Broker所要求的ISR最小长度,默认值为1.极限情况下ISR可以只包含Leader,但此时如果Leader宕机,则该Partition不可用,可用性不可保证。
  • 只有被ISR中所有Replica同步的消息才被commit,但是Producer在写数据时,Leader不需要ISR中所有Replica同步该数据才确认收到数据。Producer可以通过acks参数指定最少需要多少个Replica确认收到该消息才视为该消息发送成功。acks默认值为1,即Leader收到该消息后立即告诉Producer收到该消息,此时如果在ISR中的消息复制完该消息前Leader宕机,那该条消息会丢失。推荐做法是:将acks设置为all或-1,此时只有ISR中的所有Replica都收到该数据(也及消息被commit),Leader才会告诉Producer该消息发送成功,这样保证了不会有未知的数据丢失。

实现层面

1.高效实用磁盘
顺序写磁盘

       将写磁盘的过程变为顺序写,可极大提高对磁盘的利用率。Consumer通过offset顺序消费这些数据,且不删除已经消费的数据,从而避免随机写磁盘的过程。
       Kafka删除旧数据的方式是删除整个Segment对应的log文件和整个index文件,而不是删除部分内容。如下代码所示:


image.png
充分利用Page Cache

Page Cache的优点:

  • I/O Scheduler会将连续的小块写组装成大块的物理写从而提高性能。
  • I/O Scheduler会尝试将一些写操作重新按顺序排好,从而减少磁头移动时间。
  • 充分利用所有空闲内存(非JVM内存)。
  • 读操作可以直接在Page Cache内进行。如果消费和生产速度相当,甚至不需要通过物理磁盘交换数据。
  • 如果进程重启,JVM内的Cache会失效,但Page Cache仍然可用
零拷贝

       Kafka中存在大量网络数据持久化到磁盘(Producer到Broker)和磁盘文件通过网络发送(Broker到Consumer)的过程,这个过程中,传统模式下要进行数据的四次拷贝,但是Kafka通过零拷贝技术将其减为了一次,大大增加了效率,原理可以在另一篇文章(https://www.jianshu.com/p/835ec2d4c170)中获得。

3.减少网络开销
批处理

       批处理减少了网络传输的overhead,又提高了写磁盘的效率。
       Kafka的API做中,从send接口来看,一次只能发送一个ProducerRecord,但是send方法并不是立即将消息发送出去,而是通过batch.size和linger.ms控制实际发送频率,从而实现批量发送。

数据压缩降低网络负载
高效的序列化方式
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357

推荐阅读更多精彩内容