为什么这么快
上篇 文章提到了 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 常识合辑