Featured image of post Kafka

Kafka

本文简要介绍了Kafka的一些概念、应用场景、集群、架构原理、基本使用等方面的内容。

Kafka

Kafka简介

  • 概念
    • 基于发布/订阅的分布式消息系统
    • 由Linkedin开发,用Scala语言编写
  • 特性
    • 消息持久化:采用时间复杂度O(1)的磁盘存储结构,即使TB级以上数据也能保证常数时间的访问速度
    • 高吞吐:即使在廉价的商用机器上,也能达到单机每秒10万条消息的传输
    • 高容错:多分区副本
    • 易扩展:新增机器,集群无需停机,自动感知
    • 同时支持离线、实时数据处理

Kafka应用场景

  • 解耦
  • 冗余
  • 扩展性
  • 灵活性 & 峰值处理能力

Kafka_Application

集群架构

Kafka_Cluster_Structure

详细原理

  • Producer:Producer即生产者,消息的产生者,是消息的入口。
  • Broker:Broker是kafka实例,每个服务器上有一个或多个kafka的实例,我们姑且认为每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,如图中的broker-0、broker-1等……
  • Topic:消息的主题,可以理解为消息的分类,kafka的数据就保存在topic。在每个broker上都可以创建多个topic。
  • Partition:Topic的分区,每个topic可以有多个分区,分区的作用是做负载,提高kafka的吞吐量。同一个topic在不同的分区的数据是不重复的,partition的表现形式就是一个一个的文件夹!
  • Replication:每一个分区都有多个副本,副本的作用是做备胎。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本(包括自己)。
  • Message:每一条发送的消息主体。
  • Consumer:消费者,即消息的消费方,是消息的出口。
  • Consumer Group:我们可以将多个消费组组成一个消费者组,在kafka的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!
  • Zookeeper:kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。

Kafka_Executtion

Kafka_Execution_Core

  • Topic(主题)
    • Topic是Kafka中同一类数据的集合,想当于数据库中的表
    • Producer将同一类数据写入同一个Topic,Consumer从同一个Topic中读取同类数据
    • Topic是逻辑概念,用户只需指定Topic就可以生产或消费数据,不必关心数据存于何处
  • Partition(分区)
    • 分区是一个有序的、不可修改的消息队列,分区内消息有序存储
    • 一个Topic可分为多个分区,相当于把一个数据集分成多份,分别存储不同的分区中
    • Partition是物理概念,每个分区对应一个文件夹,其中存储分区的数据和索引文件
    • Partition数量越多,并发越高,吞吐量越大
  • Replication(副本)
    • 一个分区可以设置多个副本,副本存储在不同的Broker中
  • 为了加快读取速度,多个Consumer可划分为一个组(Consumer Group, CG),并行消费同一个Topic
  • 一个Topic可以被多个CD订阅,CG之间是平等的,即一个消息可同时被多个CG消费
  • 一个CG中可以有多个Consumer,CG中的Consumer之间是竞争关系,即一个消息在一个CG中只能被一个Consumer消费
Kafka_Consumer

Partition队列

  • Partition是一个FIFO队列,写入消息采用在队列尾部追加的方式,消费消息采用在队列头部顺序读取的方式
  • 一个Topic可分为多个Partition,仅保证同一分区内消息有序存储,不保证Topic整体(多个分区之间)有序

Offset偏移量

  • Offset是用于定位分区中的消息的顺序编号
  • Offset用于在分区中唯一标识消息
  • 使用Zookeeper维护Offset
Kafka_Offset

文件与索引

  • 每个Partition副本都是一个目录,目录中包含若干Segment文件

  • Segment(段文件)

    • Segment文件是Kafka的最小数据存储单元,一个Partition包含多个Segment文件
    • Segment文件由以Message在Partition中的起始偏移量命名的数据文件(*.log)和索引文件(*.index、*.timeindex)组成
  • Kafka索引

    • 为了提高消息写入和查询速度,为每个Partition创建索引,索引文件存储在Partition文件夹下
    • 偏移量索引
      • 文件以offset偏移量为名称,以index为后缀
      • 索引内容格式:offset,position
      • 采用稀疏存储方式
    • 时间戳索引
      • 文件以timeindex为后缀
      • 索引内容格式:timestamp, offset
      • 采用稀疏存储方式

    Kafka_Index

高可用与选举机制

  • 多分区副本
    • Kafka早期版本没有Replication概念,一旦某个Broker宕机,其上的分区数据就可能丢失
    • 一个Topic可以有多个分区,每个分区可以有多个副本,副本存储在不同的Broker中
    • 从一个分区的多个副本中选举一个Partition Leader,由Leader负责读写,其他副本作为Follower从Leader同步消息
    • 消费者和生产者都是从Leader读写数据,不与Follower交互
  • Kafka Controller Leader选举
    • 每个Broker启动时都会创建一个Kafka Controller进程
    • 通过Zookeeper,从Kafka集群中选举一个Broker作为Kafka Controller Leader
    • Kafka Controller Leader负责管理Kafka集群的分区和副本状态,避免分区副本直接在Zookeeper上注册Watcher和竞争创建临时Znode,导致Zookeeper集群负载过重

基本使用

Kafka_Use1

Kafka_Use2

✨ 本站由 Hugo + Stack 主题搭建 | 不忘初心,慢慢成长 ✨
使用 Hugo 构建
主题 StackJimmy 设计