为什么这么快
上篇 文章提到了kafka的构造,其中有3点有助于进步它的吞吐量。
- partition并行处理
多个partition承载一个topic的音讯存储和传输,减少partition的数量能无效减少吞吐量。 - 写音讯:音讯存储采纳程序写的形式
kafka音讯存储在log文件中,文件采纳程序写的形式写入音讯。因为磁盘构造,程序写要比随机写快不少。
补充:
写音讯还有一点优化,生产者向broker发送音讯过程会先向Page Cache里写入,再异步刷盘到log文件。
为避免音讯失落,能够采纳replication备份的形式。
- 读音讯:文件命名和稠密索引
两者保障了音讯的疾速定位,减速音讯生产。
除了以上内容,还有一个重要因素:
- 零拷贝技术
broker向消费者传递数据过程,按传统的做法会经验如下步骤:
应用程序发动读数据申请,磁盘数据经read buffer进入应用层buffer;再由应用层buffer进入socket buffer,通过网卡进行网络传输。
一份数据未做任何扭转的前提下,经验了数次拷贝,期间还波及用户态和内核态间的转换,这显然是一种节约。
kafka利用DMA技术,实现了零拷贝。
DMA能够用在显卡、声卡等很多硬件上,这里次要用到了网卡的DMA
通过操作系统层面的sendfile函数,数据将简历read buffer到网卡的映射,而后间接发送进来。(要保证数据未做任何扭转)
而java的transferTo办法底层基于操作系统的sendfile实现。
降级后的形式不再须要用户态和内核态之间的切换,同时也免去了屡次拷贝。
- 其它
当然,kafka反对的批量音讯和消息压缩都是其快的起因。
主从同步机制
咱们晓得replication是partition的正本,而ISR就是master(partition所在broker)动静保护的一个汇合,用来记录无效的replication正本。
先看下如下几个概念:
- AR(Assigned Repllicas)一个partition的所有正本(就是replica,不辨别leader或follower)
- ISR(In-Sync Replicas)可能和 leader 放弃同步的 follower + leader自身 组成的汇合。
- OSR(Out-Sync Relipcas)不能和 leader 放弃同步的 follower 汇合
- 公式:AR = ISR + OSR
kafka会保障ISR汇合中记录的正本会同步音讯。
无关同步的配置如下:
# 默认10000 即 10秒
replica.lag.time.max.ms
这个配置的意思是10秒内达成齐全同步的正本,会记录在ISR汇合中;未齐全同步则移出汇合。
好,咱们来看看齐全同步的意思。在这之前先引出两个概念:
- LEO(last end offset)
一个partition中,最新消息的下一个offset - HW(high watermark)
partition的所有replication中同步的最小offset。
图中的例子:
如果partition有8条音讯(0-7),LEO为8;
这个partition有3个replication,其中的两个partition曾经将8条音讯同步了;
最初一个replication只同步了5条音讯(0-4),那么HW会标记为5。
此时音讯0-4对外可见(consumer能够生产),5-7不可见。同时,10秒内此replication不能将5-7音讯同步,它将被移出ISR
当replication将partition的LEO之前的日志全副同步时,则认为该replication曾经追赶上partion,也就是齐全同步。
附录
P6-P7常识合辑
发表回复