kafka的分布式和高可用
kafka的一个基本架构:多个broker组成,一个broker是一个节点;你创建一个topic,这个topic可以划分成多个partition,每个parttition可以存在于不同的broker上面,每个partition存放一部分数据。这是天然的分布式消息队列。
实时上rabbitmq并不分布式消息队列,他就是传统的消息对了,只不过提供了一些集群,HA的机制而已,因为无论如何配置,rabbitmq一个queue的数据就存放在一个节点里面,镜像集群下,也是每个节点都放这个quere的全部数据。
kafka在0.8以前是没有HA机制的,也就是说如何一个broker宕机了,那个broker上的partition就丢了,没法读也没法写,没有什么高可用可言。
kafka在0.8之后,提过了HA机制,也就是replica副本机制。每个partition的数据都会同步到其他机器上,形成自己的replica副本。然后所有的replica副本会选举一个leader出来,那么生产者消费者都和这个leader打交道,其他的replica就是fllower。
写的时候,leader会把数据同步到所有Follower上面去,读的时候直接从leader上面读取即可。为什么只能读写leader:业务要是你可以随意去读写每个follower,那么就要关心数据一致性问题,系统复杂度太高,容易出问题。kafka会均匀度讲一个partition的所有数据replica分布在不同的机器上,这样就可以提高容错性。
这样就是高可用了,因为如果某个broker宕机了,没事了,那个broker的partition在其他机器上有副本,如果这上面有某个partition的loder,那么此时会重新选举出一个现代leader出来,继续读写这个新的leader即可。
- 写消息: 写数据的时候,生产者就写好leader,然后leader将数据落到磁盘上之后,接着其他follower自己主动从leader来pull数据。一旦所有follower同步好了数据,就会发送ack个leader,leader收到了