kafka概念

背景:
当今社会各种应用系统诸如商业、社交、搜索、浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战:

  • 如何收集这些巨大的信息
  • 如何分析它
  • 如何及时做到如上两点


以上几个挑战形成了一个业务需求模型,即生产者生产(produce)各种信息,消费者消费(consume)(处理分析)这些信息,而在生产者与消费者之间,需要一个沟通两者的桥梁-消息系统。
kafka的几个特色:
消息系统,具有系统解耦,冗余存储,流量消峰,缓存,可恢复的功能
存储系统,可以把消息持久化到磁盘,保证消息不丢失
特点

  • 快:单个kafka服务每秒可处理数以千计客户端发来的几百MB数据。
  • 可扩展性:一个单一集群可作为一个大数据处理中枢,集中处理各种类型业务
  • 持久化:消息被持久化到磁盘(可处理TB数据级别数据但仍保持极高数据处理效率),并且有备份容错机制
  • 分布式:着眼于大数据领域,支持分布式,集群可处理每秒百万级别消息
  • 实时性:生产出的消息可立即被消费者消费

kafka概念



Kafka的组件:

  • topic:消息存放的目录即主题
  • Producer:生产消息到topic的一方,负责创建消息,然后投递到kafka环境中
  • Consumer:订阅topic消费消息的一方,连接到kafka,然后消费消息
  • Broker:Kafka的服务实例就是一个broker,大多数情况下,可以认为broker就是一台kafka服务器。


如下图所示,Producer生产的消息通过网络发送给Kafka cluster,而Consumer从其中消费消息

kafka概念


topic:kafka中的消息是以主题为单位进行归类,生产者负责将消息发送到特定的主题topic,消费者负责订阅主题进行消费。
主题是一个逻辑上的概念,它可以分成很多的分区,也就是partitions,一个分区只属于一个主题,很多时候也把分区叫做主题分区,同一个主题下的不同分区的内容是不同,分区在存储层面可以看做是一个可以追加的日志文件,消息在被追加到分区日志文件的时候,会分配一个偏移量offset。offset是消息在分区中的唯一标识,kafka通过offset保证消息在分区中的顺序,offset不跨域分区,
kafka保证的是分区有序而不是主题有序
消息发送时都被发送到一个topic,其本质就是一个目录,而topic由是由一些Partition Logs(分区日志)组成,其组织结构如下图所示:

kafka概念



主题有4个分区,消息被顺序写入到每个分区文件的末尾,kafka的分区跨域分布在不同的broker上面,也就是一个topic可以横跨多个broker。
我们可以看到,每个Partition中的消息都是有序的,生产的消息被不断追加到Partition log上,其中的每一个消息都被赋予了一个唯一的offset值。

kafka概念



每条消息在发送到kafka之前,会根据分区规则选择存储到哪个具体的分区,如果分区规则设置的合理,所有的消息都可以均匀的分配到不同的分区中。如果一个主题只对应一个文件,那么这个文件所在的机器的IO将会成为这个主题的瓶颈,分区解决了这个问题。在创建主题的时候,可以指定分区的个数,当然也可以在创建完主题之后修改分区的数量,通过增加分区的数量可以进行水平的扩展。
kafka为分区引入了多副本的机制,通过增加副本数量,可以提高容灾能力,同一个分区的不同副本中保存的消息是相同的(同一时刻,副本之间的消息并非完全一致),副本之间是 一主多从的关系,其中leader副本负责处理读写请求,follower副本只负责与leader副本的消息同步,副本处于不同的broker中,当leader副本发送故障,会从follower副本中重新选择新的leader副本对外提供服务。
kafka通过多副本机制,实现了故障自动转移,当kafka集群中的某个broker失效,依然能保证对外提供服务。

下图中kafka集群有4个broker,某个主题有3个分区,而且副本因子也是3个,因此每个分区便有了一个leader副本和两个follower 副本。生产者和消费者只与leader副本进行交互,follower副本只负责消息的同步,但是很多时候follower副本的消息会滞后于leader副本。

kafka概念


kafka消费者也具备容灾的能力,当消费者使用pull从服务端拉去消息,并且保存了消费的具体offset,当消费者宕机恢复后,会根据之前保存的消费者位置重新进行消费,这样就不会造成消息丢失。
分区中的所有副本统称AR(Assigned Replicas),所有与leader副本保持一定程度同步的副本(包括leader副本)组成ISR(In-Sync Replicas),ISR是AR集合的一个子集。消息会先发送到leader副本,然后follower副本才能从leader副本中拉取消息进行同步,同步期间内follower副本相对于leader副本有一定程度的滞后,这里说的一定程度是指可以忍受的范围内,这个参数可以通过配置。与leader副本同步滞后过多的副本(不包含leader副本)组成OSR(Out-of-Snyc-Replicas),也就是AR=ISR+OSR,正常情况下,所有的follower副本都应该与该leader副本保持一定程度的同步,也就是AR=ISR。
leader副本负责维护和跟踪ISR集合中所有follower副本的滞后状态,当follower落后太多或者失效时,leader副本会把它从ISR中删除,如果OSR中的follower副本追上了leader副本,那么leader副本会把它从OSR移到ISR中。默认情况下,在leader副本发送故障,只有在ISR集合中副本才有机会被选中为leader,在OSR集合中的副本没有任何机会。
ISR和HW和LEO也有密切关系,HW是高水位,标识了一个特定的消息的偏移量,消费者只能拉取到这个offset之前的消息
 

kafka概念


它代表一个日志文件的一个分区,这个日志文件分区中有9条消息,第一条消息的offset为0,最后一条消息的offset为8,offset为9的消息用虚线表示,代表下一条待输入的消息的offset,日志文件的HW为6,表示消费者只能拉去到offset为0至5之间的消息,而offset为6的消息对消费者是不可见的。
LEO是log end offset,它标识当前日志文件中下一条待写入消息的offset,上图中的9为LEO位置。分区ISR集合中的每个副本都会维护自身的LEO,而ISR集合中最小的LEO为分区的HW,对消费者而言,只能消费HW之前的消息。
为了更好理解ISR集合,以及HW和LEO之间的关系,通过下图说明
 

kafka概念



假设某个分区的ISR集合中有3个副本,也就是一个leader副本和两个follower副本,此时分区的LEO和HW都是3,消息3和消息4从生产者发出之后先被存入leader副本,在消息写入leader之后,follower副本会发送拉去消息请求。

kafka概念


在同步过程中,不同的follower副本同步的效率也不同,如下图

kafka概念



在某一时刻follower1完全跟上了leader,但是follower2只同步了消息3,因此leader副本的LEO值为5,
follower1的LEO为5,follower2的LEO为4,那么当前的HW为4,所以消费者只能消费offset为0-3的消息。
所有的副本都成功的写入了消息3和消息4,这个分区的Hw和LEO都是5,因此消费者可以消费到offset为0-4之间的消息了。

 

部分内容来源互联网,若有侵权联系删除