1.架构认识:由多个broker组成,每个broker是一个节点;

                      你创建一个topic,这个topic可以划分为多个partition,每个partition可以存在与不同的broker上,没给partition就放一部分数据。

                      天然的分布式消息队列,就是说一个topic的数据,是分散在多个机器上的,每个机器就放一部分数据。

Kafka0.8以前,是没有HA机制的,就是这个broker宕机了,那个broker上的partition就废了,没法写也没法读,没有什么高可用性可言。

比如说,我们假设创建了一个 topic,指定其 partition 数量是 3 个,分别在三台机器上。但是,如果第二台机器宕机了,会导致这个 topic 的 1/3 的数据就丢了,因此这个是做不到高可用的。

                                                            

Kafka0.8以后,提供了HA机制,就是replica(复制品)副本机制。每个partition的数据都会同步到其他机器上,形成自己的多个replica副本。所有replica会选举一个leader会负责把数据同步到所有follower上去,读的时候就直接读leader上的数据即可。只能读写leader?要是你可以随意读写每个follower,那么就要care数据一致性的问题,系统复杂度太高,很容易出问题。Kafka会均匀地将一个partition的所有replica分布在不同的机器上,这样才可以提高容错性。

 

这就是所谓的高可用性了,因为如果某个broker宕机了,没事,那个broker上面的partition在其他机器上都由副本。假设这个宕机的broker是上面有某个partition的leader,那么此时重新从follower中重新选举一个新的leader出来,大家继续读写这个新的leader即可。

写数据的时候,生产者就写leader,然后leader将数据落地写本地磁盘,接着其他follower自己主动从leader来pull数据。一旦所有follower同步好数据了,就会发送ack给leader,leader收到所有follower的ack之后,就会返回成功的消息给生产者。(这只是其中一种模式,还可以适当调整这个行为)

消费的时候,只会从leader去读,但是只有当一个消息已经被所有follower都同步成功返回ack的时候,这个消息才会被消费者读到。