Kafka简介

Kafka是一个高吞吐量、分布式的发布-订阅消息系统。它最初由LinkedIn公司开发,后来成为Apache项目的一部分。Kafka核心模块使用Scala语言开发,支持多语言(java、c/c++、python、go、erlang、node.js)客户端,具有水平扩展和高吞吐量等特性被广泛使用。

文章全部摘自《Kafka入门与实践》一书。

Kafka背景

在海量数据时代下,如何高效地存储、分析、处理和挖掘海量数据已成为技术研究领域的热点和难点问题。如何采集和运营管理、分析这些数据是大数据处理中一个至关重要的环节,这就需要相应的基础设施提供支持。Kafka就是当前流行的一款非常优秀的消息系统。

Kafka是一款开源的、轻量级的、分布式、可分区和具有复制备份的、基于ZooKeeper协调管理的分布式流平台的功能强大的消息系统。与传统的消息系统相比,Kafka能够很好地处理活跃的流数据,使得数据在各个子系统中高性能、低延迟地不停流转。

Kafka作为一个流处理平台,必须必备一下3个关键特性。

  1. 能够发布和订阅流数据
  2. 存储流数据时提供相应的容错机制
  3. 当流数据到达时能够被及时处理

Kafka 基本结构

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必须支持以下几个应用场景。

  1. 具有高吞吐量来支持诸如实时的日志集
  2. 能够很好地处理大量积压的数据,以便能够周期性地加载离线数据进行处理
  3. 能够低延迟的处理传统消息应用场景
  4. 能够支持分区、分布式,实时地处理消息,同时具有容错保障机制

Kafka特性

  1. 消息持久化
  2. 高吞吐量
  3. 扩展性
  4. 多客户端支持
  5. Kafka Streams
  6. 安全机制
  7. 数据备份
  8. 轻量级
  9. 消息压缩

Kafka应用场景

  1. 消息系统
  2. 应用监控
  3. 网站用户行为追踪
  4. 流处理
  5. 持久性日志
您的支持将鼓励我继续创作!