1.kafka中的partition和Replicas
partition指本topic有多少个分区,Replicas是指每个partition有多少数据备份,这里如果Replicas=3,那么多余每个partition则有1个leader和两个follower。
2.kafka中最普通的leader和follower
follower相比leader副本会有一定的滞后,所以根据滞后程度的不同 follower又进一步划分为ISR(In-Sync Replicas 可容忍滞后)和OSR(Out-of-Sync Replicas 滞后过多),当leader发生故障时,只有ISR中的follower才有选举资格(可修改配置让OSR也有选举资格)。AR(Assigned Replicas) =ISR+OSR
2.1 ISR HW(High Watermark) 和LEO(Log End Offset)的关系
因为数据需要同步,往往数据写入leader后需要同步到follower中,此时只有在所有ISR中同步完成的数据才能被消费者消费。所以HW的值等于所有ISR同步offset的值+1。从这里可以看出kakfa的复制机制不是完全的同步复制,也不是单纯的异步复制(需要等待所有的ISR同步完成才算写入成功)。LEO则是写入leader的offset值+1。
3.数据发送
acks=1 只要leader写入成功则发送成功,可能丢失数据。
acks=0 不需要任何响应
acks=-1 所有的ISR写入成功则发送成功,但是ISR中可能只有leader此时会退化为acks=1,也会丢失数据。这里可以配合min.insysc.replicas来保证消息可靠性
4.数据读取
1.从earliest 和 latest
2.通过seek()从指定分区的指定offset消费
3.通过seek()从指定时间开始消费
5.多线程消费
1.一个partition配置一个消费者
2.Topic下面又N个消费者,然后消费者获取到一批数据后再分发给下面的线程。但是会有offset提交的bug 栗子:offset 1-> Thread 1 offset 2 -> Thread 2 Thread 2优先完成了 此时提交了offset 但是Thread 1出了故障 就会导致数据丢失
3.在2上进行加强,引入了滑动窗口的概念。这里是将多批数据缓存,然后将数据划分为多个区域,每个区域有一个线程消费。startOffset标志数据起始位置,endOffset标志数据结束位置。然后每次第一个区域消费完后,startOffset向后移动,同时提交消费完的Offset,endOffset也需要向后移动。一般在第一个区域消费完后后面的区域因为是并行的关系也很快就消费完成了,提高了消费的效率。同时如果在一段时间内startOffset没有移动,那么直接进入重试队列 不行就进入死信队列。
6.kafka并不是分区数越多吞吐量越高,会有一个临界值。