22

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

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzUxOTU5Mjk2OA%3D%3D&%3Bmid=2247486202&%3Bidx=1&%3Bsn=233bc318a04151247a380efcc368522b
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前面我们已经分享过几篇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,笔者参考本文制作了的一张思维导图,分享:

ey6r6zY.png!web

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

rEj2ayN.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK