Apache Kafka核心概念-多图-形象易懂(入门教程轻松学)

本入门教程,涵盖Kafka核心内容,经过实例和大量图表,帮助学习者理解,任何问题欢迎留言。算法

目录:编程

本章是学习kafka的核心章节,涵盖内容比较多,在理解上有必定的难度,须要反复阅读理解,才能参透Kafka的设计思想。安全

一、Kafka集群结构

在第一章我给出过一个消息系统通用的结构图,也就是下图:学习

实际上kafka的结构图是有些区别的,如今咱们看下面的图:spa

producer和consumer想必你们都很熟悉,一个生产消息,一个消费掉消息。这里就再也不作太多解释。.net

此图和第一张图能够看到有几个区别:设计

一、多了zookeeper集群,经过前几章的学习咱们已经知道kafka是配合zookeeper进行工做的。3d

二、kafka集群中能够看到有若干个Broker,其中一个broker是leader,其余的broker是follower日志

三、consumer外面包裹了一层Consumer group。server

咱们先讲解一下Broker和consumer group的概念,以及Topic。

 

Broker

一个Borker就是Kafka集群中的一个实例,或者说是一个服务单元。链接到同一个zookeeper的多个broker实例组成kafka的集群。在若干个broker中会有一个broker是leader,其他的broker为follower。leader在集群启动时候选举出来,负责和外部的通信。当leader死掉的时候,follower们会再次经过选举,选择出新的leader,确保集群的正常工做。

 

Consumer Group

Kafka和其它消息系统有一个不同的设计,在consumer之上加了一层group。同一个group的consumer能够并行消费同一个topic的消息,可是同group的consumer,不会重复消费。这就比如多个consumer组成了一个团队,一块儿干活,固然干活的速度就上来了。group中的consumer是如何配合协调的,其实和topic的分区相关联,后面咱们会详细论述。

若是同一个topic须要被屡次消费,能够经过设立多个consumer group来实现。每一个group分别消费,互不影响。

经过本节学习,咱们从全局的层面了解了kafka的结构,接下来咱们会深刻到kafka内部,来看看它是怎么工做的。

 

Topic

kafka中消息订阅和发送都是基于某个topic。好比有个topic叫作NBA赛事信息,那么producer会把NBA赛事信息的消息发送到此topic下面。全部订阅此topic的consumer将会拉取到此topic下的消息。Topic就像一个特定主题的收件箱,producer往里丢,consumer取走。

 

二、Kafka核心概念简介

kafka采用分区(Partition)的方式,使得消费者可以作到并行消费,从而大大提升了本身的吞吐能力。同时为了实现高可用,每一个分区又有若干份副本(Replica),这样在某个broker挂掉的状况下,数据不会丢失。

接下来咱们详细分析kafka是如何基于Partition和Replica工做的。

 

分区(Partition)

大多数消息系统,同一个topic下的消息,存储在一个队列。分区的概念就是把这个队列划分为若干个小队列,每个小队列就是一个分区,以下图:

这样作的好处是什么呢?其实从上图已经能够看出来。无分区时,一个topic只有一个消费者在消费这个消息队列。采用分区后,若是有两个分区,最多两个消费者同时消费,消费的速度确定会更快。若是以为不够快,能够加到四个分区,让四个消费者并行消费。分区的设计大大的提高了kafka的吞吐量!!

咱们再结合下图继续讲解Partition。

此图包含以下几个知识点:

一、一个partition只能被同组的一个consumer消费(图中只会有一个箭头指向一个partition)

二、同一个组里的一个consumer能够消费多个partition(图中第一个consumer消费Partition 0和3)

三、消费效率最高的状况是partition和consumer数量相同。这样确保每一个consumer专职负责一个partition。

四、consumer数量不能大于partition数量。因为第一点的限制,当consumer多于partition时,就会有consumer闲置。

五、consumer group能够认为是一个订阅者的集群,其中的每一个consumer负责本身所消费的分区

 

为了加深理解,我举个吃苹果的例子。

问题:有一篮子苹果,你如何把这一篮子苹果尽量快的吃完?

办法一:

我一我的,一个一个苹果吃,以下图。这样显然很慢,我吃完一个才能拿下一个。

办法二:

我再找两我的来一块吃,第一我的拿走一个去吃,而后第二我的拿一个去吃,接着第三我的拿一个去吃,如此循环。速度确定快了,可是三我的仍是会排队等待。三我的排队时间可能很短,可是若是叫了100我的帮忙吃呢?会有大量时间消耗在排队上。

办法三:

我仍是找两我的来一块吃,但我把苹果提早分到三个盘子里,每人分一个盘子,本身吃本身的,这样不但能三我的同时吃苹果,还无须排队。速度显然是最快的。

办法三正是kafka所采用的设计方式,盘子就是partition,每一个人就是一个consumer,每一个苹果就是一条message。办法三每一个盘子中苹果的消费是有序的,而办法二的消费是彻底无序的。

相信经过这个例子你必定能充分理解partition的概念,以及为何kafka会如此设计。

关于partition暂时说到这里,接下来介绍副本。

 

副本(Replica)

提到副本,确定就会想到正本。副本是正本的拷贝。在kafka中,正本和副本都称之为副本(Repalica),但存在leader和follower之分。活跃的称之为leader,其余的是follower。

每一个分区的数据都会有多份副本,以此来保证Kafka的高可用。

Topic、partition、replica的关系以下图:

topic下会划分多个partition,每一个partition都有本身的replica,其中只有一个是leader replica,其他的是follower replica。

消息进来的时候会先存入leader replica,而后从leader replica复制到follower replica。只有复制所有完成时,consumer才能够消费此条消息。这是为了确保意外发生时,数据能够恢复。consumer的消费也是从leader replica读取的。

因而可知,leader replica作了大量的工做。因此若是不一样partition的leader replica在kafka集群的broker上分布不均匀,就会形成负载不均衡。

kafka经过轮询算法保证leader replica是均匀分布在多个broker上。以下图。

能够看到每一个partition的leader replica均匀的分布在三个broker上,follower replica也是均匀分布的。

关于Replica,有以下知识点:

一、Replica均匀分配在Broker上,同一个partition的replica不会在同一个borker上

二、同一个partition的Replica数量不能多于broker数量。多个replica为了数据安全,一台server存多个replica没有意义。server挂掉,上面的副本都要挂掉。

三、分区的leader replica均衡分布在broker上。此时集群的负载是均衡的。这就叫作分区平衡

分区平衡是个很重要的概念,接下来咱们就来说解分区平衡。

 

分区平衡

在讲分区平衡前,先讲几个概念:

一、AR: assigned replicas,已分配的副本。每一个partition都有本身的AR列表,里面存储着这个partition最初分配的全部replica。注意AR列表不会变化,除非增长分区。

二、PR(优先replica):AR列表中的第一个replica就是优先replica,并且永远是优先replica。最初,优先replica和leader replica是同一个replica。

三、ISR:in sync replicas,同步副本。每一个partition都有本身的ISR列表。ISR是会根据同步状况动态变化的。

最初ISR列表和AR列表是一致的,但因为某个节点死掉,或者某个节点的follower replica落后leader replica太多,那么该节点就会被从ISR列表中移除。此时,ISR和AR就再也不一致

接下来咱们经过一个例子来理解分区平衡。

一、根据以上信息,一个拥有3个replica的partition,最初是下图的样子。

能够看到AR和ISR保持一致,而且初始时刻,优先副本和leader副本都指向replica 0.

二、接下来,replica 0所在的机器下线了,那么状况会变成以下图所示:

能够看到replica 0已经从ISR中移除掉了。同时,因为从新选举,leader副本变成了replica 1,而优先副本仍是replica 0。优先副本是不会改变的。

因为最初时,leader副本在broker均匀分布,分区是平衡的。但此时,因为此partition的leader副本换成了另一个,因此此时分区平衡已经被破坏。

三、replica 0所在的机器修复了,又从新上线,状况以下图:

能够看到replica 0从新回到ISR列表中,不过此时他没能恢复leader的身份。只能做为follower当一名小弟。

此时分区依旧是不平衡的。那是否意味着分区永远都会不平衡下去呢?不是的。

四、kafka会定时触发分区平衡操做,也能够主动触发分区平衡。这就是所谓的分区平衡操做,操做完后以下图。

能够看到此时leader副本经过选举,会从新变回来replica 0,由于replica 0是优先副本,其实优先的含义就是选择leader时被优先选择。这样整个分区又回到了初始状态,而初始时,leader副本是均匀分布的。此时已经分区平衡了。

因而可知,分区平衡操做就是使leader副本和优先副本保持一致的操做。能够把优先副本理解为分区的平衡状态位,平衡操做就是让leader副本归位。

 

Partition的读和写

经过以前的学习,咱们知道topic下划分了多个partition,消息的生产和消费最终都是发生在partition之上。下图是一个三个partition的topic的读写示意。

咱们先看右边的producer,能够看到写的时候,采用round-robin算法,轮询往每一个partition写入。

而在消费者端,每一个consumer都维护一个offset值,指向的是它所消费到的消息坐标。

咱们先看group A的三个consumer,他们分别独立消费不一样的三个partition。每一个consumer维护了本身的offset。

咱们再看group B,能够看到两个group是并行消费整个topic,同一条消息会被不一样group消费到。

 

此处有以下知识点:

一、每一个partition都是有序的不可变的。

二、Kafka能够保证partition的消费顺序,但不能保证topic消费顺序。

三、不管消费与否,保留周期默认两天(可配置)。

四、每一个consumer维护的惟一元数据是offset,表明消费的位置,通常线性向后移动。

五、consumer也能够重置offset到以前的位置,能够以任何顺序消费,不必定线性后移。

 

回顾

本章是理解kafka设计的核心,经过本章学习你应该理解以下知识点:

  1. producer
  2. consumer
  3. consumer group
  4. broker
  5. 分区(partition)
  6. 副本(replica)
  7. 分区平衡
  8. 消息读写

若是对上面提到的知识点还有不清晰的地方,请再复习,或者找其它学习资料进行学习。

下一步:开始kafka核心组件和流程-控制器的学习