1、kafka一个最基本的架构认识架构
由多个broker组成,每一个broker就是一个节点;建立一个topic,这个topic能够划分为多个partition,每一个partition能够存在于不一样的broker上,每一个partition存放放一部分数据。分布式
kafka就是一个分布式消息队列,就是说一个topic的数据,是分散放在多个机器上的,每一个机器就放一部分数据。
实际上像rabbitmq之类的,并非分布式消息队列,它只是传统的消息队列,只不过提供了一些集群、HA的机制而已,由于rabbitmq的一个queue的数据都是放在一个节点里的,镜像集群下,也是每一个节点都存放这个queue的完整数据。spa
2、kafka高可用机制blog
kafka 0.8之前,是没有HA机制的,就是任何一个broker宕机了,那个broker上的partition就废了,无法写也无法读,没有什么高可用性可言。rabbitmq
kafka 0.8之后,提供了HA机制,就是replica副本机制。每一个partition的数据都会同步到其余机器上,造成本身的多个replica副本。而后全部replica会选举一个leader出来,那么生产和消费都跟这个leader打交道,而后其余replica就是follower。写的时候,leader会负责把数据同步到全部follower上去,读的时候就直接读leader上数据便可。只能读写leader?很简单,要是你能够随意读写每一个follower,那么就要care数据一致性的问题,系统复杂度过高,很容易出问题。kafka会均匀的将一个partition的全部replica分布在不一样的机器上,这样才能够提升容错性。队列
kafka的这种机制,就有所谓的高可用性了,由于若是某个broker宕机了,也没事儿,由于那个broker上面的partition在其余机器上都有副本的,那么此时会从新选举一个新的leader出来,你们继续读写那个新的leader便可。这就有所谓的高可用性了。kafka
1)写过程同步
写数据的时候,生产者就写leader,而后leader将数据落地写本地磁盘,接着其余follower本身主动从leader来pull数据。一旦全部follower同步好数据了,就会发送ack给leader,leader收到全部follower的ack以后,就会返回写成功的消息给生产者。(固然,这只是其中一种模式,还能够适当调整这个行为)消息队列
2)读过程it
消费的时候,只会从leader去读,可是只有当一个消息已经被全部follower都同步成功并返回ack的时候,这个消息才可以被消费者读到。
题外话: RabbitMQ的高可用性
RabbitMQ是比较有表明性的,由于是基于主从作高可用性的;
rabbitmq有三种模式:单机模式,普通集群模式,镜像集群模式
1.单机模式
demo级别,生产不能用单机模式。
2.普通集群模式
就是在多台机器上启动多个rabbitmq实例,每一个机器启动一个。可是你建立的queue,只会存放在一个rabbtimq实例上,可是每一个实例都同步queue的元数据。实际上若是链接到了另一个实例,那么那个实例会从真正存有数据的queue所在实例上拉取数据过来。
没作到所谓的分布式,就是个普通集群。该方案主要是提升吞吐量的,就是说让集群中多个节点来服务某个queue的读写操做。
3.镜像集群模式
这种模式,才是所谓的rabbitmq的高可用模式,跟普通集群模式不同的是,你建立的queue,不管元数据仍是queue里的消息都会存在于多个实例上,而后每次你写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息同步。