当前位置: 首页 > news >正文

迁移到MySQL的架构演进(一)

这是学习笔记的第 2010 篇文章


  我们经过了一个相对漫长的周期把SQL Server业务迁移到了MySQL分布式架构,整个过程算是跌宕起伏。我来复现一下这个过程。

  迁移前,我们做了业务梳理,发现这个业务其实可以划分为两个大类,一个是数据业务,一个是账单业务。数据业务负责事务性数据,而账单业务是状态数据的操作历史。整体的系统现状梳理如下表10-4。

表10-4  数据业务与账单业务的对比


数据业务

账单业务

数据量

400G+

1024G+

数据特点

数据读写(插入,修改,查询)

数据写入为主(插入,查询)

数据属性

事务性数据

流水型数据

数据保留周期

物理备份保留周期1个月账单数据保留在2周以上

数据同步策略

数据业务通过调用存储过程生成账单数据

改造前架构如下图所示,对数据做了过滤,整体上库里面的表有上万张,虽然是多个独立的业务单元,但是状态数据和流水数据是彼此通过存储过程级联调用。

640?wx_fmt=png

对这样一个系统做整体的改造,存在大量存储过程,业务耦合度较高的情况下,要拆分为分布式架构是很困难的,主要体现在3个地方:

(1)研发和运维对于分布式架构的理解有限,认为要改造可行,但是改动量极大,基本会在做和不做之间摇摆。

(2)对于大家的常规理解来说,希望达到的效果是一种透明平移的状态,即原来的存储过程我们都无缝的平移过来,显然在MySQL分布式的架构下,这种方案是不可行的,而且如果硬着头皮做完,那么效果也肯定不好。

(3)对于分布式的理解,不是仅仅把业务拆开那么简答,我们始终要找到一个平衡点,不是所有业务都需要拆分做成分布式。分布式能带来好处,但是同时分布式也会带来维护的复杂成本。

所以对于架构的改进,我们为了能够落地,同时在这个过程中尽可能和研发团队保持架构的同步迭代,我们整体上走过了如下图所示的4个阶段。

640?wx_fmt=png

(1)功能阶段:梳理需求,对存储过程进行转义,适配MySQL方向 

(2)架构阶段: 对系统架构和业务架构进行改进设计,支持分布式扩展

(3)性能阶段: 对系统压力进行增量测试,全量测试,全面优化性能问题

(4)迁移阶段: 设计数据迁移方案,完成线上环境到MySQL分布式环境的迁移

我们主要讨论上面3个阶段,我总结为8个架构演进策略,我们逐个来说一下。

10.4.2  功能设计阶段

策略1:功能平移

对于一个已经运行稳定的商业数据库系统,如果要把它改造为基于MySQL分布式架构,很自然会存在一种距离感,这是一种重要不紧急的事情,而且从改进的步调来说,是很难一步到位的。所以我们在这里实行的是迭代的方案,如图所示。

640?wx_fmt=png

就如同大家开始预期的那样,既然里面有大量的存储过程逻辑,我们是不是把存储过程转义到MySQL里面就可以了呢。在没有做完这件事情之前,大家谁都不能做这个决定,况且MySQL单机的性能和商业数据库相比本身存在差距,在摇摆不定中,我们还是选择既有的思维来进行存储过程转义,

在初始阶段,这部分的时间投入会略大一些,在功能和调用方式上,我们需要做到这种适配,尽可能让应用层少改动或者不改动逻辑代码。

存储过程转义之后,我们的架构演进才算是走入了轨道,接下来我们要做的是系统拆分。

10.4.3  系统架构演进阶段

策略2:系统架构拆分

我们在之前做业务梳理达成的共识是:系统分为数据业务和账单业务,那么我们下一步的改造的目标也很明确了,一来数据库的存储容量太大,一个TB级别的MySQL库,存在上万张表,而且业务的请求极高,很明显单机存在着较大的风险,系统拆分是把原来的一个实例拆成两个实例,通过这种拆分就能够强行把存储过程的依赖解耦。而拆分的核心思路是对于账单数据的写入从实时转为异步,这样对于前端的响应就会更加高效。

拆分后的架构如下图所示。

640?wx_fmt=png

当然拆分后,新的问题出现了,账单业务的写入量按照规划是很高的,无论从单机的写入性能和存储容量都难以扩展,所以我们需要想出新的解决方案。

策略3:写入水平扩展

账单数据从业务模型上属于流水型数据,不存在事务,所以我们的改进就是把账单业务的存储过程转变为insert语句,在转换之后,我们把账单数据库改造为基于中间件的分布式架构,这个过程对于应用同学来说是透明的,因为它的调用方式依然是SQL。

同时因为之前的账单数据有大量的表,数据分布参差不齐,表结构都相同,所以我们也借此机会把数据入口做了统一,根据业务模型梳理了几个固定的数据入口。这样一来,对于应用来说,数据写入方式更简单,更清晰了,改造后的架构如下图

640?wx_fmt=png

这个改造对于应用同学的收益是很大的,因为这个架构改造让他们直接感受到不用修改任何逻辑和代码,数据库层就能够快速实现存储容量和性能的水平扩展。

账单的改进暂时告一段落,我们开始聚焦于数据业务,发现这部分的读请求非常高,读写比例可以达到8:1左右,我们继续开始架构的改进。

640?

相关文章:

  • K-Means算法原理和简单测试
  • 如何让你的工作能够大量输出
  • 数据生命周期管理的初步实现
  • MySQL分布式高可用的一个补充
  • MySQL锁
  • 难忘的三件苦差事
  • 千与千寻,真是一部给大人看的动画片
  • 聊聊高考分数线和选择
  • MySQL中间件的连接错误问题排查
  • 一次宕机问题的总结复盘
  • 所谓简单的事情
  • 数据分析上千部动漫作品
  • 生活中的一些文字调料
  • 最近的方向调整
  • 尴尬的bug:一条查询语句让MySQL崩溃
  • [译]前端离线指南(上)
  • Apache Zeppelin在Apache Trafodion上的可视化
  • css选择器
  • Git学习与使用心得(1)—— 初始化
  • Javascript弹出层-初探
  • js面向对象
  • MySQL主从复制读写分离及奇怪的问题
  • Solarized Scheme
  • 分布式事物理论与实践
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 你真的知道 == 和 equals 的区别吗?
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 入口文件开始,分析Vue源码实现
  • 实习面试笔记
  • 算法-插入排序
  • 我与Jetbrains的这些年
  • 在Unity中实现一个简单的消息管理器
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #define与typedef区别
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (c语言)strcpy函数用法
  • (C语言)共用体union的用法举例
  • (javascript)再说document.body.scrollTop的使用问题
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二)pulsar安装在独立的docker中,python测试
  • (十一)手动添加用户和文件的特殊权限
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .Net IOC框架入门之一 Unity
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 流——流的类型体系简单介绍
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net和jar包windows服务部署
  • /etc/fstab 只读无法修改的解决办法
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @ModelAttribute注解使用
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ABC294Ex] K-Coloring