0%

kafka简介

kafka是一个高吞吐量、分布式的发布-订阅系统,核心模块使用Scala语言开发,开源的、轻量级的、分布式的、可分区和有复制备份的、基于zookeeper协调管理的分布式流平台的功能强大的消息系统。

基本结构

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

基本概念

  • 主题 kafka将一组消息抽象归纳为一个主题(Topic),生产者将消息发送到特定主题,消费者订阅主题或主题的某些分区来进行消费。
  • 消息 消息(Record)是kafka通信的基本单位,由一个固定长度的消息头和一个可变长度的消息体构成
  • 分区 每个主题分为一个或多个分区(Partition)。每个分区由一系列有序、不可变的消息组成,是一个有序队列。每个分区在物理上对应为一个文件夹,分区命名规则为主题名称后接”-“连接符,之后再接分区编号,分区编号从0开始,编号最大值为分区总数减一。 分区数越多吞吐量越高,分区是kafka保证消息被顺序消费以及对消息进行负载均衡的基础。kafka只能保证一个分区之内消息的有序性,并不能保证跨分区消息的有序性。
  • 副本 每个分区有一个或多个副本(Replica),分区的副本分布在集群的不同代理上,以提高可用性。从存储角度上分析,分区的每个副本在逻辑上抽象为一个日志对象,一一对应。
  • Leader副本和Follower副本 由于kafka副本的存在,需要保证一个分区的多个副本之间的数据一致性,kafka会选择该分区的一个副本作为Leader副本,其他副本为Follower副本,只有Leader副本才负责处理客户端读写请求,Follower只负责从Leader副本同步数据
  • 偏移量 任何发布到分区的消息会被直接追加到日志文件(分区目录下一”.log”后缀的文件)的尾部,而每条消息在日志文件中的位置都会对应一个按序递增的偏移量。偏移量是一个分区下严格有序的逻辑值,消费者可以通过控制消息偏移量来对消息进行消费。
  • 日志段 一个日志又被划分为多个日志段(LogSegment),日志段是kafka日志对象分片的最小单位。一个日志段对应磁盘上一个具体日志文件和两个索引文件。两个索引文件分别是”.index”和”.timeindex”,分别表示消息偏移量索引文件和消息时间戳索引文件
  • 代理 kafka集群就是有一个或多个kafka实例构成的,我们将每个kafka实例称为代理(Broker),也称之为kafka服务器(kafkaServer),kafka集群一般包括一台或多台服务器,可以在一台服务器上配置一个或多个代理。每一个代理都有唯一标识id,在一个kafka集群中,每增加一个代理就需要为这个代理配置一个与该集群中其他代理不同的id,保证在整个kafka集群中唯一,这个id就是代理的名字,就是broker.id
  • 生产者 生产者(Producer)负责将消息发送给代理
  • 消费者和消费者组 消费者(Comsumer)以拉取(pull)的方式拉取数据,在kafka中每一个消费者都属于一个消费者组(CommsumerGroup),可以为每个消费者指定一个消费者组,通过group.id配置,每个消费者也有一个全局唯一的id,通过client.id配置,如果没有指定client.id,会默认生成,格式为${groupId}-${hostName}-${timestamp}-${UUID前8位},同一个主题的一条消息只能被通一个消费者组下的某一个消费者消费,但不同的消费者组的消费者可同时消费该消息。消费者组是kafka用来实现对一个主题消息进行广播和单播的手段,实现消息广播只需执行各消费者均属于不同的消费者组,消息单播只需让各消费者属于同一个消费者组。
  • ISR kafka在zookeeper中动态维护了一个ISR(In-sync-Replica),即保持同步的副本列表,该列表中保存的是与Leader副本保持消息同步的所有副本对应的代理节点id,如果一个Follower副本宕机或落后太多,该节点会从ISR列表中移除。
  • zookeeper kafka利用zookeeper保存相关元数据信息,包括代理节点信息、kafka集群信息、消费偏移量信息、主题信息、分区状态信息、分区副本分配方案信息、动态配置信息等。kafka在启动或运行过程中会在zookeeper上创建相应节点来保存元数据信息,kafka通过监听机制在这些节点注册相应监听器来监听节点元数据变化,从而由zookeeper负责管理和维护kafka集群

kafka特性

  • 消息持久化 依赖于文件系统来存储和缓存消息
  • 高吞吐量
  • 扩展性
  • 多客户端支持
  • kafka streams 流处理
  • 安全机制
  • 数据备份
  • 轻量级
  • 消息压缩 支持Gzip、Snappy、LZ4三种压缩方式,把多条消息放在一起组成MessageSet,再把MessageSet放到一条消息中,从而提高压缩比率来提高吞吐量。

    应用场景

    消息队列用来解决应用解耦、异步通信、流量控制等问题
  • 消息系统
  • 应用监控
  • 网站用户行为追踪
  • 流处理
  • 持久性日志