kafka简介
kafka是一个消息队列,消息中间价。主要作用是解耦消峰。由生产者(producer),主题(topic),消费者组(consumer)组成。每个broker中有N个Topic(抽象化),每个Topic有N个partition分区。kafka的消费模式是Pull模式,即消费者根据自己的消息处理能力去kafka主动拉取数据,但消费者不能即时知道是否有消息,可能会拉到空的数据。针对这点,kafka的消费者会在消费数据时传入一个时长参数timeout,如果当前没有数据可供消费,consumer会等待一段时间之后再返回。
ack应答机制
作用:解决kafka生产端数据丢失问题
主要分为三种:
ack=0:producer不等待borker的ack,即broker一接收到还没有写有写入磁盘就返回,当broker出现故障的话,数据就会丢失。这个操作速度快效率高,但是数据不安全
ack=1:producer等待broker的ack,即paritition所在的Leader落盘成功后返回ack,如果follewer同步成功之前leader故障,也会造成数据丢失。这个操作效率相对较低,能保证大部分情况的数据安全。
ack=-1(all):producer等待broker的ack,partition的leader和follower全部落盘成功后才返回ack。但如果再follower同步完成后,broker发送ack之前,leader发生了故障,会造成数据重复。
ISR机制
当设置ack=-1的时候,会有一个ISR机制,也就是副本同步机制,保证数据的一致性。通过follower和leader的交互时间来判断,超过某个设定时间就判断该followerGG了,重新换一个follower(前提是有足够的节点)。时间默认位10S,也可以通过自己设置。rerplica.lag.time.max
LEO:每个副本的最后一个offset
HW:所有副本最小的LEO
leader出现故障的话,会从ISR中重新选一个新的leader,为了保证副本之间的一致性,其他的follower会将各自的Log文件高于HW的数据删除掉,然后从新的leader中同步数据
follower出现故障的话,会从ISR中剔除掉,等恢复后,会从Log文件中高HW的数据删除掉,从HW开始向leader同步。当follower的LEO大于等于partrtition的HW,即follower追上Leader之后,就可以重新加入到ISR了。