- 消息
- 消息是Kafka中最基本的数据单元
- 消息由key和value构成,它们都是byte数组
- key:包含同一key的消息会全部写入同一分区中,key可以是null
- value:value是消息的真正有效负载的数据
- Topic & partition & Log
- Topic:每个Topic至少一个partition,每个partition对应一个offset
- offet只保证在同一partition内是有序的
- partition
- 分区是kafka水平扩展的基础,增加partition可以增加其并行处理能力
- 每个partition在物理上对应一个文件夹
- Log
- 分区在逻辑上对应一个Log,Log对应到磁盘上的一个文件夹
- Log由多个Segment组成,每个Segment对应一个日志文件和索引文件
- 保留策略(Retention Policy)& 日志压缩(Log Compaction)
- 保留策略:无论Consumer是否消费了消息,Kafka都会根据保留策略保存这些消息,共两种
- 根据消息保留的时间:当消息在Kafka中保存的时间超过指定时间,则删除
- 根据Topic存储的数据大小:当日志文件大于一个阈值,开始删除最旧的消息
- Kafka会启动一个后台线程,定期检查
- 日志压缩:有时候用户只关心key最新的value值
- 开启日志压缩后,kafka会开启后台线程,定期将相同的key的消息进行合并,只保留最新的value值
- Broker
- 一个单独的Kafka Server就是一个Broker
- Broker的任务
- 接受Producer的消息,分配offset,保存到磁盘中
- 接受Consumer和其他Broker的请求,返回响应
- 在一般的生产环境中,一个Broker独占一台物理服务器
- Replica 副本
- 每个partition可以有多个副本,副本满足最终一致性(但不保证同一时刻完全一样)
- 同一partition的多个副本会被分配到不同Broker上,这样,某一Broker宕机后,可以继续对外提供服务
- 每个分区最少一个副本,当只有一个副本时,只有Leader副本,没有Follower副本
- Leader:负责所有的读写请求
- Follower:从Leader拉取数据到本地,同步更新到Log中
- ISR(In-Sync Replica)集合
- ISR表示: 目前可用(alive)且消息量与Leader相差不多的副本集合
- 可用:副本所在的节点维持着与Zookeeper的连接
- 相差不多:Leader与Follower的offset差值不能超过指定的阈值
- Follower的offset肯定会比Leader的存在延迟,只要未超过阈值就是可以容忍的
- 如果不满足这两个条件,该Follower副本就会被踢出ISR集合。重新同步的过程中,满足条件再加入到ISR中
- HW & LEO
- HW(HighWatermark)
- HW表示所有副本完成同步的offset,HW之前的消息都称为commit
- HW由Leader副本管理,只有Leader有
- 当消费者处理消息的时候,只能拉取HW之前的消息。
- LEO(Log End Offset)
- 每个副本都会有的一个offset标记,它指向追加到当前副本的最后一个消息的offset
- 同步和异步
- 通过request.required.acks来设置。这种机制确保了只要“in sync” list有一个或以上的flollower,一条被commit的消息就不会丢失。
- 同步复制
- 要求“活着的”follower都复制完,这条消息才会被认为commit
- 影响吞吐率
- 异步复制
- follower异步的从leader复制数据,数据只要被leader写入log就被认为已经commit
- 如果leader宕机,则会丢失数据
- Cluster & Controller
- Cluster:多个Broker组成的集群
- 包含一个Broker担任Controller,其他Broker听从Controller指挥
- Controller
- 负责管理分区状态
- 管理各个Replica
- 监听Zookeeper
- Producer & Consumer
- Producer 生产者
- 生产消息,按照指定规则推送到Topic的partition中
- partition选取的规则有:key的hash值分区 或者 轮询
- Consumer 消费者
- 从指定Topic拉取信息并消费
- 每个Consumer自己维护offset
- Consumer Group
- 多个Consumer组成Consumer Group,一个Consumer只能属于一个Consumer Group
- 保证一个Group订阅的Topic的每个分区只被分配给此Consumer Group中的一个消费者处理
- 广播和独播
- 广播:每个Consumer单独一个Group,一个消息可以被多个Consumer同时消费
- 独播:所有Consumer放在一个Group,一个消息只被一个Consumer消费
- Rebalance
- 用于水平扩展和故障迁移
- 水平扩展:当某一Consumer处理能力不足时,可以向Group添加Consumer,触发Rebalance
- 故障迁移:当某一Consumer宕机,触发Rebalance
- Group中的Consumer数量
- 当Consumer超过partition数量,会导致Group中有Consumer分配不到partition造成浪费