zoukankan      html  css  js  c++  java
  • mq和kafaka架构方面对比高可用性

    这一次我们就来说说消息队列的高可用的原理。这里主要讲的是现在使用比较多的RabbitMQ和大数据相关的Kafka两种消息中间件的高可用。这里只是讲解他们的实现原理,不会实战。

    1、RabbitMQ的高可用

    RabbitMQ是基于主从复制来实现高可用的,不支持分布式。既然是主从复制,那么肯定就不是单台机器能保证的,所以是通过集群来保证高可用。而RabbitMQ的集群模式有两种:普通集群和镜像集群。真正实现高可用的是镜像集群模式。

    1.1 普通集群模式

    图中注释已经讲解了,该集群模式不能保证高可用,它的作用只是提高了系统的吞吐量,同一个队列的消息,可以有多个消费者去消费。而且它的缺点是:在实例之间会产生网络传输,增加系统开销。

    而且如果那个存有queue的真实数据的实例宕机了,会导致接下来其他实例都无法拉取数据;如果没有开启消息的持久化会丢失消息;就算开启了消息的持久化,消息不一定会丢,但是也要等这个实例恢复了,才可以继续拉取数据。

    1.2 镜像集群模式

    这种集群模式是可以保证可用的,因为每个实例都存有完整的数据,就算其中的某一个实例宕机了,也只是这一个实例不能提供服务,其他的实例都能继续提供服务。

    不过它也有缺点:

    1、性能消耗太大,所有机器都要进行消息的同步,导致网络压力和消耗很大。

    2、没有扩展性可言,如果有一个queue负载很重,就算加了机器,新增的机器还是包含了这个queue的所有数据,并没有办法扩展queue。

          实际上RabbitMQ并不是分布式消息队列,他就是传统的消息队列,只不过提供了一些集群、HA的机制而已,因为无论如何配置,rabbitmq一个queue的数据就存放在一个节点里面,镜像集群下,也是每个节点都放这个queue的全部数据。

    1.3 开启镜像集群
           在控制台新增一个镜像集群模式的策略,指定的时候可以要求数据同步到所有节点,也可以要求同步到指定节点,然后在创建queue的时候,应用这个策略,就会自动将数据同步到其他的节点上面去了。

    2、Kafka的高可用     

      Kafka的一个基本架构:多个broker组成,一个broker是一个节点;一个topic可以划分成多个partition,每个partition可以存在于不同的broker上面,每个partition存放一部分数据。这是天然的分布式消息队列。

          Kafka在0.8以前是没有HA机制的,也就是说任何一个broker宕机了,那个broker上的partition就丢了,没法读也没法写,没有什么高可用可言。

          Kafka在0.8之后,提过了HA机制,也就是replica副本机制。每个partition的数据都会同步到其他机器上,形成自己的replica副本。然后所有的replica副本会选举一个leader出来,那么生产者消费者都和这个leader打交道,其他的replica就是follower。写的时候,leader会把数据同步到所有follower上面去,读的时候直接从leader上面读取即可。

    为什么只能读写leader:因为要是你可以随意去读写每个follower,那么就要关心数据一致性问题,系统复杂度太高,容易出问题。kafka会均匀度讲一个partition的所有数据replica分布在不同的机器上,这样就可以提高容错性。
    这样就是高可用了,因为如果某个broker宕机 了,没事儿,那个broker的partition在其他机器上有副本,如果这上面有某个partition的leader,那么此时会重新选举出一个新的leader出来,继续读写这个新的leader即可。

    写消息: 写数据的时候,生产者就写向leader,然后leader将数据落到磁盘上之后,接着其他follower自己主动从leader来pull数据。一旦所有follower同步好了数据,就会发送ack给leader,leader收到了所有的follower的ack之后,就会返回写成功的消息给消息生产者。(这只是一种模式,可以调整)。
    读数据: 消费数据的时候,只会从leader进行消费。但是只有一个消息已经被所有follower都同步成功返回ack的时候,这个消息才会被消费者读到。

  • 相关阅读:
    java中重载与重写的区别
    Java中数组的初始化方式
    break和continue的区别
    do while 循环和while循环的区别
    Java注释分类
    Java中的switch语句后面的控制表达式的数据类型
    DBA_TABLES之BLOCKS AND EMPTY_BLOCKS
    show_space 脚本
    Linux 6 配置multipath
    环保创业的可行之道——Leo鉴书上66
  • 原文地址:https://www.cnblogs.com/housh/p/12512767.html
Copyright © 2011-2022 走看看