目录
zookeeper中存储的kafka信息
kafka broker总体工作流程
- Kafka集群中有一个broker的Controller会被选举为Controller Leader,负责管理集群broker的上下线,所有topic的分区副本分配和Leader选举等工作
- Controller的信息同步工作是依赖于Zookeeper的
- Zookeeper中记录了谁是Leader,kafka2.8以后也可以配置不采用zookeeper,通过Kraft进行自己的集群管理,使用Kraft内部的Quorum控制器来取代ZooKeeper
若leader发生故障
kafka 副本
- Kafka中副本分为:Leader和Follower。Kafka生产者只会把数据发往Leader,然后Follower找Leader进行同步数据
- Kafka
默认1个副本
,生产环境一般配置为2个,进而来保证数据可靠性 - Kafka分区中的所有副本统称为AR(Assigned Repllicas) AR = ISR + OSR
ISR,意为和leader保持同步的follower集合。当ISR中的follower完成数据的同步之后
,leader就会给producer发送ack,如果follower长时间未向leader同步数据
,则该follower将被踢出ISR,该时间阈值
由replica.lag.time.max.ms参数设定(默认30s)
OSR,表示Follower与Leader副本同步时,延迟过多的副本
kafka Leader和Follower故障处理
Follower故障处理细节
Follower故障处理细节
kafka 文件存储机制
1、 Kafka中消息是以topic进行分类的
,生产者生产消息,消费者消费消息,都是面向topic的
2、topic是逻辑上的概念
,而partition是物理上的概念
,每个partition对应于一个log文件
,该log文件中存储的就是producer生产的数据
。Producer生产的数据会被不断追加到该log文件末端
,且每条数据都有自己的offset
。消费者组中的每个消费者,都会实时记录
自己消费到了哪个offset,以便出错恢复时,从上次的位置继续消费
3、由于生产者生产的消息会不断追加到log文件末尾,为防止log文件过大
导致数据定位效率低下,Kafka采取了分片和索引机制
,将每个partition分为多个segment(1G)
。每个segment对应两个文件——“.index”文件
和“.log”文件
4、“.index”文件存储大量的索引信息(稀疏索引)
,“.log”文件存储大量的数据
,索引文件中的元数据指向对应数据文件中message的物理偏移地址
log文件和index文件详解:
Kafka中默认的日志保存时间为7天,可以通过调整如下参数修改保存时间
log.retention.hours,最低优先级小时,默认7天
log.retention.minutes,分钟
log.retention.ms,最高优先级毫秒
log.retention.check.interval.ms,负责设置检查周期,默认5分钟
那么日志一旦超过了设置的时间,怎么处理呢?
Kafka中提供的日志清理策略有delete和compact两种
- delete日志删除:将过期数据删除
log.cleanup.policy = delete 所有数据启用删除策略
(1)基于时间:默认打开。以segment中所有记录中的最大时间戳作为该文件时间戳
(2)基于大小:默认关闭。超过设置的所有日志总大小,删除最早的segment
log.retention.bytes,默认等于-1,表示无穷大
思考:如果一个segment中有一部分数据过期,一部分没有过期,怎么处理?
2. compact日志压缩
kafka 高效读写数据原因
(1)Kafka本身是分布式集群,可以采用分区技术,并行度高
(2)读数据采用稀疏索引,可以快速定位要消费的数据
(3)顺序写磁盘
Kafka的producer生产数据,要写入到log文件中,写的过程是一直追加到文件末端,为顺序写。官网有数据表明,同样的磁盘,顺序写能到600M/s,而随机写只有100K/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间
(4)页缓存 + 零拷贝技术