Kafka一个最基本的架构认识:由多个boker组成,每个broker是一个节点;创建一个topic,这个topic可以划分为多个partition,每个partition可以存在于不同的broker上,每个partition就放一部分数据。

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

Kafka 0.8以前,是没有HA机制的,就是任何一个broker宕机了,那个broker上的partition就废了,没法写也就没法读,没有什么高可用性而言。比如,创建了一个topic,指定其partition数量是3个,分别在三台机器上。但是,如果第二台机器宕机了,会导致这个topic的1/3的数据就丢了,因此这个是做不到高可用的。

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

高可用性,如果某个broker宕机了,那么broker上面的partition在其他机器上都有副本的。如果这个宕机的broker上面有某个partition的leader,那么此时会从follower中重新选举一个新的leader出来。

写数据的时候,生产者就写leader,然后leader将数据落地到本地磁盘,接着其他follower自己主动从leader来pulll数据。一旦所有follower同步好数据了,就会发送ack给leader,leader收到所有follower的ack之后,就会返回写成功的消息给生产者。

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