Kafka以高吞吐量、低延迟、高并发、高可扩展性而自称,并在越来越多的场景中应用。下面聊聊Kafka高可用、高性能、高并发的设计原理。
1、Kafka高可用设计原理
1.1、控制器
Kafka控制器就是Broker,除了具有一般Broker的功能外,还具有选举主题的分区Leader节点的功能。
在启动Kafka系统的时候,其中一个Broker会被选举为控制器,负责管理主题的分区和副本的状态,还会执行重分配的任务。第一个启动的Broker会在Zookeeper系统里创建一个临时节点/controller,并写入该节点的注册信息,使该节点成为控制器。其他Broker在陆续启动时,也会尝试在Zookeeper系统中创建临时节点/controller,但由于已经存在,会创建失败,确保了Kafka集群中控制器的唯一性。
可见,控制器选举的核心思路是各个节点公平竞争抢占Zookeeper系统中临时节点/controller,最先创建成功的Broker会成为控制器,并拥有选举主题的分区Leader节点的功能。
1.2 、副本机制
副本机制简单来说就是备份机制,在集群中保存着相同的数据备份,提供数据冗余,是Kafka确保系统高可用和高持久的重要基石。
Kafka的分区是多副本的,若其中一个副本丢失了,那么还可以从其他副本中获取分区数据。
在Kafka中,主题(Topic)被分为多个分区(Partition),分区是Kafka最基本的存储单位。在创建主题的时候可以使用replication-factor参数指定分区的副本个数,分区的副本中总会有一个Leader副本,其他为Follower副本,所有的消息都直接发送给Leader副本,其他Follower副本都需要通过复制Leader副本中的数据来保证数据一致。当Leader副本不可用时,其中一个Follower副本会被选举为新的Leader副本。
1.3、ISR机制
每个分区(Partition)都有一个ISR(in-sync-replica)列表,用于维护所有同步的、可用的副本。Leader副本必然是同步副本,也就是说ISR不只是Follower副本的集合,也包括Leader副本,甚至在某些情况,ISR只有一个Leader副本。
同步副本的条件:
- 必须定时向Zookeeper发送心跳;
- 在规定的时间内从Leader副本低延迟的获取过消息;
若副本不满足上面条件的话,就会被从ISR列表中移除,直到满足条件才会被再次加入。
Kafka判断Follower是否与Leader同步的条件就是replica.l