深入理解kafka核心设计与实践原理_读书笔记_第1章 初识Kafka

Kafka“扮演”三大角色

    ·消息系统

        Kafka 具备系统解耦、冗余存储、流量 峰、缓冲、异步通信、扩展性、 可恢复性等功能。

        与此同时, Kafka供了大多数消息系统难以实现的消息顺序性保障 及 回溯消费的功能

    ·存储系统

        得益于 Kafka 的消息持久化功能和多副本机制,Kafka 可以作为长期的数据存储系统来使用,

        只需要把对应的数据保留策略设置为“永久”或启用主题的日志压缩功能即可

    ·流式处理平台

        Kafka 不仅为每个流行的流式处理框架提供了可靠的数据来源,

        还供了一个完整的流式处理类库,比如窗口、连接、变换和聚合等各类操

1.1 基本概念

在这里插入图片描述

1.体系架构

		若干Producer  若干broker  若干Consumer 一个zookeeper集群

        ZooKeeper:Kafka用来负责集群元数据的管理、控制器的选举等操作的。

        Producer: 生产者,负责创建消息,将消息发送(push)到 Broker,

        Broker:服务代理节点,Broker可以简单看做一个独立的kafka节点或者Kafka实例 负责将收到的消息存储到磁盘中

        Consumer:消费者, 负责从 Broker 订阅并拉取消费(pull)消息。

2.主题Topic 、分区Partition 与 偏移量offset

        kafka的消息以主题topic与单位进行归类,主题topic是一个逻辑上的概念,细分为多个分区。

        一个分区只属于单个分区, 同一主题下的不同分区包含的消息是不同的。

        分区在储存层面可以看成一个可追加的日志文件Log。分区可以分布在不同的broker上面

        消息在被追加到分区日志文件时,都会分配一个特定的偏移量offset,

        offset 是消息在分区中的唯一标识,通过offset保证消息在单个分区的有序性,但是不能保证主题内有序

3.生产者分区分配策略

        每一条消息被发送到 broker 之前,会根据分区规则选择存储到哪个具体的分区,

        如果分区规则设定得合理,所有的消息都可以均匀地分配到不同的分区中

4.多副本机制

在这里插入图片描述

        为分区引入了多副本 Replica 机制, 通过增加副本数量可以提升容灾能力。
        
        同一分区的不同副本中保存的是相同的消息(在同一时刻,副本之间并非完全一样),
        
        副本之间是“一主多从”的关系,leader副本负责处理读写请求,follower 副本只负责与leader副本的消息同步。

        副本处于不同的broker,当leader 副本出现故障时,从follower副本中重新选举新的leader副本对外提供服务。 
        
        Kafka 通过多副本机制实现了故障的自动转移,当 Kafka 集群中某个 broker 失效时仍然能保证服务可用。

5.AR ISR OSR

        AR:分区中所有的副本统称为AR(Assigned Replicas)

        ISR:所有与leader副本 保持一定程度同步 的副本(包含leader副本) In-sync Replicas

        OSR:所有与leader副本 同步滞后过多 的副本(不包含leader副本) Out-of-sync Relicas


        ISR 是AR 的一个子集。消息首先发送到leader副本,然后follower副本才能从leader拉取消息进行同步

        同步期间follower副本相对leader 会有一定程度的滞后。 “一定程度” 可以通过参数配置 
      
        如果follower 与leader的滞后在一定程度内 ,那就是ISR。否则就是OSR

        AR = ISR + OSR ,正常情况下 follower 与 leader保持一定程度的同步,即AR = ISR,OSR为空 

6. HW LEO

        HW:High WaterMark,高水位,标识一个特定的消息偏移量offset,消费者只能消费到这个offset之前的消息(不包含HW)

        LEO:LEO Log End Offset 缩写,标识当前日志文件中下一条待写入消息的offset

        如图,代表一个日志文件,有9条消息,第一消息的offset为0,最后一条消息的offset为8,offset为9的消息用虚框表示,代表下一条写入的消息 

在这里插入图片描述

        日志文件的HW为6,表示 消费者 只能拉取到offset在0到5之间的消息,offset为6(HW)的消息对小给这是不可见的

        日志文件的LEO为9, LEO的大小 =  当前日志分区中最后一条消息的offset(8) + 1  = 9 

        分区ISR集合中每个副本都会维护自身的LEO,**而ISR集合中最小的LEO 即为分区的HW**。消费者能消费到HW之前的消息

        注意:很多资料将offset为5看做HW 而8看做LEO 这是错误的 注意HW 和 LEO 的定义

7.图解 ISR 与 HW、LEO 关系

        更好地理解 ISR 集合, 以及 HW LEO 之间的关系, 下面通过简单的示例来进行相关的说明 

        如图 1-5 所示,假设某个分区的 ISR 集合中有3个副本,即一个leader副本和2个follower副本,

在这里插入图片描述
此时分区的 LEO HW 都为3,消息3和消息4从生产者发出之后 会被先存入leader副本,如图1-6所示
在这里插入图片描述

		如图 1-7 所示, 在某一时刻follower1 完全跟上了leader, 而follower2 只同步了消息3,

        那么leader副本的LEO = 5, follower1 的LEO = 5,follower2的LEO = 4
        
        那么当前分区的HW = 4 ,此时消费者可以消费到offset为0至3之间的消息

在这里插入图片描述

8.kafka同步复制 和 异步复制 机制

        由7可见,Kafka 的复制机制既不是完全的同步复制,也不是单纯的异步复制。

        事实上,同步复制要求所有能工作的follower 副本都复制完,这条消息才会被确认为已成功提交,

        这种复制方式极大地影响了性能。

        异步复制方式下,follower 副本异步地从 leader 副本中复制数据,数据只要被 leader 副本写入就被认为已经成功提交。

        在这种情况下,如果follower 副本都还没有复制完而落后于 leader 副本,突然 leader 副本着机,则会造成数据丢失。 

        Kafka 使用的这 ISR 的方式则有效地权衡了数据可靠性和性能之间的关系。

申明:本文内容来源于书籍《深入理解kafka核心设计与实践原理》 个人读书笔记仅用于学习,侵权删。


版权声明:本文为lightupworld原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。