AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

kafka

kafka

一、是什么

kafka是一个开源分布式 事件流平台(消息系统)
用于构建数据管道(采集->kafka->存储)
用于构建流式计算应用(采集->kafka->流式计算)
用于构建重要任务应用程序调度(管理者->kafka->需要被管理的应用),也就是消息驱动的分布式架构

二、核心名词解释

1. broker 代理人

kafka服务启动后的JVM进程,称之为一个broker实例
每个broker在集群内会设置一个唯一的整数id

2. topic 主题

在kafka中可以创建多个topic
用于划分消息的类别
生产者需要指定topic进行生产
消费者也许要指定topic进行消费

3. partition 分区

创建topic时可以指定包含的分区个数
分区个数通常是broker的整数倍
分区就是服务器上的一个文件夹
文件夹的名称为 topic名-分区编号
分区从0开始编号,递增

4. replication-factor 副本

在创建topic时可以指定数据的副本数
副本数不能超过可用的broker数量
相同主题的相同分区的不同副本之间会选举产生一个leader和多个follower
leader负责与客户端交互,进行数据的存储和读取
follower负责实时同步leader数据

5. offset 偏移量 编号

在每个分区内部,会维护一个单调递增的整数值,每来一条新的数据,就会为消息分配一个唯一的offset值

6. producer 生产者

是kafka的一类客户端
负责将数据封装为ProducerRecord对象,并将记录对象序列化后发送到kafka集群

7. consumer 消费者

是kafka的一类客户端
负责拉取kafka中的数据,接收到ConsumerRecord对象,并从记录对象中解析需要传递的数据
每个消费者需要设置一个group.id
kafka会根据每个gourp.id记录消费进度

kafka存储原理

topic分区数量

topic分区数 大于 消费者线程数
可能会导致消息的滞后,更严重的情况(如果topic不断有数据写入),会导致部分数据永远无法读取

topic分区数 小于 消费者线程数
会导致有空闲的消费者线程

通过流式计算框架的并发度,决定topic的分区数
并发度略大于分区数

kafka的高吞吐原理

kafka底层存储,在每个分区内使用三类文件进行数据存储

  • index
    为每条消息(message/record)保存相同长度的元数据(offset,log文件中的开始位置,消息的长度)

  • log
    使用顺序写的方式,将消息内容以byte数组的形式高速写入文件中

  • timeindex
    为每条消息保存相同长度的时间索引信息,包含消息发送时的时间戳
    定期会根据时间戳与broker设置的超时时间,进行过期数据的清理