概述
定义
分布式 发布/订阅 主动拉取模式 的 消息队列(Message Queue)
源码语言
Scala+Java
应用场景
大数据实时处理 – 常见spark + kafka / flume + kafka
作用
- 消息传递
- 存储
- 流处理
关键术语
Producer
- 概念
- 生产者 – 发布消息的服务
Kafka Cluster
- 概念
- kafka集群 – 没啥说的
Broker
- 概念
- 集群的一个节点 – 一个Cluster里有多个Broker
Topic
-
概念
- 主题 – 对消息进行分类 一个Cluster的全量消息可分为多个Topic
-
作用
- 如果没有Topic对消息进行分类 每个消费者只能接收全量的消息 ; 分类后 可订阅自己需要的消息类别
Partition
-
概念
- Topic的分区 – 一个topic可分布在多个Broker上 每个Broker上存放这部分topic的物理单位是Partition
-
作用
- 一个topic有多个Partition Partition数量不受节点数限制 消息来了 可使一个topic负载均衡 ;
- 更小数据单位 查询速度更快 ;
- 一个Producer/Customer 能连多个Broker中的Partition 提高生产消费并发
-
存储分布 :
- 每个partition为一个文件目录 存储在kafka目录/logs/下 1个topic的3个partiton目录命名为 topic名称0 topic名称1 topic名称2 (0 1 2 代表分区)
- 特别的 高版本的kafka的offset数据存储在kafka的特定topic"__consumer_offsets"中 默认50个分区 在kafka目录/logs/下能找到分区文件 __consumer_offsets-1 __consumer_offsets-2 … __consumer_offsets-50
-
有序 : Partition内部数据是有序的 每个partition只需要支持顺序读写 方便快速寻址
Replica
-
概念
Partition的副本 – 没啥说的
Leader
-
概念
Partition的备份的主 – 每个Partition可做数据备份 主备在不同broker上 备份数量自定义
-
作用
高可靠 Leader活着只找Leader Leader死了选举一个Follower作为Leader
Customer Group(CG)
-
概念
消费者组 – 一个消费单位 独立而整体 提高消费并发
-
作用
-
独立在于 组与组互不干扰 ;
-
整体在于 一个Customer Group的目标是 消费某个(当然可以多个)topic 对于一个topic Group要派不同的Customer去消费这个topic的不同的分区
(分工明确 节省时间 干的快 提高并发 提高消费能力)
即 一个Partition 每个订阅了它的Customer Group中只有一个Customer能来消费所以 最高效的配置是 当一个Customer Group订阅了一个Topic 这个Group的Customer数=这个Topic的Partition数 --> 具体应用???
(如果Partition数多于Customer数 消费的时间会久 会慢 ; 如果Customer数多于Partition数 启动服务后 多余的Customer在空跑 浪费资源还不干活)
-
Segment
-
概念
- 消息的实际存储 – partition是一个文件夹 消息实际存储在多个segment数据文件中
-
消息量不等 : 每个segment file中的消息数量不一定相等 可方便old segment file快速被删除
-
segment file命名规则 : partition的全局第一个segment从0开始 下一个segment file名为上一个segment file最后一条消息的offset值(数值最大为64位long大小 19位数字字符长度 没有数字用0填充)
-
segment file的组成 : segment索引文件xx.index(存储大量元数据:消息的offset) + segment数据文件xxx.log(存储大量消息) 一一对应 成对出现
Offset
-
概念
- 消息的序列号/ID 在一个partition中唯一标识一条消息
Customer
-
概念
- 消费者 – 消费消息的服务 一个Customer Group由多个Customer组成
Zookeeper
-
概念
- 资源调度器 – kafka0.9版本之前 存储kafka集群信息 存储消费数据位置信息(偏移量offset)
-
作用
- 存储kafka集群的什么信息 ???
- 存储消费数据位置信息(偏移量offset) : 消费者服务器内存 和 zookeeper中都存一份消费偏移量信息 . 平时用从内存中取offset 速度快 ; 如果服务器跪了 等起来之后从zookeeper中取offset 可以继续消费 不必从头开始重新消费
0.9版本及之后 offset存储在kafka集群中 由系统创建的一个topic里
(zookeeper主要起到一个润滑剂作用 消费者服务器挂了 就要去总请求zookeeper 拿offset 耦合度太高了 也慢)