Kafka是一个高吞吐量、分布式的发布-订阅消息系统。它最初由LinkedIn公司开发,后来成为Apache项目的一部分。Kafka核心模块使用Scala语言开发,支持多语言(java、c/c++、python、go、erlang、node.js)客户端,具有水平扩展和高吞吐量等特性被广泛使用。
文章全部摘自《Kafka入门与实践》一书。
Kafka背景
在海量数据时代下,如何高效地存储、分析、处理和挖掘海量数据已成为技术研究领域的热点和难点问题。如何采集和运营管理、分析这些数据是大数据处理中一个至关重要的环节,这就需要相应的基础设施提供支持。Kafka就是当前流行的一款非常优秀的消息系统。
Kafka是一款开源的、轻量级的、分布式、可分区和具有复制备份的、基于ZooKeeper协调管理的分布式流平台的功能强大的消息系统。与传统的消息系统相比,Kafka能够很好地处理活跃的流数据,使得数据在各个子系统中高性能、低延迟地不停流转。
Kafka作为一个流处理平台,必须必备一下3个关键特性。
- 能够发布和订阅流数据
- 存储流数据时提供相应的容错机制
- 当流数据到达时能够被及时处理
Kafka 基本结构
Kafka最基本的结构有生成者和消费者,生产者负责生产消息,将消息写入Kafka集群,消费者从Kafka集群中拉取消息。
Kafka基本概念
1.主题
Kafka将一组消息抽象成一个主题(Topic),一个主题就是对消息的一个分类。生产者将消息发送到指定主题,消费者订阅主题进行消费。
2.消息
消息是Kafka通信的基本单位,由一个固定长度的消息头和一个可变长度的消息体构成。
3.分区和副本
Kafka将一组消息归纳为一个主题,而每个主题又被分成一个或多个分区(Partiton)。每个分区由一系列有序、不可变的消息组成,是一个有序队列。
每个分区在物理上对应一个文件夹,分区的命名规则为主题名称后接”-“连接符,之后再接分区编号,分区编号从0开始。每个分区有一至多个副本(Replica),分区的副本分布在集群的不同代理上,以提高可用性。
Kafka只能保证一个分区之内消息的有序性,并不能保证跨分区消息的有序性。每条消息被追加到相应的分区中,是顺序写磁盘,因此效率非常高。Kafka提供了两种删除老数据的策略,一是基于消息已存储的时间长度,二是基于分区的大小。
4.Leader副本和Follower副本
Kafka要保证一个分区的多个副本之间数据的一致性,Kafka会选择该分区的一个副本作为Leader副本,而其它副本为Follower副本,只有Leader副本才负责处理客户端读/写请求,Follower副本从Leader副本同步数据。如果Leader失效,通过相应的选举算法将从其它Follower副本中选出新的Leader副本。
5.偏移量
任何发布到分区的消息会被直接追加到日志文件的尾部,而每条消息在日志文件中的位置都会对应一个按序递增的偏移量。偏移量是一个分区下严格有序的逻辑值,不是消息在磁盘上的物理位置。消费者可以通过控制消息偏移量来对消息进行消费。
6.日志段
一个日志又被划分为多个日志段(LogSegment),日志端是Kafka日志对象分片的最小单位。日志段是一个逻辑概念,一个日志段对应磁盘上一个具体日志文件和两个索引文件。日志文件是以”.log”为文件名后缀的数据文件,用于保存消息实际数据。两个索引文件分别以”.index”和”.timeindex”作为文件名后缀,分别表示消息偏移量索引文件和消息时间戳索引文件。
7.代理
Kafka集群是由一个或多个Kafka实例构成,每个Kafka实例称为代理(Broker),通常也称代理为Kafka服务器(KafkaServer)。每个代理都有唯一的标识id。
8.生产者
生产者(Producer)负责将消息发送给代理,也就是向Kafka代理发送消息的客户端。
9.消费者和消费组
消费者(Consumer)以拉取(pull)方式拉取数据,它是消费的客户端。在Kafka中每一个消费者都属于一个特定消费组(ConsumerGroup),可以为每个消费者指定一个消费组。每个消费者也有一个全局唯一的id。同一个主题的一条消息只能被同一个消费组下某一个消费者消费,不同消费组的消费者可同时消费该消息。
10. ISR
Kafka在ZooKeeper中动态维护了一个ISR(In-sync Replica),即保存同步的副本列表,该列表中保存的是于leader副本保持消息同步的所有副本对应的代理节点id。如果一个Follower副本宕机或是落后太多,该Follower副本节点将从ISR列表中移除。
11.ZooKeeper
Kafka利用ZooKeeper保存相应元数据信息,Kafka元数据信息包括如代理节点信息、Kafka集群信息、旧版消费者信息及其消费偏移量信息、主题信息、分区状态信息、分区副本分配方案信息、动态配置信息等。
Kafka设计概述
Kafka设计动机
Kafka的设计初衷是使Kafka能够成为统一、实时处理大规模数据的平台。为了达到这个目标,Kafka必须支持以下几个应用场景。
- 具有高吞吐量来支持诸如实时的日志集
- 能够很好地处理大量积压的数据,以便能够周期性地加载离线数据进行处理
- 能够低延迟的处理传统消息应用场景
- 能够支持分区、分布式,实时地处理消息,同时具有容错保障机制
Kafka特性
- 消息持久化
- 高吞吐量
- 扩展性
- 多客户端支持
- Kafka Streams
- 安全机制
- 数据备份
- 轻量级
- 消息压缩
Kafka应用场景
- 消息系统
- 应用监控
- 网站用户行为追踪
- 流处理
- 持久性日志