Kafka复习之架构深入

572 阅读4分钟

kafka工作流程及文件存储机制

工作流程

kafka的消息通过topic进行分类,生产者负责生产消息,消费者负责读取消息。

Topic是逻辑上的概念,分区(partition)是物理上的的概念,每个partition对应一个log文件,生产者将数据不断追加到文件末端。且每条数据都有自己的offset,每个消费者都会记录自己的offset,以便出现问题时,从上一次消费的offset处开始消费。

kafka文件存储机制:

由于生产者生产的消息会不断追加到log的末尾,当log文件过大时将导致数据定位效率低下,kafka采用了分片和索引的机制,将每个partition分为多个segment。

segment:
每个segment分为两个文件:.index文件和.log文件

partition的命名:topic+partition
segment的命名:segent中第一条信息的offset命名。

index文件记录的是文件中消息的offset和物理位置。通过index文件实现了O(1)级别复杂度查询算法。index文件的粒度可以通过配置文件进行设置。

查找message的流程

**查找170417位置的消息:**I

1、先用二分查找判断此文件存在那个segment文件中.
2、用170417减去文件名的offset : 170417 - 170410 = 7.
3、用二分法查找等于或小于7的最大编号。
4、得到「4,476」最近,定位到476的log文件中向下查找。

数据过期机制

可以设置当文件达到一定大小时或者文件打开时长(处于写入状态)时,文件就会被关闭。当文件被关闭时就会开始等待过期,活跃的文件(被打开)永远不会被删除,只有关闭的文件才会被删除,如果设置保留一天的数据,但是文件存储了5天的数据,那么5天后才会被删除。

kafka生产者

分区策略

分区的优势:

1、多partition分布式存储,易扩容。
2、并发读写数据,提高速率。
3、加快恢复数据的速率,当某台机器异常时,只需要恢复这部分数据即可。

数据的可靠性保证
  • kafka可以保证分区的数据顺序,如果如果同一个生产者往同一个分区里写消息,A比B先写入,那么Kafka保证过B的osffset 比A大,且消费者一定先读取到A数据。
  • 只有当数据被写入所有副本时,它才被看作已提交,消费者只能读取以提交的数据,生产者可以接受不同的确认(完全提交时的确认、写入首领时的确认、消息被发送到网络时的确认)
  • 只要又一个副本活跃,提交的信息就不会丢失

复制:

kafka的复制机制和分区保证了kafka的可靠,其他副本只需要保证及时同步leader的数据即可

Leader维护了一个与它保持一致的follower集合称为ISR,如果follower长时间未和Leader保持一致,那么它将被踢出ISR。
条件如下: 与zookeeper在一定时间内有一个活跃的会话 在一定时间内获取过首领的最新数据

当leader出现故障时,会在follower中选择一个切换为leader

ack应答机制

kafka提供了三种可靠性级别,对于不同可靠性要求的数据可以自己进行选择。

  • 0:producer不等待broker的ack,当broker接受到数据且没写入磁盘时就返回。
  • 1:producer等待leader落盘后的ack, (1代表了等待几个分区同步了数据就返回)
  • -1:produce等待broker的ack,需要ISR中的所有follower和leader完成落盘才返回ack。
消费一致性保证

1、follower故障
当follower故障后会被踢出ISR,当他恢复后,follower会将高于故障前的HW截取,从上次的HW处开始重新同步,
当follower的LEO大于等于分区的HW时,说明follower又追上了leader,这时可以重新加入。
2、leader故障
leader发生故障后,会从ISR重新选出一个leader,为了保持一致性,其他的follower将高于HW的部位截掉,从新的leader中 同步数据。
TIPS:这只能保证分区的一致性,不能保证不丢失数据。

消息发送流程

kafka的producer采用了异步发送的方式,通过了两个线程和一个共享变量,main线程负责将数据写入共享变量RecordAccumulator,sender线程从RecordAccumulator拉取消息推送至kafka。