Kafka架构原理,也就这么回事( 二 )


Producer 生产的数据会不断追加到该 log 文件末端,且每条数据都有自己的 Offset 。
消费者组中的每个消费者,都会实时记录自己消费到了哪个 Offset,以便出错恢复时,从上次的位置继续消费 。
存储机制

Kafka架构原理,也就这么回事

文章插图
 
由于生产者生产的消息会不断追加到 log 文件末尾,为防止 log 文件过大导致数据定位效率低下,Kafka 采取了分片和索引机制 。
它将每个 Partition 分为多个 Segment,每个 Segment 对应两个文件:“.index” 索引文件和 “.log” 数据文件 。
这些文件位于同一文件下,该文件夹的命名规则为:topic 名-分区号 。例如,first 这个 topic 有三分分区,则其对应的文件夹为 first-0,first-1,first-2 。
# ls /root/data/kafka/first-0         00000000000000009014.index     00000000000000009014.log 00000000000000009014.timeindex 00000000000000009014.snapshot    leader-epoch-checkpoint index 和 log 文件以当前 Segment 的第一条消息的 Offset 命名 。下图为 index 文件和 log 文件的结构示意图:
Kafka架构原理,也就这么回事

文章插图
 
“.index” 文件存储大量的索引信息,“.log” 文件存储大量的数据,索引文件中的元数据指向对应数据文件中 Message 的物理偏移量 。
生产者
分区策略
分区原因:
  • 方便在集群中扩展,每个 Partition 可以通过调整以适应它所在的机器,而一个 Topic 又可以有多个 Partition 组成,因此可以以 Partition 为单位读写了 。
  • 可以提高并发,因此可以以 Partition 为单位读写了 。
分区原则:我们需要将 Producer 发送的数据封装成一个 ProducerRecord 对象 。
该对象需要指定一些参数:
  • topic:string 类型,NotNull 。
  • partition:int 类型,可选 。
  • timestamp:long 类型,可选 。
  • key:string 类型,可选 。
  • value:string 类型,可选 。
  • headers:array 类型,Nullable 。
①指明 Partition 的情况下,直接将给定的 Value 作为 Partition 的值 。
②没有指明 Partition 但有 Key 的情况下,将 Key 的 Hash 值与分区数取余得到 Partition 值 。
③既没有 Partition 有没有 Key 的情况下,第一次调用时随机生成一个整数(后面每次调用都在这个整数上自增),将这个值与可用的分区数取余,得到 Partition 值,也就是常说的 Round-Robin 轮询算法 。
数据可靠性保证
为保证 Producer 发送的数据,能可靠地发送到指定的 Topic,Topic 的每个 Partition 收到 Producer 发送的数据后,都需要向 Producer 发送 ACK(ACKnowledge 确认收到) 。
如果 Producer 收到 ACK,就会进行下一轮的发送,否则重新发送数据 。
Kafka架构原理,也就这么回事

文章插图
 
①副本数据同步策略
何时发送 ACK?确保有 Follower 与 Leader 同步完成,Leader 再发送 ACK,这样才能保证 Leader 挂掉之后,能在 Follower 中选举出新的 Leader 而不丢数据 。
多少个 Follower 同步完成后发送 ACK?全部 Follower 同步完成,再发送 ACK 。
Kafka架构原理,也就这么回事

文章插图
 
②ISR
采用第二种方案,所有 Follower 完成同步,Producer 才能继续发送数据,设想有一个 Follower 因为某种原因出现故障,那 Leader 就要一直等到它完成同步 。
这个问题怎么解决?Leader维护了一个动态的 in-sync replica set(ISR):和 Leader 保持同步的 Follower 集合 。
当 ISR 集合中的 Follower 完成数据的同步之后,Leader 就会给 Follower 发送 ACK 。
如果 Follower 长时间未向 Leader 同步数据,则该 Follower 将被踢出 ISR 集合,该时间阈值由 replica.lag.time.max.ms 参数设定 。Leader 发生故障后,就会从 ISR 中选举出新的 Leader 。
③ACK 应答机制
对于某些不太重要的数据,对数据的可靠性要求不是很高,能够容忍数据的少量丢失,所以没必要等 ISR 中的 Follower 全部接受成功 。
所以 Kafka 为用户提供了三种可靠性级别,用户根据可靠性和延迟的要求进行权衡,选择以下的配置 。
Kafka架构原理,也就这么回事

文章插图
 
Ack 参数配置: