消息队列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) ...
随机推荐
- 一个支持高网络吞吐量、基于机器性能评分的TCP负载均衡器gobalan
一个支持高网络吞吐量.基于机器性能评分的TCP负载均衡器gobalan 作者最近用golang实现了一个TCP负载均衡器,灵感来自grpc.几个主要的特性就是: 支持高网络吞吐量 实现了基于机器性能评 ...
- 实验6:路由器IOS升级
路由器IOS升级 Cisco路由器IOS映像恢复及升级方法 一.Cisco 1000,1600,2500,4000系列 1.IOS映像恢复的方法及步骤 1) 连接PC的COM1口与路由器的consol ...
- Java12可用新特性一览,了解一下没有错
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...
- python学习--quote()函数
屏蔽特殊的字符.比如如果url里面的空格!url里面是不允许出现空格的. 在 Python2.x 中的用法是:urllib.quote(text)Python3.x 中是urllib.parse.qu ...
- [Jinja2]本地加载html模板
import os from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader ...
- 永久解决AndroidStudio Aapt2的问题
https://blog.csdn.net/qq_37280248/article/details/80142260 修改电脑c://user/王明 中文名去掉 https://www.jb51.ne ...
- throw throws区别
1.throws是在方法上对一个方法进行声明,而不进行处理,向上传,谁调用谁处理: 格式: 权限修饰符 返回值类型 方法名(参数列表) throws Exception1,Exception2...{ ...
- Linux bash管道符“|”使用介绍与例子
https://blog.csdn.net/wangqianyilynn/article/details/75576815
- ps查看资源消耗
- Windows渗透备忘录
Windows渗透备忘录 mimikatz mimikatz.exe ""privilege::debug"" ""sekurlsa::lo ...