面试题104:请描述一下Kafka为什么具有高可用性?

2023-05-10 09:46:33 浏览数 (1)

  • 首先,我们要先介绍一下Kafka中架构的基本结构:一个Kafka集群会有多个broker组成,每个broker我们可以称之为一个节点,也可以认为是一台运行kafka实例的机器,那么当我们要配置消息队列的时候,我们要创建一个topic(其实这只是一个虚拟的概念,其实并不存在物理上的topic),那么这个topic可以拆分为多个partition,而为了高可用性,每个partition是会放到不同的broker上面的。
  • 由于数据是被存放到不同broker的partition中,所以,可以保证如果有某个partition出错作废了,那么还有其他的partiton可以使用,那么这也被叫做kafka的冗余副本。
  • 在kafka0.8之前,partiton是用来拆分整体数据的,比如有4个节点,如果其中有一个宕掉了,那么就等于损失了1/4的数据,那么其实这种数据缺失的问题是无法被忽视的。
  • 那么在kafka0.8之后,采用了冗余副本机制,也就是一个topic下的N个partition都被称之为replica(副本),他们彼此之间是会去同步数据的。那么当kafka服务启动的时候,会多个partition之间选取出一个leader,那么这1个leader和N-1个follower直接是如何协同工作的呢?要讲明白,就需要从两方面来说明,即:写消息与读消息。
  • 当producer往kafka中写消息的时候,会写到leader partition上面,写完之后,leader会将数据同步到所有的follower上,当所有的follower都反馈已经写入完毕之后,leader才会返回给生产者消息写入成功。那么,有的同学就会问了,为什么首先要往leader上面去写?为什么不随便写到某个副本上,这样效率不是更高嘛?其实,要是可以随机写到某个副本上的话,就会造成多副本发起数据同步的行为,无疑会造成数据的一致性问题,并且会大大提升系统的复杂度。
  • 那么当comsumer消费消息的时候,只会从leader中读取数据。并且这个消息是所有follower都已经确认写入成功返回ack只会的可读消息。
  • 如果在运行期间,leader挂掉了,那么主节点会从存活的follower中选取新的leader,那么后续的读写,都由新选举出来的leader进行负责,这样就可以保障kafka集群的高可用性了。
  • 图例:

0 人点赞