Kafka动态维护了一个同步状态的副本的集合(a set of In-Sync Replicas),简称ISR,在这个集合中的节点都是和leader保持高度一致的,任何一条消息只有被这个集合中的每个节点读取并追加到日志中,才会向外部通知说“这个消息已经被提交”。
只有当消息被所有的副本加入到日志中时,才算是“committed”,只有committed的消息才会发送给consumer,这样就不用担心一旦leader down掉了消息会丢失。消息从leader复制到follower,我们可以通过决定Producer是否等待消息被提交的通知(ack)来区分同步复制和异步复制。
同步复制流程:
异步复制流程: 和同步复制的区别在于,leader写入本地log之后,直接向client回传ack消息,不需要等待所有follower复制完成。 既然kafka支持副本模式,那么其中一个Broker里的挂掉,一个新的leader就能通过ISR机制推选出来,继续处理读写请求。
依据两个条件:
acks 生产者投递消息的ACK的级别设置 如果需要等到ISR所有的follower副本返回消息leader,可能需要等待,便产生了不同的ack可靠性级别
kafKa消费消息主要是依靠偏移量进行消费数据的,偏移量是一个不断自增的整数值,当发生重平衡的时候,便于用来恢复数据。
重平衡Rebalance 消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。 发生重平衡时提交偏移量小于客户端处理的最后一个消息的偏移量,那么处于两个偏移量之间的消息就会被重复处理。 如果提交的偏移量大于客户端的最后一个消息的偏移量,那么处于两个偏移量之间的消息将会丢失。 怎么解决:
ISR(IN-SYNC Replication):维护了与leader信息一致的follower副本的信息,当leader挂掉的时候 就从这个ISR中选举。 当leader挂掉的时候,由controller会在follower副本中选举出一个leader。但是这个剩余follower副本有一个条件,就是follower必须在ISR列表中。 leader和ISR中的follower副本都同步完成时,就返回ack。 ISR信息存放在zookeeper的topic信息中,由kafka动态维护