生产环境出现网络分区,RocketMQ集群表示毫无压力!!!

简介: 生产环境出现网络分区,RocketMQ集群表示毫无压力!!!

1、RocketMQ路由注册机制与缺陷


RocketMQ的路由注册机制如下:

fefdd3037656e36eb67d50c3272332a4.jpg

  • Broker 每30s向 NameServer 发送心跳包,心跳包中包含主题的路由信息(主题的读写队列数、操作权限等),NameServer 会通过 HashMap 更新 Topic 的路由信息,并记录最后一次收到 Broker 的时间戳。
  • NameServer 以每10s的频率清除已宕机的 Broker,NameServr 认为 Broker 宕机的依据是如果当前系统时间戳减去最后一次收到 Broker 心跳包的时间戳大于120s。
  • 消息生产者以每30s的频率去拉取主题的路由信息,即消息生产者并不会立即感知 Broker 服务器的新增与删除
  • broker与nameserver之间的连接断开,对应的borker中的路由信息会从nameserver中立即剔除,但同样需要等客户端主动来更新路由信息才会被感知。

上面的实现方式非常的简单高效,但也存在两个非常明显的缺陷

  • 消息发送者、消息消费者无法及时感知broker服务器的宕机与假死,即无法及时获取最新的路由信息。
  • nameserver之间相互不通信,nameserver之间的路由信息会存在不一致形象,但能最终保证一致性。


由于粉丝朋友的关注点在网络分区,网络分区,更加关注的就是nameserver存储的路由信息会不致,接下来重点探讨网络分区。


2、网络分区造成长时间数据不一致


从路由的注册机制来看,各个nameserver之间的路由信息会存在短暂的不一致性,但都能在较短时间内达到一致,在路由寻址场景中是可以接受的,但如果出现网络分区,则数据无法达到一致,示意图如下:

44211c0dbeaabb5475cb31e71a4bfed9.png

例如如果两个网段出现异常,阐述所谓的网络分区,整个集群被划分在两个分区中,如果出现网段1与网段2不能访问,但网段-3可以访问网1、2。


网段1与网段2之间无法互通,会导致broker-a中的topic路由信息不会存储到nameserver-b,broker-b、broker-c中topic的路由信息同样不会存储到nameserver-a中。


2.1对消息发送到影响


在rocketmq中消息发送者同一时间只会连接一台nameserver,消息发送方(Producer-1)连接到是nameserver-a,从中查出4个队列,那该消息发送者发送到消息都回发送到到broker-a;


如果另一消息发送者(Producer-2)连接到是nameserver-b,则发送到消息会分布到broker-b,broker-c,如果Producer-1需要发送消息是2百万条,而Producer-2只发送10W条消息。


网络分区并不会造成消息发送失败,而是可能引发消息分布不均衡


2.2 对消息消费的影响


在rocketmq中,消息队列的负载机制有很多,但基本都是得出topic的队列个数、当前活跃的消费者个数,然后根据负载算法(例如平均分配)。


如果消费者连接的都是同一个机房的nameserver,例如全部是网段-1中的nameserver-a,那broker-b、broker-c中的消息则无法被消费。因为路由信息中不包含broker-b、broker-c中的队列。


如果部分消费者连接nameserver-a、部分连接nameserver-b,则最终的效果是消费者也会产生分区效果:例如c1连接nameserver-a、c2、c3连接nameserver-b,则c1会消费broker-a中的消息,而c2,c3共同消费broker-b,broker-c的消息。


从这里可以看出,网络分区对消费端还是存在较大影响,但容易感知,并且在网络恢复后,消息并不会丢失。


3、架构思考


大家一定会问,RocketMQ的路由注册存在明显缺陷,为什么作为一个Apache顶级项目竟然会存在这样缺陷,是水平不够?


当然不是,这恰恰是一种架构权衡。


RocketMQ的Nameserver其设计理念是追求简单、高性能,关键是经过上面的分析,就算是出现不一致,所带来的并不是灾难级。


但换过来,如果采用诸如zookeeper这种追求强一致性框架,如果出现网络分区,严重的时候zookeeper并不能提供注册与路由寻址方式,会影响整个集群对外提供服务,严重违背分布式架构的高可用设计理念。


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
5月前
|
分布式计算 监控 网络协议
Hadoop集群长时间运行网络延迟原因
【6月更文挑战第20天】
139 2
|
10天前
|
人工智能 云计算 网络架构
阿里云引领智算集群网络架构的新一轮变革
11月8日~10日在江苏张家港召开的CCF ChinaNet(即中国网络大会)上,众多院士、教授和业界技术领袖齐聚一堂,畅谈网络未来的发展方向,聚焦智算集群网络的创新变革。
阿里云引领智算集群网络架构的新一轮变革
|
9天前
|
人工智能 运维 网络架构
阿里云引领智算集群网络架构的新一轮变革
11月8日至10日,CCF ChinaNet(中国网络大会)在江苏张家港召开,众多院士、教授和技术领袖共聚一堂,探讨网络未来发展方向。阿里云研发副总裁蔡德忠发表主题演讲,展望智算技术发展趋势,提出智算网络架构变革的新思路,发布高通量以太网协议和ENode+超节点系统规划,引起广泛关注。阿里云HPN7.0引领智算以太网生态蓬勃发展,成为业界标杆。未来,X10规模的智算集群将面临新的挑战,Ethernet将成为主流方案,推动Scale up与Scale out的融合架构,提升整体系统性能。
|
1月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
455 1
|
3月前
|
消息中间件 存储 负载均衡
|
3月前
|
消息中间件 存储 负载均衡
"RabbitMQ集群大揭秘!让你的消息传递系统秒变超级英雄,轻松应对亿级并发挑战!"
【8月更文挑战第24天】RabbitMQ是一款基于AMQP的开源消息中间件,以其高可靠性、扩展性和易用性闻名。面对高并发和大数据挑战时,可通过构建集群提升性能。本文深入探讨RabbitMQ集群配置、工作原理,并提供示例代码。集群由多个通过网络连接的节点组成,共享消息队列,确保高可用性和负载均衡。搭建集群需准备多台服务器,安装Erlang和RabbitMQ,并确保节点间通信顺畅。核心步骤包括配置.erlang.cookie文件、使用rabbitmqctl命令加入集群。消息发布至任一节点时,通过集群机制同步至其他节点;消费者可从任一节点获取消息。
46 2
|
3月前
|
负载均衡 算法 光互联
合理使用光互联产品减少万卡集群高性能网络中TOR交换机上行网络的ECMP哈希冲突
本文通过分析万卡集群高性能网络TOR层的ECMP哈希冲突,介绍如何通过使用有源光缆AOC和无源铜缆DAC分支线缆产品来减少ECMP哈希冲突的方法。
|
3月前
|
负载均衡 安全 网络虚拟化
CCE集群VPC网络模式下几种访问场景
【8月更文挑战第13天】在CCE(Cloud Container Engine)集群的VPC网络模式下,支持多样化的访问场景:容器应用可直接利用VPC访问外部资源;通过ELB负载均衡或VPN/专线配置,实现外部网络对容器应用的安全访问;容器间通过内部IP或服务发现机制相互通信;跨VPC访问则可通过VPC对等连接或云连接服务实现。这些方案确保了应用内外部通信的安全与高效。
102 3
|
3月前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
81 0
|
4月前
|
消息中间件 Prometheus 监控
消息队列 MQ使用问题之如何将旧集群的store目录迁移到新集群
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。