Kafka简介

1. 什么是kafka

kafka高吞吐量、分布式的发布-订阅消息系统。

官网给的定义为:

ApacheKafka®是一个分布式流处理平台。这个是什么意思呢?

流处理平台有三个关键特性:

(1)能够允许发布和订阅流数据。从这角度来讲,平台更像一消息队列或者企业级的消息系统。

(2)存储流数据时提供相应的容错机制。

(3)当流数据到达能够及时处理。

kafka能够很好地的满足以上3个特性,通过kafka能够很好地建立实时流式数据通道,由该通道可靠地获取系统或应用程序的数据,也可以通过kafka方便的构建实时流数据应用来转换或对流数据进行响应处理。 

2. 为什么会引入kafka

随着信息技术的快速发展和互联网用户规模的急剧增长,计算机所存储的信息量正在呈爆炸式增长,目前数据量已进入大规模和超大规模的海量数据时代,

kafka的设计初衷是使kafka能够成为统一、实时处理大规模数据的平台。 

3. kafka基本架构

1producer:消息生存者

2consumer:消息消费者

3brokerkafka集群的server,负责处理消息读、写请求,存

储消息,之间没有主从关系。

(4) topic:消息队列/分类

 Kafka简介

 生产者负责生产消息,将消息写入Kafka集群,消费者从Kafka集群中拉取消息。

4. kafka基本概念

(1)主题

Kafka将一组消息抽象归纳为一个主题(Topic),也就是说一个主题就是对一个消息的分类。生产者将消息发送到特定主题,消费者订阅主题,或主题将某些分区进行消费。

这里煮个栗子:

比如一个银行中有金额的数据,也有日志数据等等,各种各样的数据,我们可以把这些数据进行分类放入到不同的Topic中,这样消费者读取数据的时候,就直接找到对应的topic读取即可。

(2)消息

消息是kafka通信的基本单位,由一个固定长度的消息头,和一个可变长度的消息体构成。在老版本中,每条消息称为 Message;在由java重新实现的客户端中,每条消息称为Record

(3)分区和副本

kafka将一组消息归纳为一个主题,而每个主题又被分成一个或多个分区(Partition。每个分区由一系列有序、不可变的消息组成,是一个有序队列

每个分区在物理上对应一个文件夹,分区的命名规则为主题名称后接-”连接符,之后再接分区编号,分区编号从0开始,编号最大值为分区的总数减1。每个分区又有一到多个副本(Replica),分区的副本分布在集群的不同代理(broker)上,以提高可用性。从存储角度上分析,分区的每个副本在逻辑上抽象为一个日志(Log)对象,即分区的副本与日志对象是一一对应的。每个主题对应的分区数可以在kafka启动时所加载的配置文件中配置,也可以在创建主题时指定。当然,客户端还可以在主题创建好之后修改主题的分区数。

分区使得kafka并发处理上更加容易,理论上来说,分区数越多吞吐量越高,但要根据集群实际环境及业务场景而定。同时,分区也是kafka保证消息被顺序消费以及对消息进行负载均衡的基础。

Kafka只能保证一个分区之内的消息有序,并不能保证跨分区消息的有序性。每条消息被追加到相应的分区中,是顺序写磁盘,因此效率非常高。这是kafka高吞吐率的一个重要保证。同时与传统的消息系统不同的是,kafka并不会立即删除已被消费的消息,由于磁盘的限制消息也不会一直被存储(事实上这也是没有必要的),因此kafka提供了两种删除老数据的策略,一是基于消息已存储时间的长度,二是基于分区的大小。这两种策略都能通过配置文件进行配置。

 Kafka简介

 

(4)Leader副本和Follower副本

由于kafka副本的存在,就需要保证一个分区的多个副本之间数据一致性,kafka会选择该分区的一个副本作为leader副本,而该分区的其他的副本作为follower副本,只有leader副本才负责处理客户端读/写请求,follower副本从leader副本同步数据。如果没有leader副本,那就需要所有副本同时负责读写请求处理,同时还得保证这些副本之间数据的一致性,假设有n个副本则需要n*n条通路来同步数据,这样数据的一致性和有序性就很难保证。

一如leader副本后客户端只需与leader副本进行交互,这样数据一致性和顺序性就有了保证。follower副本从leader副本同步消息,对于n个副本只需n-1条通路即可,这样就使得系统简单而高效。副本followerleader的角色并不是固定不变的,如果leader失效,通过相应的选举算法将从其他follower副本中选出新的leader副本。

(5)偏移量

任何发布到分区的消息会被直接追加到日志文件(分区目录下以”.log”为文件名后缀的数据文件)的尾部,而每条消息在日志文件中的位置都会对应一个按序递增的偏移量。偏移量是一个分区下严格有序的逻辑值,它并不表示消息在磁盘上的物理位置。由于kafka几乎不允许对消息进行随机读写,因此kafka并没有提供额外索引机制到存储偏移量,也就是说并不会给消息偏移量再提供索引。消费者可以通过控制消息偏移量来对消息进行消费,如消费者可以指定消费的起始偏移量。为了保证消息被顺序消费,消费者已消费的消息对应的偏移量也需要保存。需要说明的是,消费者对偏移量的操作并不会影响消息本身的偏移量。旧版消费者将消息偏移量保存到zookeeper当中,而新版(0.10)消费者是将消费者偏移量保存在kafka内部的一个主题当中。当然,消费者也可以自己在外部系统保存消息偏移量,而无需保存到kafka中。

(6)日志段

一个日志又被分为多个日志段(LogSegment),日志段是kafka日志对象分片的最小单位。与日志对象一样,日志段也是一个逻辑概念,一个日志段对应磁盘上的一个日志文件和两个索引文件。日志文件是以“.log”为文件名后缀的数据文件,用于保存消息实际数据。两个索引文件分别以“.index”,和“.timeindex”作为文件名后缀,分别表示消息偏移量索引文件和消息时间戳索引文件。

(7)代理

kafka基本体系结构中我们提到了kafka集群。kafka集群就是由一个或多个kafka实例构成,我们将每一个kafka实例称为代理(broker),通常也称代理为kafka服务器(kafkaserver)。在生产环境中kafka集群一般包含一台或多台服务器,我们可以在一台服务器上配置一个或多个代理。每个代理都有唯一的标识id,这个id是一个非负整数。在一个kafka集群中,每增加一个代理就需要为这个代理配置一个与该集群中和其他代理不同的idid值可以选择任意非负整数即可,只要保证它在整个kafka集群中唯一,这个id就是这个代理的名字,也就是在启动代理时配置的broker.id的对应值。由于给每个代理分配了不同的brokerId,这样对代理进行迁移就变得更方便,从而对消费者来说是透明的,不会影响消费者对消息的消费。 

(8)生产者

生产者(producer)负责把消息发送给代理,也就是向kafka代理发送消息的客户端。

(9)消费者和消费组

消费者(consumer)以拉取(pull)方式拉取数据,它是消费的客户端。在kafka中每一个消费者都属于一个消费组(consumergroup),我们可以为每一个消费者指定一个消费组,以groupId代表消费组名称,同构group.id配置设置。如果不指定消费组,则该消费者数据默认消费组test-consumer-group。同时,每个消费者都有一个全局唯一的id,通过配置项client.id指定,如果客户端没有指定消费者的idkafka会自动为该消费者生成一个全局唯一的id,格式为${groupId}-${hostname}-${UUID8位字符}同一个主题的一条消息只能被同一个消费组的某一个消费者消费,但不同消费组的消费者可以同时消费该消息。消费组是kafka用来实现对一个主题消息进行广播和单播的手段,实现消息广播只需指定个消费者均属于不同的消费组,消息单播只需让各消费者属于同一个消费组。

 Kafka简介

 

上图中kafka集群中有两个Server(也就是两个Broker),每个Broker中各有一个Topic,第一个Topic中有两个分区P0P3,第二个Topic中有两个分区P1P2;消费者C1C2属于消费组AC3C4C5C6属于消费组BC1消费了Topic1中的P0P3,那么和它同一个组的C2则不能再消费P0P2了,但是消费组B中的消费者依然可以消费P0P3

(10)ISR

kafkazookeeper中动态维护了一个ISRIn-sync Replica),即保存同步的副本列表,该列表中保存的是与Leader副本保持消息同步的所有副本对应的代理节点id。如果一个follower副本宕机(代理失效,如人为关闭或发生物理故障、心跳检测过期、网络延时、进程崩溃等)或落后太多,则该follower副本节点将从ISR列表中移除 

(11)Zookeeper

kafka利用zookeeper保存响应的元数据信息,kafka元数据信息包括如代理节点(broker)信息、kafka节点信息、旧版本消费者信息及其消费偏移量信息、主题信息、分区状态信息、分区副本分配方案信息、动态配置信息等。kafka在启动或运行过程当中会在zookeeper上创建相应节点来保存元数据信息,kafka通过监听机制在这些节点注册相应监听器来监听节点元数据的变化,从而由zookeeper负责管理维护kafka集群,同时通过zookeeper我们能够很方便地对kafka集群进行水平扩展及数据迁移。

通过以上对kafka基本概念介绍,我们可以对kafka基本结构图进行完善:

Kafka简介 

总结:一个或多个producer生产数据给kafka集群中的各个broker节点,一个broker中可以包含多个topic,一个topic中将一组message作为一个主题或分类,一个topic又分为一个或多个partition,每个partition对一个日志文件,partition是实际存放数据的地方,多个partition更有利于kafka并发处理。消费者从partition中拉取数据。