干货 | Kafka 内核知识梳理,附思维导图

前面我们已经分享过几篇Kafka的文章,最近简单梳理了下Kafka内核相关的知识,涵盖了Kafka架构总结,副本机制,控制器,高水位机制,日志或消息存储,消息发送与消费机制等方面知识。
文末含对应的Kafka内核思维导图,供参考

1、 架构总结

1)Kafka实际上也是一个主从架构,有一个Controller角色即控制器,协调管理整个集群;

2)有几个Kafka术语肯定是不陌生的:broker,topic,partition,segment,生产者producer,消费者consumer;

2、消费发送机制

1)序列化器:
序列化消息对象转成字节数组,然后通过网络传输。

2)分区器:计算消息发往的具体分区
;如果显示指定了partition,便不会走分区器。

3)消息缓冲池:
客户端的消息缓冲池,默认大小32M,见参数buffer.memory。

4)批量发送:

缓冲池中消息会按batch分批次发送, 默认
批次大小16KB,见参数batch.size。

3、副本机制

1)分区副本默认1,见参数default.replication.factor。
2)副本作用(并不提供读写分离)

  • 实现冗余,提高消息可靠性;

  • 实现高可用,参与leader选举,在leader不可用时提高可用性。

3)leader副本选举

  • 由控制器负责;
  • 选举机制或策略:首先要弄明白AR,ISR的概念,基本策略是从AR中找第一个存活的副本,且该副本在ISR中。

4)Unclean leader选举

参数 unclean.leader.election.enable
用于控制是否允许非同步副本参与leader 选举
,默认false。如果开启,则当ISR为空时就会从这些副本中选举新的leader,这个过程就称为Unclean leader选举。

4、控制器概述

1)作用:协调与管理整个集群,5个主要职责:

  • 主题增删改

  • 分区重分配

  • leader选举

  • 元数据管理

  • broker成员管理,宕机或加入

2)控制器选举:基于zookeeper实现,利用了zookeeper的znode模型与监听机制。

3)控制器故障转移

  • 存在单点故障,但是每个broker节点都可以成为controller;

  • 故障转移即failover也是基于zookeeper实现的,znode模型与监听机制,/controller节点。

5、 HW
机制

1)概念

HW即高水位,是Kafka副本对象的重要属性,分区的高水位由leader副本的高水位表示,含义是被follower副本同步之后的位置。

2)作用

  • 定义消息可见性,只有分区高水位以下的消息才能被消费;

  • 帮助kafka完成副本同步,kafka是基于高水位实现的异步的副本同步机制。

3)LEO的概念
含义是日志末端位移(Log End Offset),下一条消息写入的位移。

6、消息消费机制

1)拉取机制

Kafka生产端是推的机制即Push,消费端是拉的机制即Pull。

2)Pull的优缺点

  • 优点是消费端可以自己控制消息的读取速度和数量;
  • 缺点是不知道服务端有没有数据,所以要一直pull或隔一定时间pull,可能要pull多次并等待。

3)消息投递语义:

Kafka默认保证at-least-once delivery,容许用户实现at-most-once语义,exactly-once的实现取决于目的存储系统。

4)分区分配策略

  • RangeAssignor:按照分区范围分配,当前默认策略;
  • RoundRobinAssignor:轮询的方式分配;
  • StickyAssignor:Kafka 0.11版本引入,根据更多指标比如负载,尽可能均匀。

7、日志存储机制

1)原理

  • 分段存储,这里的段segment指的是日志段文件,Kafka中的日志含义即是消息或数据,日志回滚受log.segment.bytes控制,默认1G;

  • 索引文件,一个稀疏格式的索引,受参数log.index.interval.bytes控制,默认4KB。即不是每条数据都会写索引,默认每写4KB数据才会写一条索引。
$ ll

-rw-r--r-- 1 kafka kafka    1002496 Apr 25 17:08 00000000000051402174.index

-rw-r--r-- 1 kafka kafka 1073741338 Apr 25 17:08 00000000000051402174.log

-rw-r--r-- 1 kafka kafka   10485760 Apr 26 15:03 00000000000051638285.index

-rw-r--r-- 1 kafka kafka  219984088 Apr 26 15:04 00000000000051638285.log

2)日志留存策略

Kafka 会定期检查是否要删除旧消息,见参数 log.retention.check.interval.ms,默认5分钟。当前有三种日志留存策略:

  • 基于空间:log.retention.bytes,默认未开启;
  • 基于时间:log.retention.hours(mintues/ms),默认7天;

  • 基于起始位移:Kafka 0.11.0.0版本引入,解决流处理场景中已处理的中间消息删除问题。

目前基于时间的日志留存策略最常使用。

为了更好的 精进学习
Kafka,笔者参考本文制作了的一张思维导图,分享:

关注本公众号,后台回复 kafka2020
即可下载Kafka内核 高清PDF文档