从 0 到 1 搭建技术中台之 SQL 审核平台

2020 年 8 月 01 日

从 0 到 1 搭建技术中台之 SQL 审核平台

自去年开始,中台话题的热度不减,很多公司都投入到中台的建设中,从战略制定、组织架构调整、协作方式变动到技术落地实践,每个环节都可能出现各种各样的问题。技术中台最坏的状况是技术能力太差,不能支撑业务的发展,其次是技术脱离业务,不能服务业务的发展。前者是能力问题,后者是意识问题。在本专题中,伴鱼技术团队分享了从 0 到 1 搭建技术中台的过程及心得。


背景


随着伴鱼业务的快速发展,公司各产品线的业务不断丰富,日常的 SQL 上线也在不断增加。 SQL 审核与执行,作为 DBA 每天工作中相当重要的一环,如何保证 SQL 语句的质量,对于系统的高效运行和长久稳定有着很大的影响。


本文在对开源 SQL 审核平台(例如 Yearning、See 和 Archery 等)进行调研,并结合 DBA 在 SQL 上线实践经验的基础上,设计了伴鱼 SQL 审核平台。相比其它 SQL 审核平台,新系统主要包括以下核心功能:


  • 基于 TiDB Parse 做 SQL 语法解析,践行 SQL 规范

  • 基于公司组织架构做权限管理和流程审核

  • 基于审核规则列表的动态开关

  • 支持 SQL 执行数据备份和回滚

  • 支持任务定时调度执行


下面从整体架构、流程设计等方面详细介绍下伴鱼 SQL 审核平台以及设计背后的一些思考。


整体架构


SQL 审核架构,如下图所示,主要包括 web 前端、 SQL 审核后端和数据存储 TiDB。



流程设计


SQL 语句的质量对于系统的稳定高效运行有很大影响,因此 SQL 审核平台必须加强语句质量的审核。其次, SQL 审核平台在确保数据库平稳运行的同时,尽量提高上线的效率。


规则设计


通过系统约束是践行数据库规范最有效的手段。 SQL 审核规则除了加入业界认可的规则外,我们还根据日常 SQL 上线暴露的一些风险场景,加入我们设计的一些规则。 SQL 审核部分规则列表,如下图所示。



数据的删改关系到数据安全和 SQL 性能,其中 SQL 性能关系到线上服务的稳定性。这里简单介绍下“删改数据规则”,主要包括以下三条规则:


  • 删改数据索引不完全匹配

  • 删改数据影响行数超过 100

  • 影响行数超过 3000


下面对这 3 条规则进行解释:


  • 日常数据修改,大多数场景只涉及少部分数据修改,所以只要完全走索引,性能基本没问题。如果系统检测到语句条件与线上索引不完全匹配,检测结果就会不通过。

  • 在某些特殊场景下,索引完全匹配,但数据影响的实际行数可能较多(大于配置影响行数 100),这样检测结果也是不通过。

  • 当然在表数据量不大(万级别以内)和索引没法覆盖等极少数场景下,可以通过关闭 1、2 两条规则,同时满足3这条规则的前提下,检测通过。


规则这样配置,一方面系统根据语句条件备份时,保证了快速高效;其次,数据执行权限已经下放给业务负责人,系统尽可能保证 SQL 的执行性能。


任务设计


业务 app 大版本上线,涉及 SQL 上线条数众多,在任务设计上主要做了如下几点考虑:


  • 通常业务大版本上线,涉及多个业务线,所以 SQL 任务必须支持多库多表

  • SQL 任务通常包括建表、改表和增删改数据三种类型,每种任务需要区别对待,比如建表不会锁表,但需要关注表的索引;改表需要关注数据大小,任务最好不要在业务高峰期执行;增删改数据需要在执行前对数据进行备份,保证数据安全。


基于以上两点要求和任务提交的易用性,我们设计了任务检测页面,如下图所示。



其中,对于建表选项,我们要求每个输入框只输入一条建表语句,并备注每个表的查询和更新,这样设计的原因是符合 DBA 审核习惯,方便 DBA 审核索引好坏。


任务检测


研发提交 SQL 任务检测后,后台基于 SQL 审核规则,对语句进行语法和规则进行检查,并将检测结果反馈给研发。在任务检测结果页,从易用性角度做了如下几点考虑:


  • 提交检测的 SQL 众多,如果其中某些 SQL 不满足要求,需要支持在检测结果页直接修改并立即检测,不需要重新编辑所有任务再次提交

  • 改表(除加索引操作外)只修改元数据,不需要拷贝数据,影响行数为 0,形象的“代表”执行速度很快

  • 删改数据,我们需要将数据真正影响的行数展示给研发,让他们看到实际操作的数据条数,形象的“告诉”数据操作是否符合目标


检测结果页,如下图所示。



其中:


  • 修改数据条件与索引不匹配,检测状态为失败;

  • 增加索引,需要拷贝全表数据,影响行数为表总条数;

  • 增加字段和数据类型加大,只涉及修改元数据,影响行数为 0;

  • 第 4 条更新语句,满足删改规则,检测状态通过;

  • 整个任务单,有条语句未通过,只需要修改该条语句满足审核规则,整个任务单才才可以提交审核,进入下一步流程。


任务审核


任务审核角色有 2 个,一级审核为业务负责人,负责审核任务提交同学的 SQL 质量,二级审核为 DBA ,进一步审核和提高 SQL 质量。审核流程,如下图所示。



目前,任务审核流程如下:


  • 对于增删改数据操作,审核规则已经保证 SQL 性能和数据备份,审核和执行权限下放给一级审核人

  • 对于建表, DBA 关注表的索引好坏问题,审核和执行权限由 DBA 负责

  • 对于改表,涉及添加索引操作,需要关注语句的性能,审核和执行权限由 DBA 负责


任务执行


任务执行阶段,主要考虑 2 个问题,包括大表添加索引可能导致的性能问题和数据删改可能导致的数据误操作问题。针对这 2 个问题,我们采取的措施如下:


  • 定时调度,大表加索引操作,可以设置调度时间,调度到业务低峰期执行

  • 数据备份,对于删改数据操作,在真正执行前,会根据语句条件,对数据进行备份


任务待执行列表,如下图所示。任务如果设置了定时调度,后台调度到该设置的时间点执行,当然待调度的任务也可以修改调度时间或者人工调度立即执行。



任务历史


任务历史主要保存 SQL 语句操作记录,便于审计。同时对于删改操作,任务历史提供数据回滚入口,如下图所示。



总结及规划


目前,伴鱼 SQL 审核平台简化了 DBA 的工作,提高了研发 SQL 上线效率和研发使用数据库的水平。系统已稳定运行近半年时间,审核规则也不断完善,更加契合公司内部场景。未来,我们有以下几点需要完善:


  • 建表,目前小表采用自增主键,大表主键依赖公司分布式 id 生成器,后续版本升级到 4.0,小表主键可以使用TiDB自带 auto_random 方式生成

  • 建表,索引的好坏,还需要 DBA 人工平台审核。在没有有效的方式阻止引入性能较差的 SQL 到线上前,目前还不打算将执行权限下放给业务负责人。后续将对这块继续进行研究,争取做到自动化。


预告: 伴鱼的 SQL 审核平台正在进行开源准备,希望能对有同样需求的同行们提供一点点帮助。


相关链接:


《从0到1搭建技术中台实践全解》


2020 年 8 月 01 日 10:018188

评论 16 条评论

发布
用户头像
都支持哪些数据库?支持导入SQL文件吗?
2020 年 08 月 10 日 15:19
回复
支持MySQL协议的数据库都可以;有批量审核的功能
2020 年 08 月 11 日 16:34
回复
用户头像
期待开源!!!
2020 年 08 月 08 日 23:05
回复
用户头像
我想说,阿里云的dms都帮你实现了。。可以省精力去搞业务了
2020 年 08 月 02 日 23:57
回复
一般公司的发展,有可能会经历单云,到多云,到多云+自建的混合云,单云的时候,确实没有问题,到后面为了统一操作入口,自己做一个是很有必要的
2020 年 08 月 03 日 09:58
回复
2020 年 08 月 08 日 22:32
回复
自研还有其他方面的好处:1、公司内部的系统可以直接打通,形成合力,运维会更高效,比如数据库元信息系统 和SQL 审核平台、服务治理等都是打通的,一个处修改,所有依赖都会生效;SQL 审核平台和内部的组织架构也是打通的,权限的审核依据组织架构可以找到相关负责人来审核;2、内部平台统一风格和体验,研发使用更高效;3、可以定制功能等等。这些地方的效率优化在公司越大的时候,效果越好,各个阶段有各个阶段的选择吧
2020 年 08 月 08 日 22:58
回复
查看更多回复
用户头像
期待开源
2020 年 08 月 02 日 19:48
回复
用户头像
的监控福建省非金属
2020 年 08 月 02 日 16:44
回复
的少年锦时
2020 年 08 月 02 日 16:44
回复
用户头像
还记得繁花似锦耗费时间
2020 年 08 月 02 日 16:44
回复
用户头像
期待开源👍
2020 年 08 月 01 日 18:05
回复
快了,应该1-2个月的时间
2020 年 08 月 01 日 20:16
回复
开源没,给个链接呢
2020 年 11 月 09 日 20:45
回复
没有更多评论了
发现更多内容

消息队列Kafka - acks参数

Java收录阁

kafka

InfoQ写作平台首秀,来个自我介绍

nuhcoad

个人感想

Arthas安装及基本用法

编程随想曲

Java

浅析 Cocoapods-Packager 实现

Edmond

ruby ios CocoaPods binary packager

南丁格尔科普

Sicolas Flamel

多云的一点思考

HU

MySQL中order by语句的实现原理以及优化手段

天堂

Java MySQL 性能优化

我愿沉迷于学习,无法自拔(一)

孙瑜

深度思考 个人成长

Netty 源码解析(四): Netty 的 ChannelPipeline

猿灯塔

Java并发编程系列——锁

孙苏勇

Java Java并发 并发编程 多线程

经济大萧条对我的启示

Neco.W

创业 自我管理 职场 自我提升

使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源

mzlogin

CDN Jekyll GitHub Pages 个人博客

说出来就不灵啦

伯薇

糊涂 活在当下 享受状态 生活状态 观察者

韦小宝真的幸福吗 | Random Forest

张利东

Python 学习

MySQL的死锁系列- 锁的类型以及加锁原理

程序员历小冰

MySQL

阿里巴巴Java开发手册泰山版解读

Bruce Duan

神经网络的激活函数为什么要使用非线性函数

王坤祥

神经网络 激活函数

如何优雅滴在手机上跑Python代码

王坤祥

Python 移动应用 手机编程

学习来应对创业的未知

Neco.W

创业 重新理解创业

为什么正在使用的Java版本跟环境变量的版本不一致

阡陌r

Java 踩坑

Day 47|Week 07-5 曾国藩家书|问学篇-学问何处何时都可做

熊小北同学

怎样算是一个好的开发者?

水滴

开发者

DDD 实践手册(2. 实现分层架构)

Joshua

设计模式 领域驱动设计 DDD 系统架构 分层架构

死磕Java并发编程(7):读写锁 ReentrantReadWriteLock 源码解析

七哥爱编程

Java并发 读写锁 ReentrantReadWriteLock

如何写作一本书(2):前言与正文

英子编辑

技术 写作

“我代码写完了,QA可以测了。”

蔡建斌

Scrum 敏捷 质量管理 测试

和邓小平、基辛格“谈笑风生”的世界第一女记者:奥琳亚娜·法拉奇

赵新龙

记者 编辑 采访 法拉奇

下一代存储NVMe over Fabrics

HU

你真的理解 Java 的基础数据类型吗

Rayjun

Java

把成功过成自己的生活

子铭

成功学 生活状态

从数据闭环谈微服务拆分

松花皮蛋me

微服务架构 微服务拆分 微服务冶理

从 0 到 1 搭建技术中台之 SQL 审核平台-InfoQ