消息队列MQ如何保证高可用性?
保证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如何保证高可用性?的更多相关文章
- java面试记录三:hashmap、hashtable、concurrentHashmap、ArrayList、linkedList、linkedHashmap、Object类的12个成员方法、消息队列MQ的种类
口述题 1.HashMap的原理?(数组+单向链表.put.get.size方法) 非线程安全:(1)hash冲突:多线程某一时刻同时操作hashmap并执行put操作时,可能会产两个key的hash ...
- 为什么会需要消息队列(MQ)?
为什么会需要消息队列(MQ)? #################################################################################### ...
- 消息队列一:为什么需要消息队列(MQ)?
为什么会需要消息队列(MQ)? #################################################################################### ...
- 详解RPC远程调用和消息队列MQ的区别
PC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制. RPC框架 知名度较高的有Thrift(FB的).dubbo(阿里的). RP ...
- 消息队列 MQ 入门理解
功能特性: 应用场景: 消息队列 MQ 可应用于如下几个场景: 分布式事务 在传统的事务处理中,多个系统之间的交互耦合到一个事务中,响应时间长,影响系统可用性.引入分布式事务消息,交易系统和消息队列之 ...
- 高并发系统:消息队列MQ
注:前提是知道什么是消息队列.不懂的去搜索各种消息队列入门(activeMQ.rabbitMQ.rocketMQ.kafka) 1.为什么要使用MQ?(MQ的好处:解耦.异步.削峰) (1)解耦:主要 ...
- 消息队列MQ简介
项目中要用到RabbitMQ,领导让我先了解一下.在之前的公司中,用到过消息队列MQ,阿里的那款RocketMQ,当时公司也做了简单的技术分享,自己也看了一些博客.自己在有道云笔记上,做了一些整理,但 ...
- 消息队列MQ集合
消息队列MQ集合 消息队列简介 kafka简介 Centos7部署zookeeper和Kafka集群 .
- 消费端如何保证消息队列MQ的有序消费
消息无序产生的原因 消息队列,既然是队列就能保证消息在进入队列,以及出队列的时候保证消息的有序性,显然这是在消息的生产端(Producer),但是往往在生产环境中有多个消息的消费端(Consumer) ...
随机推荐
- 微信小程序框架分析小练手(三)——仿香哈菜谱小程序制作
香哈菜谱是一款围绕美食而成的小程序,在这里可以查看各式各样的菜谱. 一.打开微信开发者工具,新建一个项目:xhcp.如下图: 二.建立如下的一些目录: 三.将底部标签导航图标.美食轮播图片.宫格导航图 ...
- openstack 架构
openstack 概念架构: openstack逻辑架构 常见的架构:
- web语义化这个坑
什么是wen语义化:https://www.zhihu.com/question/20455165 标签大全:http://www.w3school.com.cn/tags/tag_html.asp ...
- svn: Can't connect to host '': 由于目标机器积极 原因及解决办法
在dos环境下输入命令“svnserve -d --listen-port 3690 -r d:\svn” 这里“d:\svn” 是你在svn中创建的版本库路径,然后执行命令,记住窗口不能关闭,关闭之 ...
- 【大白话系统】MySQL 学习总结 之 缓冲池(Buffer Pool) 的设计原理和管理机制
一.缓冲池(Buffer Pool)的地位 在<MySQL 学习总结 之 InnoDB 存储引擎的架构设计>中,我们就讲到,缓冲池是 InnoDB 存储引擎中最重要的组件.因为为了提高 M ...
- 用赋值表达式作为bool值
enum Status { stOk, stQuit, stError }; int main() { Status status; int n; bool b1 = (status = stOk); ...
- python中调用函数时,参数顺序与参数赋值问题
设置类和函数如下:class MM(): def ff(self,url(1),method(2),data=None(3),cookie=None(4)): if method.lower()==& ...
- [REDIS 读书笔记]第一部分 数据结构与对象 跳跃表
下面是跳跃表的基本原理,REDIS的实现大致相同 跳跃表的一个特点是,插入NODE是通过随机的方式来决定level的,比较奇特 下面是skipList的一个介绍,转载来的,源地址:http://ken ...
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条
第六条 消除过期引用 JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象.这是因为栈的内部维护着对这些对 ...
- ts的特殊数据类型
四. Ts数据类型 tuple(元组类型):可以给数组指定位置存指定类型数据 例:let arr:[number, string] = [123, ‘123’]; enum(枚举):将数字转化为标识符 ...