kafka是什么?

消息中间件,严格上不能称之为消息队列,而是消息中转系统。因为消息队列的数据结构严格遵循队列要求,先进先出。

kafka使用场景

kafka主要用于大数据开发中,用于实时计算做数据缓冲(消息中间件)。
消息队列主要用于后端JAVAEE开发中,类似的软件还有:

  1. RabbitMQ
  2. ActiveMQ
  3. RocketMQ

这些中间件数据结构严格有序,先进先出。

为什么使用kafka?

在大数据开发中,数据源和计算系统有:

  1. 耦合
  2. 速度不匹配(产生数据的速度是不可预期的)

kafka在大数据流式处理中起到了削峰填谷、解耦的作用。
数据源 —> Kafka(缓冲系统) —> 数据计算

kafka的特点

  1. 高吞吐、低延迟
  2. 热扩展
  3. 持久性
  4. 容错性
  5. 高并发

    kafka拓扑结构

    1、拓扑结构

    kafka拓扑结构.PNG

    2、集群角色

  • Broker 服务器
  • Producers 读数据客户端
  • Consumer 写数据

    3、各服务端口

    | kafka eagle(EFAK) | 8048 | | —- | —- | | kafka | 9092 | | zookeeper | 2181 |

flink 1.14 kafka 2.4.1 通过pom.xml查看软件依赖

4、partition角色

  1. leader
  2. follower
  3. observer(一般不去配置)

在partition的多个副本中一定有一个是leader,其他可能是follower或observer。

  1. 列出topic
    kafka-topic.sh —list —zookeeper doit01:2181
    2.
    kafka-topic.sh —zookeeper doit01:2181—describe —topic topic-doit29
    Leader:P0的leader在broker 1上
    Replicas:1,0,2 所有副本在哪些broker上
    Isr:1,0,2
    哪些副本在同步中
    3. 创建topic
    kafka-topic.sh —zookeeper doit01:2181—create —topic topic-doit30 —partitions 2—replication-fator 2
    两个分区,每个分区两个副本

    基本原理(加强)

    生产者写数据,只能写给分区的leader副本
    消费者读数据,也只能从分区leader中来读

因为broker将数据写入分区存储文件时,永远都是追加的,
所以,kafka把自己的数据存储文件称之为log

offset 在分区内部有递增关系

log_dirs=/opt/data/kafkadata

cd /opt/data/kafka-logs

到这个目录下,看下之后,为什么同一个topic,在存储目录中会有多个目录?

同一个broker服务器上,不同topic,相同topic的不同分区,都是在物理上用不同文件夹隔离的。

分区目录里装了什么?

  • .log数据文件
  • .index索引文件(offset)
  • .timeindex索引文件(time)
  • leader-epoch-checkpoint leader纪元检查点

    每条消息的长度不一样,怎么快速定位第5条消息?(偏移量)

    所以搞了个索引文件,每条消息都有其对应的偏移量,就是先通过offset找到消息在数据文件中的物理位置。
    用的稀疏索引:不是每个消息都记录索引位置,这种情况,多数消息的文职只能寻找区间。
    还有一个timestamp索引,也是稀疏索引。

    消息 message 的结构

    由一对key-value组成,版本越新,结构越复杂。添加了一些校验信息,crc,校验码。
    crc 循环冗余校验码

删除topic

消费的起始偏移量有3中策略:

  1. earliest:从最早的消息开始消费
  2. latest: 从最近的消息开始消费
  3. offset:从指定的位置开始消费(两个信息:分区号、偏移量)

生成者和消费者的命令
消费:

  1. kafka-console-comsumer.sh --bootstrap-server doit01:9092 --topic abcx
  2. kafka-console-comsumer.sh --bootstrap-server doit01:9092 --topic abcx --offset 0 --partition 1
  3. # offset 的维护规则,并不是全局的,而是轮询broker.id

消费组

kafka为了提高消费并行度的标致,如果ttopic中数据量太大,你需要多个并行处理任务去处理topic中的数据,就需要消费组
消费组内各个消费者之间,分担数据读取任务的最小单位是:partition
也就是需要组内消费组分担不同的partition

  1. kafka-console-comsumer.sh --bootstrap-server doit01:9092 --topic abcx --from-beginning --group d30

刚开始会全部消费数据,后面加了消费者后会平均消费数据。
kafka中的消费组,可以动态增减消费者,而且消费者中的消费者数量发生任意变动,都会重新分配分区消费任务。

消费位移的记录

kafka的消费者可以记录自己消费的消息偏移量,作用在于重启后可以继续上次的消费。

  1. kafka-console-comsumer.sh --bootstrap-server doit01:9092 --topic abcx --group d30
  2. # 不要显式指定 --from-beginning

记录偏移量: 哪个分组:哪个分区:偏移量
topic-partition-0:10000
消费组的偏移量记录在:__consumer_offsets 的自建topic中
如何让多个消费者组成一个组:就是让这些消费者的groupId相同即可
记录消费组的偏移量,而不是消费者的偏移量

kafka的消费者,读取数据,是消费者主动向broker去请求拉取,而不是broker服务器向消费者去推送。

底层存储特性类似于“日志”,只能追加,不能修改。

配置管理

topic 管理操作 kafka-config
专门用来进行动态参数配置

  1. kafka-configs.sh --zookeeper doit:2181 --describe

实体类别
实体标识