kafka消息机制浅析

前言介绍:

  本文是博主阅读深入理解kafka一书的学习笔记,主要介绍kafka生产者生产消息的存储和同步机制,以及消费者从消息队列中获取消息的机制。

kafka三个主要对象:

Producer(生产者):发送消息的一方,创建消息投递到kafka中。
Consumer(消费者):接收消息的一方,从kafka接收消息,并且进行相应的逻辑处理。
Broker(服务代理节点):服务代理节点,,可以视作独立的kafka服务节点,消费者从此处订阅消息。

消息中两个重要的概念:

Topic(主题):字面含义,通过主题的概念把消息分到多种不同的类型的主题
Partition(分区):分区对应的是主题下面的划分,一个分区对应一个主题,分区可以视为一个可追加的文件。

正文:

主题与分区:

kafka消息机制浅析_第1张图片
  上图为一个主题的示例,一个主题对应多个分区。而kafka分区可以分布在不同的服务器上,即一个主题可以跨多个服务器。消息进入分区之前都要经过相应的分区规则来确定具体分配到那个分区,类似哈希算法一样,如果分配规则合理则性能高,如果规则不合理,消息全都挤到一个分区上去了,则该主题的吞吐就取决于一个机器的性能。

分区与副本

  一个分区通常对应多个副本,通常采用的规则是一个leader副本和n个follower副本的形式。其中leader副本负责与生产者消费者进行消息的交互,而follower副本则负责消息的同步,以防止leader副本服务器宕机。由于follower副本是从leader副本中同步消息,所以follower副本中的消息一般会与leader副本中的消息有一定的延迟。

AR、ISR、OSR

ISR:是leader副本和已经完成当前消息同步的follower副本的集合(其中的follower副本也是存在延迟的,不过延迟在可以接受的范围内)。
OSR:是还没有完成当前消息同步的follower副本的集合。
AR=ISR+OSR,正常情况下的状态是AR=ISR,即OSR为空。
leader副本负责维护和跟踪ISR里面的follower副本的延迟状态,如果落后太多或者副本失效就会被从OSR中剔除。
只要ISR集合里面的follower副本才有资格在leader副本失效的时候被选举成为新的leader。

HW、LEO

HW(High Watermark):每个消息写入分区的时候都会为其分配一个偏移量,从0开始计算,HW则用来表示各个分区中偏移量的最小值。
LEO(Log End Offset):当前分区待写入消息的偏移量,大小等于当前分区的偏移量+1,ISR中分区最小的LEO为HW。
如下图,则当前分区的HW为4,消费者只能消费到0到3之间的消息。
kafka消息机制浅析_第2张图片

消息复制机制

  kafka采用的消息复制机制为异步复制,因为同步复制要求所有的followe副本都复制完才算是完成复制,这会大大影响性能。而kafka采用的异步机制则是follower开始复制数据的时候就算是成功提交,不过当leader副本的机器突然宕机则会造成数据的丢失。kafka使用ISR的方式有效的保证了数据的可靠性和复制的性能。
当leader宕机的时候采用两种方案:
1、优先从 ISR 列表中选出第一个作为 leader 副本,这个叫优先副本。
2、 如果 ISR 列表为空,则查看该 topic 的unclean.leader.election.enable配置,为 true 则代表允许选用非 ISR 列表的副本,即 OSR 列表内的副本作为 leader,那么此时就意味着数据可能丢失,为 false的话,则表示不允许,直接抛出 NoReplicaOnlineException 异常,造成 leader 副本选举失败。

你可能感兴趣的:(中间件,kafka,分布式,java)