kafka简介

《Kafka入门与实践》学习笔记

Kafka 是一款开源的、轻量级的 、分布式、可分区和具有复制备份的 (Replicated)、基于ZooKeeper 协调管理的分布式流平台的功能强大的消息系统 。
Kafka 定位就是一个分布式流处理平台。作为一个流式处理平台,必须满足以下三个关键特性:

  • 能够允许发布和订阅流数据。
  • 存储流数据时提供相应的容错机制。
  • 当流数据到达时能被及时处理。

kafka结构
kafka简介

  • 消息生产者(Producer):将消息写入kafka集群
  • 消息消费者(Consumer):从kafka集群中拉取消息。

kafka基本概念

  • 1.主题(Topic):kafka将一组消息抽象归纳为一个主题,也就是说,一个主题就是一个对一个消息的分类。生产者将消息发送到特定的主题,消费者订阅主题或主题的某些分区进行消费。
  • 2.消息(Message):消息是Kafka通信的基本单位,由一个固定长度的消息头和一个可变长度的消息体构成。在老版本中,每一条消息称为Message;在java实现的客户端中,每一条消息称之为Record.
  • 3.分区和副本
    • 分区(Partition):kafka将一组消息归纳为一个主题,而每个主题又被分成一个或多个分区.每个分区由一系列有序、不可变消息组成,是一个有序队列。每个分区在物理上对应为一个文件夹,分区的命名规则为主题名称后接“一”连接符,之后再接分区编号,分区编号从0开始。
    • 副本(Replica):每个分区又又一个至多个副本,分区的副本分布在集群的不同代理上,以提高可用性。从存储的角度上分析,分区的每个副本在逻辑上可以抽象为一个日志(Log)对象。

每个主题对应的分区数可以在Kafka启动时加载配置文件中配置、也可以在创建主题时指定、还可以在修改主题时修改分区数


分区使得kafka在并发处理上变得更加容易,理论上来说,分区数越多吞吐量越高。同时分区也是kafka保证消息被顺序消费以及对消息进行负载均衡的基础。
kafka只能保证一个分区内的消息的有序性,并不能保证跨分区消息的有序性。每条消息被追加到相应的分区中,是顺序写磁盘,因此效率非常高。
kafka不会立即删除已被消费的消息,由于磁盘的限制,消息也不会一直被存储。kafka提供两种删除老消息的策略:

  • 基于消息已存储的时间长度
  • 基于分区的大小。
    kafka简介
  • 4.Leader副本和Follower副本:由于kafka副本的存在,就需要保证一个分区的多个副本质检数据的一致性,kafka会选取一个副本作为leader副本,其他副本即为Follower副本,只有Leader副本才负责处理客户端读/写请求,Follower副本从Leader副本同步数据。当Leader失效,通过响应的选举算法从其他Follower副本选出新的Leader副本。
  • 5.偏移量:任何发布到分区的消息都被被直接追加到日志文件(分区目录下,以.log为文件名后缀的数据文件)尾部,而每条消息在日志文件中的位置都会对应一个按序递增的偏移量。偏移量是一个分区下严格有序的逻辑值,它并不表示消息在磁盘上的物理位置。消费者可以通过控制消息偏移量来对消息进行消费。
  • 6.日志段(LogSegment):一个日志又被划分为多个日志段,日志段是kafka日志 对象的最小单位。与日志对象一样,日志段也是一个逻辑概念。一个日志段对应磁盘上一个具体的日志文件和两个日志索引文件。
    • 日志文件是以.log为文件后缀名的数据文件,用于保存实际数据。
    • 两个索引文件分别以.index和.timeindex作为文件后缀名,分别表示消息偏移索引文件和消息时间戳索引文件。
  • 7.代理(Broker):Kafka集群就是由一个或多个Kafka实例构成,每一个实例都可以称之为代理,通常也称为Kafka服务器(KafkaServer),每一个代理都有唯一的标识id,这个id是一个非负整数。
  • 8.生产者(Producer):负责将消息发送给代理,其实也可看作是向Kafka代理发送消息的客户端。
  • 9.消费者和消费者组
    • 消费者(Consumer):以拉取(pull)方式拉取数据,它是消费消息的客户端。每个消费者也有一个唯一的id,通过配置client.id指定,如果没有指定消费者id,kafka会自动为消费者生成一个全局唯一的id${groupId}-${timestamp}-${UUID前8位字符}
    • 消费组(ConsumerGroup):每一个消费者都属于一个特定的消费者组,我们可以为每一个消费者指定一个消费组,以groupId代表消费组名称,通过group.id配置设置。如果不指定消费组,则属于默认的消费组test-consumer-group.

同一个主题的一条消息只能同时被同一个消费组下的某一个消费组消费,但是不同消费组的消费者可以同时消费。

消费组时实现对一个主题进行广播和单播的手段。
实现消息广播只需指定个消费者属于不同的消费组
实现单播只需要让各个消费者属于同一个消费组。

kafka简介

  • 10.ISR(In-sync Replica):Kafka在Zookeeper中动态维护了一个ISR,即保存同步的副本列表,该列表中保存的是与Leader副本保持消息同步的所有副本对应的代理节点ID。如果一个副本宕机或是落后太多,则该副本节点将从ISR列表中移除。
  • 11.ZooKeeper:zookeeper于生产者没有关系。
    kafka简介

kafka特性

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

Kafka 应用场景
消息系统或是说消息队列中间件是当前处理大数据一个非常重要的组件,用来解决应用解辑、异步通信、流量控制等问题.当前比较流行的消息中间件有 Kafka、 RocketMQ 、RabbitMQ 、 ZeroMQ 、 ActiveMQ 、 MetaMQ 、 Redis 等。
在下面这些场景中, Kafka 是一个不错的选择

  • 消息系统:kafka是一款优秀的消息系统,具有高吞吐率、内置的分区、备份冗余、分布式等特点。
  • 应用监控:利用Kafka采集应用程序和服务器健康相关的指标,如CPU占用率,IO,内存,连接数,TPS,QPS等,然后将指标信息处理,生成图表进行可视化监控。
  • 网站用户行为追踪:Kafka收集用户的操作轨迹、内容信息,通过Hadoop、Spark、Storm进行数据分析处理,生成响应的报告。
  • 流处理:将已收集的流数据提供给其他流式计算框架进行处理。当前最新版本Kafka提供了Kafka Streams支持对流数据的处理
  • 持久性日志: Kafka 可以为外部系统提供一种持久性日志的分布式系统。日志可以在多个节点间进行备份。kafka还可以很方便的与Flume、HDFS进行整合。