保证MQ的高可用性,主要是解决MQ的缺点--系统复杂性变高--带来的问题

主要说一下  rabbitMQ  和  kafka  的高可用性

一、rabbitMQ的高可用性

rabbitMQ是基于主从做高可用性的,主要有三种模式:单机模式(不推荐)、普通集群模式(不推荐)、镜像集群模式(推荐)

1、单机模式:demo级别,本地启动,个人练习使用的,生产环境一般不用

2、普通集群模式:

      

    多台机器上启动多个rabbitMQ实例,但是你创建的queue元数据+实际数据)只会放在一个rabbitMQ实例 A 上,其他实例都会同步queue的元数据(元数据可以理解为queue的位置、信息,便于其他实例拉取数据的)。如果消费者消费信息的时候,实际连接的是另一个实例 B ,那个B会根据元数据去到A上拉取数据过来。

  缺点是:没做到所谓的分布式,就是个普通集群。

      消费者每次随机连接一个实例拉取数据(增加了拉取数据的开销),

      要么就是消费者固定连接到那个queue所在的实例消费数据(导致单实例性能瓶颈)。

      若A宕机了(丢失数据),则其他实例无法拉取数据。即使开启了消息持久化,让rabbitMQ落地存储消息,消息不一定会丢,得等A恢复了才能继续拉取数据。

总结:并没有高可用性可言。该方案主要是提高吞吐量,让集群中多个节点来服务某个queue的读写操作

3、镜像集群模式:rabbitMQ的高可用实现

      

  创建一个queue(元数据+实际数据),无论是queue的元数据还是消息,都存在于多个实例上。每次写消息到queue时,都会自动把消息同步到多个实例的queue里。

  好处是不担心宕机,因为所有实例的数据都是一样的。

  坏处是(1)性能开销大,消息同步所有机器导致网络带宽压力和消耗很重;

   (2)无扩展性可言,若某queue负载很重,你再加机器,新增的机器也包含了这个queue的所有数据,并没有办法线性拓展你的queue(非分布式的);

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

二、kafka 的高可用性

分布式消息队列

架构认识: 由多个broker组成,每个broker是一个节点。你创建一个topic,这个topic可以划分成多个partition,每个partition可以存在于不同的broker上,每个partition就放一部分数据。也就是说一个topic的数据,是分散放在多个机器上的,每个机器就放一部分数据。

  kafka0.8之前是没有HA模式的(high access),就是replica副本机制

  每个partition的数据都会同步到其他机器上,形成自己的多个replica副本,所有replica会选举出一个leader出来,那么生产者和消费者都是跟这个leader打交道,其他replica就是follower。

  写的时候,leader会负责把数据同步到所有follower上去,读的时候直接读leader上数据即可。

  高可用性在于:kafka会均匀的将一个partition的所有replica分布在不同的机器上,提高容错性。若某个broker宕机了,刚好其上有某个partition的leader,那么此时kafka会自动重新选举出一个新leader,继续读写那个新leader即可。

  如何保证所有follower数据跟leader一样?写数据的时候,生产者就是leader,将数据落地写入本地磁盘,接着其他follower主动从leader来拉数据。一旦所有follower同步好数据,会发送ack给leader,leader收到所有follower的ack后,会返回写成功的消息给生产者。

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

消息队列MQ如何保证高可用性?的更多相关文章

  1. java面试记录三:hashmap、hashtable、concurrentHashmap、ArrayList、linkedList、linkedHashmap、Object类的12个成员方法、消息队列MQ的种类

    口述题 1.HashMap的原理?(数组+单向链表.put.get.size方法) 非线程安全:(1)hash冲突:多线程某一时刻同时操作hashmap并执行put操作时,可能会产两个key的hash ...

  2. 为什么会需要消息队列(MQ)?

    为什么会需要消息队列(MQ)? #################################################################################### ...

  3. 消息队列一:为什么需要消息队列(MQ)?

    为什么会需要消息队列(MQ)? #################################################################################### ...

  4. 详解RPC远程调用和消息队列MQ的区别

    PC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制. RPC框架 知名度较高的有Thrift(FB的).dubbo(阿里的). RP ...

  5. 消息队列 MQ 入门理解

    功能特性: 应用场景: 消息队列 MQ 可应用于如下几个场景: 分布式事务 在传统的事务处理中,多个系统之间的交互耦合到一个事务中,响应时间长,影响系统可用性.引入分布式事务消息,交易系统和消息队列之 ...

  6. 高并发系统:消息队列MQ

    注:前提是知道什么是消息队列.不懂的去搜索各种消息队列入门(activeMQ.rabbitMQ.rocketMQ.kafka) 1.为什么要使用MQ?(MQ的好处:解耦.异步.削峰) (1)解耦:主要 ...

  7. 消息队列MQ简介

    项目中要用到RabbitMQ,领导让我先了解一下.在之前的公司中,用到过消息队列MQ,阿里的那款RocketMQ,当时公司也做了简单的技术分享,自己也看了一些博客.自己在有道云笔记上,做了一些整理,但 ...

  8. 消息队列MQ集合

    消息队列MQ集合 消息队列简介 kafka简介 Centos7部署zookeeper和Kafka集群 .

  9. 消费端如何保证消息队列MQ的有序消费

    消息无序产生的原因 消息队列,既然是队列就能保证消息在进入队列,以及出队列的时候保证消息的有序性,显然这是在消息的生产端(Producer),但是往往在生产环境中有多个消息的消费端(Consumer) ...

随机推荐

  1. kubernetes安装-kubeadm

    系统信息 角色 系统 CPU Core memory master 18.04.1-Ubuntu 4 8G slave 18.04.1-Ubuntu 4 4G 安装前准备(主节点和从节点都需要执行) ...

  2. C++ STL IO流 与 Unicode (UTF-16 UTF-8) 的协同工作

    09年研究技术的大神真的好多,本文测试有很多错误,更正后发布下(可能与编辑器相关). file.imbue(locale(file.getloc(), new codecvt_utf8<wcha ...

  3. VC获取cookies的几种方法

    方法一: CInternetSession::GetCookie This member function implements the behavior of the Win32 function  ...

  4. 尝试用 Python 写了个病毒传播模拟程序

    病毒扩散仿真程序,用 python 也可以. 概述 事情是这样的,B 站 UP 主 @ele 实验室,写了一个简单的疫情传播仿真程序,告诉大家在家待着的重要性,视频相信大家都看过了,并且 UP 主也放 ...

  5. HDU_4496_逆向并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=4496 逆向并查集,先读取,然后从后向前join每次保存答案即可. #include<iostream> ...

  6. ugligy 转

    3.配置gulpfile.js 3.1.基本使用 JavaScript 1 2 3 4 5 6 7 8 var gulp = require('gulp'),     uglify = require ...

  7. Mysql的基本查询语句

    聚集函数 mysql有5个聚集函数,分别是AVG,MAX,MIN,SUM,COUNT. 分组 分组的使用group by作为关键字,having作为条件关键字. having和where的区别:1.w ...

  8. JFrame的BorderLayout

    JFrame的默认布局就是BorderLayout,即将一个窗体划分为东西南北中五个板块. 如果往其中添加组件,中间面板大小随窗体大小变化,其余部分根据添加的组件的大小自适应. 容器变高,则North ...

  9. 对c语言中static函数的理解

    先看看前两篇博客:个人对头文件的理解.对声明和定义的理解. static 函数只在定义该static函数的cpp中可见,在其他cpp中是不可见的. 举个例子,我建立了一个project,该projec ...

  10. Docker的基本使用与简介

    1 Docker简介 1.1 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器.网络.内存及存储等,予以抽象.转换后呈现出来 ...