关于java:kafka下快主从同步

为什么这么快

上篇 文章提到了kafka的构造,其中有3点有助于进步它的吞吐量。

  1. partition并行处理
    多个partition承载一个topic的音讯存储和传输,减少partition的数量能无效减少吞吐量。
  2. 写音讯:音讯存储采纳程序写的形式
    kafka音讯存储在log文件中,文件采纳程序写的形式写入音讯。因为磁盘构造,程序写要比随机写快不少。

补充:
写音讯还有一点优化,生产者向broker发送音讯过程会先向Page Cache里写入,再异步刷盘到log文件。
为避免音讯失落,能够采纳replication备份的形式。

  1. 读音讯:文件命名和稠密索引
    两者保障了音讯的疾速定位,减速音讯生产。

除了以上内容,还有一个重要因素:

  1. 零拷贝技术

broker向消费者传递数据过程,按传统的做法会经验如下步骤:


应用程序发动读数据申请,磁盘数据经read buffer进入应用层buffer;再由应用层buffer进入socket buffer,通过网卡进行网络传输。

一份数据未做任何扭转的前提下,经验了数次拷贝,期间还波及用户态和内核态间的转换,这显然是一种节约。


kafka利用DMA技术,实现了零拷贝。

DMA能够用在显卡、声卡等很多硬件上,这里次要用到了网卡的DMA

通过操作系统层面的sendfile函数,数据将简历read buffer到网卡的映射,而后间接发送进来。(要保证数据未做任何扭转
而java的transferTo办法底层基于操作系统的sendfile实现。

降级后的形式不再须要用户态和内核态之间的切换,同时也免去了屡次拷贝。

  1. 其它
    当然,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常识合辑

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理