kafka是什么?
消息中间件,严格上不能称之为消息队列,而是消息中转系统。因为消息队列的数据结构严格遵循队列要求,先进先出。
kafka使用场景
kafka主要用于大数据开发中,用于实时计算做数据缓冲(消息中间件)。
消息队列主要用于后端JAVAEE开发中,类似的软件还有:
- RabbitMQ
- ActiveMQ
- RocketMQ
为什么使用kafka?
在大数据开发中,数据源和计算系统有:
- 耦合
- 速度不匹配(产生数据的速度是不可预期的)
kafka在大数据流式处理中起到了削峰填谷、解耦的作用。
数据源 —> Kafka(缓冲系统) —> 数据计算
kafka的特点
- Broker 服务器
- Producers 读数据客户端
- Consumer 写数据
3、各服务端口
| kafka eagle(EFAK) | 8048 | | —- | —- | | kafka | 9092 | | zookeeper | 2181 |
flink 1.14 kafka 2.4.1 通过pom.xml查看软件依赖
4、partition角色
- leader
- follower
- observer(一般不去配置)
在partition的多个副本中一定有一个是leader,其他可能是follower或observer。
- 列出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
到这个目录下,看下之后,为什么同一个topic,在存储目录中会有多个目录?
同一个broker服务器上,不同topic,相同topic的不同分区,都是在物理上用不同文件夹隔离的。
分区目录里装了什么?
- .log数据文件
- .index索引文件(offset)
- .timeindex索引文件(time)
- leader-epoch-checkpoint leader纪元检查点
每条消息的长度不一样,怎么快速定位第5条消息?(偏移量)
所以搞了个索引文件,每条消息都有其对应的偏移量,就是先通过offset找到消息在数据文件中的物理位置。
用的稀疏索引:不是每个消息都记录索引位置,这种情况,多数消息的文职只能寻找区间。
还有一个timestamp索引,也是稀疏索引。消息 message 的结构
由一对key-value组成,版本越新,结构越复杂。添加了一些校验信息,crc,校验码。
crc 循环冗余校验码
删除topic
消费的起始偏移量有3中策略:
- earliest:从最早的消息开始消费
- latest: 从最近的消息开始消费
- offset:从指定的位置开始消费(两个信息:分区号、偏移量)
生成者和消费者的命令
消费:
kafka-console-comsumer.sh --bootstrap-server doit01:9092 --topic abcx
kafka-console-comsumer.sh --bootstrap-server doit01:9092 --topic abcx --offset 0 --partition 1
# offset 的维护规则,并不是全局的,而是轮询broker.id
消费组
kafka为了提高消费并行度的标致,如果ttopic中数据量太大,你需要多个并行处理任务去处理topic中的数据,就需要消费组
消费组内各个消费者之间,分担数据读取任务的最小单位是:partition
也就是需要组内消费组分担不同的partition
kafka-console-comsumer.sh --bootstrap-server doit01:9092 --topic abcx --from-beginning --group d30
刚开始会全部消费数据,后面加了消费者后会平均消费数据。
kafka中的消费组,可以动态增减消费者,而且消费者中的消费者数量发生任意变动,都会重新分配分区消费任务。
消费位移的记录
kafka的消费者可以记录自己消费的消息偏移量,作用在于重启后可以继续上次的消费。
kafka-console-comsumer.sh --bootstrap-server doit01:9092 --topic abcx --group d30
# 不要显式指定 --from-beginning
记录偏移量: 哪个分组:哪个分区:偏移量
topic-partition-0:10000
消费组的偏移量记录在:__consumer_offsets 的自建topic中
如何让多个消费者组成一个组:就是让这些消费者的groupId相同即可
记录消费组的偏移量,而不是消费者的偏移量
kafka的消费者,读取数据,是消费者主动向broker去请求拉取,而不是broker服务器向消费者去推送。
配置管理
topic 管理操作 kafka-config
专门用来进行动态参数配置
kafka-configs.sh --zookeeper doit:2181 --describe
实体类别
实体标识