目录
1. 什么是高可用?
1.1 常见的高可用方法
1.2 消息队列的高可用
2. RabbitMQ的高可用方案
2.1 镜像队列
2.2 消息生产的确认机制
2.3 消息的持久化
3. Kafka的高可用方案
3.1 消息备份
3.2 ISR & IEO & HW
3.3 消息生产的确认机制
4. RocketMQ的高可用方案
4.1 消息备份机制
5.RabbitMQ & Kafka & RocketMQ差异总结
6. 参考资料
高可用(High Availability,简称HA)是指一个系统、应用程序或服务可以在发生故障或其他异常情况时,仍然能够保持可用性和稳定性,确保用户能够无缝访问和使用。
我们通常实现高可用的方法包括:
这里说的消息队列的高可用特指消息队列集群所做的高可用设计,无论是RabbitMQ、Kafka,还是RocketMQ,在高可用上都做到了数据备份、服务冗余,他们的核心差异在于不同的消息队列数据备份的力度、消息同步机制、消息持久化机制的设计思想上存在差异。
▎消息生产:如果生产者与Slave建立连接,Slave会把请求转发到Master,Master存储后再把请求转发到其他Slave进行存储。
▎消息消费:如果消费者与Slave建立连接并进行订阅消费,实质上请求会被转发到Master上获取信息,只不过看似是从Slave上消费而己。这里的疑问是,这里的Master会不会压力比较大?答案是如果我们的各个队列的Leader能够平均分布在各个Broker,就不会给一个Broker带来特别大的压力。
▎Slave升级:当Master挂掉之后,会触发把消息队列最长的升级为Master。
此外,为了避免机房断电、断网等极端情况,RabbitMQ还提供了Shovel远程模式,把消息存储在跨地域的两个不同的数据中心,并让两个跨地域的两个MQ集群互联
镜像队列只是解决了一个节点宕机后,还有其他备用节点可用。但是RabbitMQ针对主从复制的机制是什么样的?是否能保障切换时主从节点的一致性呢?
在早期的RabbitMQ,主从复制的方案是异步复制,也就是当消息被存储到到Master节点后,会立刻给生产者进行ACK,表示消息已经被接收并写入成功,此时,Slave节点可能还没有完全同步数据。
但是,从 RabbitMQ 3.7 版本开始,RabbitMQ 增加了一个新的队列类型 quorum queue(法定队列),通过提供一种基于 Paxos 的一致性算法来保证数据在主从节点之间的强一致性。
Kafka允许一个队列存在多个Partition,每个Partition存在一个Leader和多个Follower。生产者将消息直接发往对应Partition的Leader,Follower会周期地向Leader发送同步请求,Kafka的Leader机制在保障数据一致性地同时降低了消息备份的复杂度。
LEO(log end offset) :即日志末端偏移,指向了副本日志中下一条消息的位移值(即下一条消息的写入位置)。
HW(high watermark):即已同步消息标识,因其类似于木桶效应中短板决定水位高度,故取名高水位线。
下图详细的说明了当Producer生产消息至Broker后,ISR以及HW和LEO的流转过程:
生产者无需等待服务端的任何确认,消息被添加到生产者套接字缓冲区后就视为已发送,因此acks=0不能保证服务端已收到消息,使用场景较少。
Leader将消息写入本地日志后无需等待Follower的消息确认就做出应答。如果Leader在应答消息后立即宕机且其他Follower均未完成消息的复制,则该条消息将丢失。
acks=all
Leader将等待ISR中的所有副本确认后再做出应答,因此只要ISR中任何一个副本还存活着,这条应答过的消息就不会丢失。acks=all是可用性最高的选择,但等待Follower应答引入了额外的响应时间。Leader需要等待ISR中所有副本做出应答,此时响应时间取决于ISR中最慢的那台机器。
为了保障RocketMQ不丢消息,RocketMQ一般是将Broker部署成Master-Slave模式。其中Master节点负责处理消息的写入和读取请求,Slave节点则进行数据的复制以及读取请求的负载均衡。通常RocketMQ的主从复制方案包括:
镜像队列 - RabbitMQ 教程
基于MySql,Redis,Mq,ES的高可用方案解析
Kafka架构、高性能和高可用性分析_aijiudu的博客-CSDN博客
Kafka的存储机制和可靠性_kafka作为数据缓存区_Lion Long的博客-CSDN博客
解开Kafka神秘的面纱(二):Kafka的高效读写与消息安全_kafaka_毛奇志的博客-CSDN博客
RocketMQ保证高可用和高性能的几种措施
RocketMQ原理:RocketMQ高可用原理 - 墨天轮
我理解的RocketMQ:主从复制HA(high availability)的机制分析_rocketmq的ha机制_xiaojkql的博客-CSDN博客
高可用集群_高可用集群实现高可用性的方法主要有_尐譽的博客-CSDN博客
实现高可用的 11 个关键技巧_如何实现高可用_a1405的博客-CSDN博客
高可用架构设计的六个方法_梯度科技的博客-CSDN博客
服务容错设计:流量控制、服务熔断、服务降级_张维鹏的博客-CSDN博客
可靠性设计:容错设计_软件容错_徐步陌上行的博客-CSDN博客
RabbitMQ的高可用方案_rabbitmq高可用方案_倔强100%的博客-CSDN博客
RabbitMQ的高可用、高可靠保证_rabbitmq高可用_柠檬丶Ewing的博客-CSDN博客
RabbitMQ持久化机制_琦彦的博客-CSDN博客
RabbitMQ VS Apache Kafka (九)—— RabbitMQ集群的分区容错性与高可用性-腾讯云开发者社区-腾讯云