老司机经验分享:生产级中间件系统架构设计实践

news2024/12/30 2:51:31

目录

  • 1、Master-Slave架构
  • 2、异步日志持久化机制
  • 3、检查点机制:定时持久化全量数据
  • 4、引入检查点节点
  • 5、总结 & 思考

这篇文章,给大家来聊一个生产级的中间件系统的架构设计实践,希望给对中间件系统感兴趣的同学一点启发。


1、Master-Slave架构

这个中间件系统的本质是希望能够用分布式的方式来处理一些数据,但是具体的作用涉及到核心技术,所以这里不能直接说明。

但是他的核心思想,就是把数据分发到很多台机器上来处理,然后需要有一台机器来控制N多台机器的分布式处理,大概如下图所示。

在这里插入图片描述

那么既然是分布式的处理,就肯定涉及到在Master中要维护这个集群的一些核心元数据。

比如说数据的分发处理是如何调度的,处理的具体过程现在什么进度了,还有就是对集群里存放数据进行描述的一些核心元数据。

这些核心元数据肯定会不断的频繁的修改,大家此时可以想,无论你是基于外部的文件还是数据库,或者是zookeeper来存放这些元数据的话,其实都会导致他的元数据更新性能降低,因为要访问外部依赖。

何况这种复杂的元数据其实还不一定能通过zk或者数据库来存放,因为他可能是非格式化的。

所以这里一个核心的设计,就是将核心元数据直接存放在Master的内存里,这样可以保证高并发更新元数据的时候,他的性能是极高的,而且直接基于内存来提供对外的更新服务。

如果Master部署在高配置物理机上,比如32核128GB的那种,每秒支持10万+的请求都没问题。

在这里插入图片描述

2、异步日志持久化机制

但是这里有一个问题,假如说Master进程重启,或者是突然宕机了,那么内存里的数据不就丢失了么

对,所以针对这个问题,既然已经否决掉了基于外部存储来写入元数据,那么这里就可以采取异步持久化日志的机制,来通过异步化的方式把元数据的更新日志写入磁盘文件。

每次Master收到一个请求,在内存里更新元数据之后,就需要生成一条元数据的更新日志,把这个更新日志需要写入到一个内存缓冲里去。

然后等内存缓冲满了之后,由一个后台线程把这里的数据刷新到磁盘上去,如下图。

在这里插入图片描述

肯定会有人说,那如果一条更新日志刚写入缓冲区,结果Master宕机了,此时不是还是会丢失少量数据吗?因为还没来得及刷入磁盘。

没错啊,这个为了保证高并发请求都是由内存来处理的,你必须得用异步持久化磁盘的模式,所以必然要容忍极端宕机情况下,可能丢失比如几秒钟的数据。

那么如果是正常的Master重启呢?

那简单,必须先把日志缓冲区清空刷入磁盘,然后才能正常重启Master,保证数据都在磁盘上不会丢失。

接着重启的时候,从磁盘上读取更新日志,每一条都依次回访到内存里,恢复出来核心元数据即可。


3、检查点机制:定时持久化全量数据

但是这里又有一个问题了,那个磁盘上的日志文件越来越大,因为元数据不断的在更新,不断在产生最新的变更日志写入磁盘文件。

那么系统运行一段时间以后,每次重启都需要从磁盘读取历史全部日志,一条一条回放到内存来恢复核心元数据吗?

不可能,所以这里一定要配合引入检查点机制。

也就是说,每隔一段时间,就需要开启一个后台线程,把内存里的全部核心元数据序列化后写入磁盘上的元数据文件,作为这个时间的一个快照文件,同时清空掉日志文件,这个叫做检查点操作。

下次重启,只要把元数据文件读取出来直接反序列化后方入内存,然后把上次检查点之后的变更日志从日志文件里读出来回放到内存里,就可以恢复出来完整的元数据了。

这种方式,可以让Master重启很快,因为大部分数据都是在检查点写入的那个元数据文件里。

整个过程,如下图所示:

在这里插入图片描述

4、引入检查点节点

但是这个时候又有一个问题了。

大家可以想一下,Master内存里的元数据需要高并发的被人访问和修改,同时每隔一段时间还要检查点写入磁盘。

那么在检查点过程中,是不是需要把内存数据全部加锁,不允许别人修改

在加锁的时候,把不会变动的数据写入磁盘文件中,但是这个过程是很慢的,意味着此时别人高并发的写入操作都需要等待核心元数据的锁。

因为此时别人锁住了,你无法加锁去写数据进去,这会导致系统在几秒内出现卡顿无法响应请求的问题。

所以此时需要在架构设计里引入一个检查点节点,专门负责同步Master的变更日志。

然后在自己内存里维护一份一模一样的核心元数据,每隔一段时间由检查点节点来负责将内存数据写入磁盘,接着上传发送给Master。

这样做,就不需要Master自己执行检查点的时候对自己内存数据进行加锁了,如下图。

在这里插入图片描述

在这样的一个架构下,对Master来说,他只需要一个后台线程负责接收Checkpoint进程定时传送过来的元数据文件快照然后写入本地磁盘就可以了,完全规避掉了对自己内存元数据的锁冲突的问题。


5、总结 & 思考

总结一下这个架构设计,其实就是Master基于内存维护元数据,这样一台物理机可以支撑每秒10万+的高并发请求。

每次元数据出现更新,写一条日志到内存缓冲区,然后后台线程去刷新日志到日志文件里去,同时需要发送一条日志到Checkpoint节点去。

Checkpoint节点会在自己内存里维护一份一模一样的元数据,然后每隔一段时间执行checkpoint检查点写一份元数据文件快照。

接着上传给Master节点后清空掉他的日志文件。然后Master节点每次重启的时候直接读取本地元数据文件快照,加上回放上次checkpoint之后的日志即可。


这里可能大家会提几个问题,比如说Master节点突然宕机会如何

那很简单,直接影响就是他内存缓冲里的那些日志丢了,导致少量数据丢失,这个在我们的场景下可以容忍。

如果Checkpoint节点宕机怎么办

那不要紧,因为他之前上传过元数据文件的快照,所以对Master而言最多就是无法同步数据过去。

但是Master重启,还是可以读取最近一次的元数据快照,然后回放日志即可。

等Checkpoint节点恢复了,可以继续接着上一次同步日志,然后继续执行checkpoint操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/179990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java|golang】1663. 具有给定数值的最小字符串---int32切片类型转化string

小写字符 的 数值 是它在字母表中的位置(从 1 开始),因此 a 的数值为 1 ,b 的数值为 2 ,c 的数值为 3 ,以此类推。 字符串由若干小写字符组成,字符串的数值 为各字符的数值之和。例如&#xff…

修改VS2015的文件编码格式为utf8,解决在Ubuntu下中文输出为乱码的问题

开发环境: Windows系统:Windows 10 家庭版,VS2015社区版 Linux系统:Ubuntu 22.04 LTS Server版,gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04) 今天编写跨平台的代码,在Windows下用VS2015编写&a…

C++ AVL树

前言 众所周知红黑树是由AVL树改进得来的,想要深入学习哈希表的底层存储那么AVL的学习就相当有必要了。 本来想将AVL的插入删除都能实现,但是在写删除功能时碰到了难题和Bug,所以暂时先给出插入的实现过程,和删除功能的实现思路 …

【日常系列】LeetCode《29·动态规划4》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 字符串/数组dp问题 动态规划中的双状态问题 lc 139【top100】&#xff1a;单词拆分 https://leetcode.cn/problems/word-break/ 提示&#xff1a; 1 <…

Qt扫盲-QHttpPart类理论总结

QHttpPart类理论总结一、概述二、使用1. 设置头2. 设置内容一、概述 QHttpPart类保存一个主体部分&#xff0c;用于HTTP multipart MIME消息中(由QHttpMultiPart类表示)。 QHttpPart由一个头块和一个数据块组成&#xff0c;它们由两个连续的新行相互分隔。一个部分的例子是: …

智能合约开发——Sui/Move vs. Solana/Rust

1. 引言 前序博客有&#xff1a; zkMove——针对Move合约生态的zkVM 定位为高性能L1的Aptos和Sui&#xff0c;均采用Move合约编程语言。Solana也定位为高性能L1&#xff0c;但其采用Rust合约编程语言。本文重点对比Sui/Move和Solana/Rust合约编程语言。【Aptos/Move为不同的M…

三、Java框架之SpringMVC1_MVC基础

文章目录1. SpringMVC简介1.1 回顾Servlet技术1.2 SpringMVC入门案例步骤1&#xff1a;创建javaweb项目&#xff0c;并导入jar包步骤2&#xff1a;创建Controller步骤3&#xff1a;创建SpringMVC的配置文件步骤4&#xff1a;使用配置类替换web.xml步骤5&#xff1a;启动项目并访…

PyTorch深度学习实践第二讲线性模型

目录监督学习四步骤线性模型泛化代码作业监督学习四步骤 DataSet&#xff08;数据集&#xff09;Model&#xff08;模型选择和设计&#xff0c;例如神经网络&#xff0c;决策树等&#xff09;Training&#xff08;大部分模型都需要训练&#xff0c;都有些例如KNN不需要训练&am…

BFS(四)127. 单词接龙、433. 最小基因变化

目录 127. 单词接龙 433. 最小基因变化 127. 单词接龙 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&am…

Qt 6.x中Qt Quick简介及示例

Qt Quick首次在Qt 4.7和Qt Creator 2.1中引入&#xff0c;是一种高级UI技术。 Qt Quick模块是用于编写QML(Qt Meta-Object Language, Qt元对象语言)应用程序的标准库。Qt QML模块提供了QML引擎(engine)和语言基础设施&#xff0c;而Qt Quick模块提供了使用QML创建用户界面…

LCD timing的理解

前言 LCD的时序,之前也有介绍过(深入裸机),但是在介绍这些参数的时候是以感性的认识去理解的,而且多少有些错误,我们以内核文档中的描述为准(Documentation/fb/framebuffer.txt),在结合全志平台来重新正确的理解这些参数。 我们在看下文档中的解释: The frame buffe…

【学习笔记】智能合约引擎

图片来源&#xff1a;https://www.researchgate.net/publication/336453428_Detecting_nondeterministic_payment_bugs_in_Ethereum_smart_contracts/figures?lo1智能合约是区块链技术的核心。我们可以根据以下公式定义智能合约智能合约事务处理和保存机制完备的状态机智能合约…

【手写 Promise 源码】第一篇 - Promise 简介

一&#xff0c;前言 上一篇&#xff0c;完成了 Promise 源码学习的目录&#xff1b; 本篇&#xff0c;主要对 Promise 进行简单的概括介绍&#xff1b; 二&#xff0c;Promise 简介 Promise 是一个类或构造函数&#xff0c;是 JS 原生提供的&#xff0c;通过实例化 Promise …

【Java】还不懂this关键字?一分钟彻底弄懂this关键字

博主简介&#xff1a;努力学习的预备程序媛一枚~博主主页&#xff1a; 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】 前言 问题&#xff1a;为什么会存在this? 在上一篇【JavaSE】一文看懂构造器/构造方法&#xff08;Cunstructor&#xff09;中&#xff0c;我们已…

更方便Spring存储和读取对象,五大类注解、@Bean、@Autowired、@Resource

上一篇博客我们介绍了如何使用xml来引入bean对象&#xff0c;当项目多的时候&#xff0c;显然那样是比较麻烦的。现在我们只需要 个注解就可以替代了。注意&#xff1a;注解和xml可以同时使用准备工作:配置扫描路径我们需要配置 下存储对象的扫描包路径&#xff0c;只有被配置的…

利用Windows系统服务进行权限提升

提权是后渗透重要的一环节&#xff0c;如果当前获取的用户权限比较低&#xff0c;那么我们将无法访问受保护的系统资源或执行系统管理操作&#xff0c;影响后续的攻击过程。这要求我们通过各种手段将当前用户的权限进行提升&#xff0c;以满足后续攻击的要求。利用系统服务提权…

VUE2--22.11.23

VUE2一、Vue.js devtools二、Vue简介1、什么是Vue2、Vue的特性1.数据驱动视图2.双向数据绑定3.MVVM三、Vue的基本使用1、基本使用步骤四、Vue的指令与过滤器1、什么是指令2、内容渲染指令1.v-text2.{{}}3.v-html3、属性绑定指令4、事件绑定指令5、双向绑定指令6、条件渲染指令7…

【Linux】动静态库、文件的三个时间

1.文件的三个时间Access: 访问时间&#xff0c;访问的频率很高&#xff0c;所以较新的Linux都是按一定的时间间隔刷新Modify: 修改文件内容时间Change:修改文件属性时间&#xff0c;修改文件内容也会修改文件属性makefile自动编译判断文件是否为最新&#xff1a;就是按可执行程…

运动基元(一):Dubin‘s曲线【part3】

3.5 RLR RLR的第一段圆弧的曲率 k 1 = − k m a x < 0 → s i g n ( k 1 ) = − 1 k_1=-k_{max}<0\rightarrow si

Springboot图书馆图书借阅管理系统x1x74

目 录 1 概述 1 1.1课题背景及意义 1 1.2 国内外研究现状 1 1.3 本课题主要工作 2 2 系统开发环境 3 2.1 java简介 3 2.2 Mysql数据库 3 2.3 B/S结构 4 2.4 JSP技术介绍 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2操作…