关于java:kafka下快主从同步

3次阅读

共计 1491 个字符,预计需要花费 4 分钟才能阅读完成。

为什么这么快

上篇 文章提到了 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 常识合辑

正文完
 0