Kafka的ISR机制
ISR(In-Sync Replicas 同步副本集)机制是一种用于确保数据可靠性和一致性的重要机制。
一、ISR的定义
ISR是指与Kafka分区中的Leader副本保持同步的Follower副本集合。这些副本已经复制了Leader副本的所有数据,并且它们的落后时间在一定范围内,因此被认为是可靠的、可以用于故障转移和数据恢复的副本。
二、ISR的作用
- 数据复制:当消息被写入Kafka的分区时,它首先会被写入Leader副本,然后Leader副本会将消息复制给ISR中的所有Follower副本。只有当ISR中的所有副本都成功地接收到并确认了消息后,Leader副本才会认为消息已成功提交。这种机制确保了数据的可靠性和一致性。
- 故障转移:如果Leader副本发生故障,Kafka会从ISR中选取一个新的Leader副本。由于ISR中的副本与之前的Leader副本保持同步,新的Leader副本能够继续提供服务,而不会丢失数据。
- 动态管理:ISR集合帮助Kafka实现副本的动态管理。系统会自动处理副本的加入和移出,确保系统的健康运行。如果某个Follower副本无法跟上Leader副本的更新速度,它将被移出ISR集合;一旦它重新追上Leader副本,它将被重新加入ISR集合。
接下来,我们将详细说明为什么需要Kafka的ISR(In-Sync Replicas)机制。
在双十一等高峰期,购物平台需要处理成千上万的并发订单业务。为了提升处理能力和系统响应速度,我们通常采用业务分离的策略,将接纳订单和处理订单的任务分别处理。这时,一个高效的中间件——Kafka,就显得尤为重要。Kafka能够作为消息队列,无条件地接收所有接纳订单的消息,而无需立即处理如库存检查等复杂逻辑。
然而,面对如此庞大的数据量,确保消息的可靠性成为了一个关键问题。如果其中一条接纳订单消息丢了怎么办?如果某条接纳订单的消息在传输过程中丢失,那将是不可接受的。Kafka里面的消息和Hadoop一样,是多副本的,这样就能很大一部分提供容错,这就是为什么需要ISR机制。
ISR机制利用ZooKeeper来维护一个同步副本的集合:
假设我们为每条消息设置了五个副本,那么往这个消息队列写一条消息的时候,也就需要把消息同步到五个副本里去。这样也同样带来一个问题,就是延迟,用消息队列的目的就是快,但如果等leader副本发送到所有副本上成功后才算一条消息成功完成,速度就太慢了,ISR就对这个过程进行了简化。在实际操作中,Kafka不会等待所有五个副本都确认消息后再认为消息已提交,ISR的做法是先设置几个队列(如设置3个,一般要为奇数个,不然zookeeper的过半选举机制容易难以进行),作为ISR队列,要求leader同步完这个两个才算完成,而其他的副本作为followers队列,不要求及时同步。这样做的好处就是如果leader端发生故障,可以及时从ISR队列中选出一个leader,因为他们是完全同步的,所以直接衔接,不会出任何问题,随后ISR再从followers队列中选取一个作为ISR队列的替补。
ISR的多副本还有一个好处,也就是读写分离。如果要去读,那么去读哪一个ISR队列都是可以的,因为完全同步,内容完全一样,这个ISR的队列有多少个,并行度就是多少。ISR写只需要往一个副本中写(leader),在往leader中写的时候需要上锁,读可以从其他任何一个ISR队列中读取。这种读写分离的设计提高了系统的并行处理能力,进一步降低了延迟。
这是就是一个分区的完整过程,同时kafka还有多分区机制,在写入时候,还有负载均衡机制,也就是检测哪个分区资源相对宽裕再写入哪个分区,从而降低延迟。这样就保证了kafka的高容错,低延时。