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

2023-05-16

目录

  • 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操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Linux之线程-信号量sem_*

    1 概念 信号量可理解为进化版的互斥锁 量 xff0c 允许多个线程访问共享资源 由于互斥锁的力度比较大 xff0c 如果希望在多个线程间对某一对象的部分数据进行共享 xff0c 使用互斥锁是没有办法实现的 xff0c 只能将整个数据对象锁
  • 4、树(中篇)

    前言 前节二叉树只能适用于静态查找 不能实现动态插入 删除等 如何解决以下两个问题 静态查找与动态查找 针对动态查找 数据如何组织 4 1 二叉搜索树 4 1 1 什么是二叉搜索树 二叉搜索树 BST Binary Search Tree
  • SNMP源码分析

    源码下载 http www net snmp org download html 源码目录结构 net snmp程序逻辑 xff08 1 xff09 main主函数 span class token macro property span
  • SNMP Trap的session问题

    1 前言 最近遇到了个问题 xff0c SNMPv3 Trap上报 xff0c 在snmp agent侧修改了用户密码 xff0c 管理站mibbroswer上没有修改trap用户的密码 xff0c 仍然可接收到trap上报消息 通过Wir
  • Rancher RKE K8s 集群 etcd 恢复

    背景 在 Rancher 中基于 RKE 创建的 K8s 集群 xff0c 因为服务器磁盘故障 xff0c 导致 3个 master 节点有2个节点的 etcd 数据文件损坏 xff0c 导致整个集群不可用 etcd 三个节点集群时 xff
  • PIXHAWK飞控固件及代码基础介绍

    PIXHAWK飞控 xff1a 固件 xff1a 开源固件PIXHAWK 软件 xff1a 两套固件代码 xff08 1 xff09 原生固件代码PIX4 xff0c 地面站采用QGC xff08 界面比较合理清晰 xff0c 易做修改 x
  • GAAS 无人机自动驾驶学习(01-使用机载电脑,通过OFFBOARD模式进行控制飞行)

    原文网址 xff1a https gaas gitbook io guide wu ren ji zi dong jia shi xi lie offboard kong zhi yi ji gazebo fang zhen 介绍 xff1
  • 2020-10-30

    Ubuntu nvidia显卡驱动安装 手动安装 xff1a 先在官网下载本机显卡对应支持的驱动 xff0c 一般选择run文件 xff1b 如果开启了nouveau驱动 xff0c 需要禁用 xff1b 进入tyy3命令行窗口 xff0c
  • Baxer双臂机器人Ubuntu20.04+ROS noetic开发环境配置

    目录 前言 一 新建ROS工程及初始化编译 二 在Baxter的工作空间对setup bash文件进行source 编辑 三 安装Baxter SDK 四 测试 编辑 总结 前言 Baxter simulator由ReThink Robot
  • Baxter的Gazebo仿真环境搭建

    注 xff1a 这是一篇配置失败的文章 xff0c 原因是Ubuntu20 04不支持Qt4 xff0c catkin make通不过 xff0c 不是20 04的可以尝试一下 xff0c 或者有大神能不能帮忙看下在ubuntu20 04装
  • Ubuntu20.04+ROS noetic安装Universal Robot包

    先装一下国内的rosdepc sudo pip install rosdepc sudo rosdepc init rosdepc update 安装ros插件 xff1a rosdep install from paths src ign
  • ROS编译(catkin_make):Unable to find either executable ‘empy‘ or Python module ‘em‘ 错误解决

    CMake Error at opt ros noetic share catkin cmake empy cmake 30 message Unable to find either executable 39 empy 39 or Py
  • roscore出现import yaml错误解决

    问题描述 xff1a 本机使用的ROS是基于python2 7的 xff0c 运行roscore时 xff0c 会自动调用python3下面的库文件 xff0c 导致源码调用时出现冲突 xff0c ERROR显示了出错代码的路径 1 定位到
  • fatal: unable to access ‘https://github.com/ros-industrial/universal_robot.git/‘: Failed to connect

    解决 xff1a 将https改为git
  • keil5编译程序出错:runtime error R6002 -floating point support not loaded

    本想使用JTAG仿真器 43 Keil5试一下在线调试和下载程序 xff08 之前一直使用USB串口下载 xff09 xff0c 然后再编译时发现报错 xff0c 无法找到相应的下载文件 axf xff08 类似于无法生成一个下载到板子里面
  • 修改 docker 容器的启动参数等信息

    背景 docker 容器在之前启动时 xff0c 指定了 cmd 启动参数和挂载目录等配置 后来因为业务需要 xff0c 需要变更启动参数或挂载目录等信息 处理方法 1 停止所有 docker 容器 span class token fun
  • Java 并发高频面试题:聊聊你对 AQS 的理解?

    一 写在前面 这篇文章 xff0c 我们来聊聊面试时一个比较有杀伤力的问题 xff1a 聊聊你对AQS的理解 xff1f 之前有同学反馈 xff0c 去互联网公司面试 xff0c 面试官聊到并发时就问到了这个问题 当时那位同学内心估计受到了
  • 自从上了Prometheus,睡觉真香!

    文章来源 xff1a https c1n cn ojbYT 目录 学习目标任务背景任务要求任务分析Prometheus 实战 学习目标 如下 xff1a 能够安装 prometheus 服务器能够通过安装 node exporter 监控远
  • 面试官问我有没有高并发架构经验,我慌的一批…

    目录 一 1 道面试题的背景引入二 先考虑一个最简单的系统架构三 系统集群化部署四 数据库分库分表 43 读写分离五 缓存集群引入六 引入消息中间件集群七 现在能hold住高并发面试题了吗八 本文能带给你什么启发 xff1f 一 的背景引入
  • 我只是把握好了这3点,1个月后成功拿下大厂offer!

    目录 一 写在前面二 技术广度的快速准备三 技术深度的快速准备四 基础功底的快速准备五 下篇预告 一 写在前面 春节过后 xff0c 即将迎来的是一年一度的金三银四跳槽季 假如你准备在金三银四跳槽的话 xff0c 那么作为一个Java工程师

随机推荐