kafka 入门

353 阅读8分钟

概述

定义

kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域

消息队列的好处
  1. 解耦 ,异步通信,可控制消费时机
  2. 可恢复性,消费失败可以进行补偿
  3. 缓冲,削峰,解决生产速度和消费速度不一致,生产大于消费的情况
消息队列的两种模式
  1. 点对点模式 : 一对一,消费者消费后会清除消息
  2. 发布/订阅模式 : 一对多,消费者消费数据后不会清除消息
    1. 消费者主动拉取数据模式,消费者控制消费速度,消费者需要不断轮询是否有消息可供消费
    2. 队列主动推送消息到消费者,消费者无法控制消费速度
kafka 架构

  1. 生产者生成消息(Producer)
  2. kafka 集群管理消息 (Broker)
    1. 主题(Topic): 将消息进行分类,逻辑上的概念
    2. 分区 (Partition):物理上的概念 提高消息的负载均衡,和并发能力,分区的偏移量是独立的
    3. Leader : 针对主题的Leader ,而不是针对Broker集群的Leader,生成者和消费者只会连接Leader,对Leader 的消息进行处理。
    4. Follower : 针对于Topic ,用于数据冗余备份,follower数量包括leader 的数据
  3. 消费者消费消息(Consumer) : 某一个Topic的partition 的一条消息只能被消费者组(group_id)中的一个消费者消费。
  4. 注册中心(Zookeeper):0.9版本前保存消息信息,和消费信息(offset),0.9版本后保存在kafka中。
kafka 的文件存储
  1. 概述 : topic 是逻辑概念,partition 才是物理概念,数据存放在 partition 中,数据存放位置在对应的 topic 的文件下,包括 .log 数据文件,.index 文件
  2. .log 文件 : 存放消息数据,可配置最长存放时间,默认7天,可配置一个.log 文件的最大大小,默认1G,当超过配置的大小时,再新建一个.log 文件
  3. .index 文件 : 存放偏移量
kafka 的安装,启动,关闭
  1. 安装:下载-解压-修改配置(brokerId,logDir等)
  2. 启动:集群启动如果不写shell脚本就需要每个broker 单独启动,所以最好写个shell 脚本
  3. 关闭:同启动
kafka 相关命令
  1. 概述 : 一般kafka会有相关的管理后台,不需要直接操作命令,但是了解kafka 相关命令可以更有利于我们了解认识kafka
  2. 查看kafka 命令集 : 都在 bin 目录里面
  3. topic 相关命令 :kafka-topics.sh 跟相应的参数对topic做相应的增删改查操作
  4. 生成者相关命令 :kafka-console-consumer.sh 控制台消费命令 多用于测试
  5. 消费者相关命令 : kafka-console-produer.sh 控制台生产命令 多用于测试

高级

kafka 工作流程

  1. producer 根据某种策略 往broker的对应的topic 的 leader partion 发送消息
  2. follower 同步 leader 的数据
  3. consumer 根据某种策略 从 对应的topic 中的 leader partion 拉取消息进行消费
kafka 的文件存储
  1. 概述 : topic 是逻辑概念,partition 才是物理概念,数据存放在 partition 中,数据存放位置在 对于的 topic 的文件下,包括 .log 数据文件,.index 文件 ,使用分片和索引的机制
  2. .log 文件 : 存放消息数据,可配置最长存放时间,默认7天,可配置一个.log 文件的最大大小,默认1G,当超过配置的大小时,再新建一个.log 文件 ,.log文件的命名为当前 .index 文件的最大偏移量
  3. .index 文件 : 存放偏移量(offset-对应消息的偏移量-对应消息的大小),每条数据大小是相同大小的,方便索引的查找,也方便查找消息
kafak 生产者
1. 分区策略
  1. 在指定partition 的情况下,按指定情况进行分区
  2. 在没有指定 partition,但是指定了key的情况下,对key进行hash ,并对hash值和该topic 的partition 数进行取余得到分区数
  3. 在既没有指定partition 也没有指定key 的情况下,通过轮询的方式进行分区 (0,1,2;0,1,2;。。。)
2. 数据可靠性的保证 ack
  1. 主从同步机制

    1. 半数以上follower 完成同步才算完成,延迟低,容错性差
    2. 全部follower 完成同步才算完成,延迟高,容错性高,kafak 选择了这种机制,并且使用ISR 机制作为补充完善。
  2. ISR(in-sync-replica) : 和 leader 保持同步的follower集合 (leader 的马仔,将来leader 挂了可能上位成为新leader,但是如果办事不利,比如没有及时同步leader 的数据--replica.lag.time.max.ms参数,和leader 的数据差别太大【后来数据差别的大小这个参数被移除了,不再需要考虑同步的数据量,因为producer批量发生数据,leader 和 follower 的数据量很容易产生很大的差别,可能会导致频繁的操作ISR-- 移除和添加 ISR 集合中的follower】,就可能被踢出这个集合,连马仔都不是了,只能做个扫地的)

  3. acks应答机制 : 对消息的可靠性和及时性之间进行权衡取舍

    1. acks = 0 : at most once ,producer 不等待broker的应答,不管是否消息有没有发送成功,可靠性很差,及时性很高
    2. acks = 1 : leader 写入数据成功后进行应答,在follower完成同步前,leader 挂了的情况下会导致数据丢失
    3. acks = -1 : at least once, leader 和 follower(ISR中的follower) 全部写入数据成功后进行应答,可靠性比较强,但是及时性会比较差,但是当follower 同步完leader数据后leader挂了,leader无法进行应答,消费者重新发送到新的leader,会导致消息重复
  4. 故障处理细节

    1. LEO: log end offset , 每个副本的最后的一个offset
    2. HW : hight watermark , 所有副本中最小的offset , HW 之前的数据才对consumer可见,保障leader 挂掉后,新的leader有数据可供consumer 消费,并且为保证数据的一致性,所有副本和leader 的数据保持一致(多退少补)

  1. Exactly once = at least once + 幂等性(broker 对消息进行去重),enable.idompotence 参数设置为true 时,开启幂等性
kafka 消费者
消费方式

kafka 消费者主动从partition中拉取数据

分区分配策略
  1. 概述 : 一个消费者组可能存在多个消费者,一个topic 存在多个partition分区,分区策略解决消费者和分区的对应关系,当消费者增多或者减少时都会触发分配策略reblance,可通过 partition.assignment.strategy 属性进行配置
  2. 轮询策略 :以topic+ partition (或者说消费组)为单位,消费比较均衡,但是消费者组消费的主题不一样时会产生消费到未订阅的主题分区
  3. 范围策略 :默认的分区策略,以topic 为单位,组内范围分配,可能存在消费不均衡的情况,某个消费者消费多,某些消费少
消费者offset的存储
1. 消费者组(groupID)+主题(Topic)+分区(partition)唯一确定一个offset
2. 存储在zookeeper : consumer/consumer-group/offset/topic/partition
3. 存储在kafka 本地 : `kafka-console-consumer.sh --topic _consumer_offset`
kafka 高效读取数据
  1. 原因 :
    1. 分区,可并发读写
    2. 顺序写磁盘
    3. 零复制技术 : 由操作系统直接管理数据的传输
zookeeper 在kafka中的作用 不太清楚
  1. 负责broker 的状态管理
  2. 负责topic 信息管理
  3. 负责选取controller,controller 即一个 master broker,负责往zookeeper中写入数据,选举规则就是先到先得
kafka API
producer API
  1. 消息发送流程 : 异步发送,涉及两个线程(main , Sender)和一个线程共享变量(RecoderAccumlator)
    1. main 线程将待发送数据发送到 RecoderAcumlator, 可批量发送(batch.size),当累积到一定数量后再发送,如果数据量迟迟未达到batch.size,也可在指定时间(linger.time)后发送
    2. Sender 线程从RecoderAccumlator中 获取数据 ,发送到topic 对应的分区

  1. 主要API : [juejin.cn/post/684490…](简单的kafka producer demo)
  2. 自定义分区 :实现Partitioner接口,实现相关方法,参考默认分区DefaultPartitioner 类,并通过配置(partition.class)指定使用自定义的分区
consumer API
  1. 主要的API : [juejin.cn/post/684490…](简单的kafka consumer demo)

  2. 手动提交 :将本次拉取的数据的最高偏移量提交,需要先关闭自动提交

    1. 同步提交 :阻塞当前线程,直到提交成功,并且会自动失败重试,但是效率低
    2. 异步提交 :没有失败重试机制,效率比同步提交高
  3. 自定义存储offset ,可将offset 存储在 kafka 之外的存储系统中,如MySQL, 需要考虑消费者的rebalance(分区改变触发rebalance),比较麻烦,可借助ConsumerRebalanceListener监听Rebalance的情况

自定义拦截器
  1. 概述 : 针对生产者的拦截,需要实现ProducerInterceptor接口中的相关方法
kafka 监控

图形化界面化的kafka 监控管理工具

  1. kafka manager
  2. Kafka Eagle
    1. 安装
    2. 配置
    3. 使用