1.前言介绍
2020年4月接手商品系统和团队,6月通过对商品数据库减少无效更新后,主从复制量减少约90%,增强了数据库主从复制的稳定高效性,也减少了下游系统订阅商品主数据的压力。
后面又发生了盘点系统调用商品主数据,大量的查询及其SQL语句大,商品数据库链接占满,造成了很严重的事故。快速处理后,也是惊出一身冷汗,感慨人生无常。冷静下来想起中学课文上讲的“父母之爱子、则为之计长远。”,负责系统又何尝不是要计长远。
2.分析思路
能否从生产环境获取到一段时间的查询语句,以及洞察这些查询语句背后的逻辑与规律,对分析的展开极为重要。从DBA处获取到五个一分钟生产从库的general log(由于生产环境,抓取时间短)。获取到约1G的压缩文件,包含146多万条SQL。根据SQL语句特征来做归类,归类的处理模型如下:
其中查询SQL 的特征如下:
约定:对于同一表,如果查询结果是同一类md5串,并且给定的查询条件的key串相同,认为是同一类SQL,即:通过什么查什么的模式。
3.维度分析
从查询角度出发,有以下维度值得分析:
3.1 同模式SQL
见上文约定:对于同一表,如果查询结果是同一类md5串,并且给定的查询条件的key串相同,那么我们认为是同一类SQL,即:通过什么查什么的查询范式。同一模式下SQL统计如下表:
可以发现:
通过parent_id和status字段 查询cm_categroy前台类目表,SQL量有50多万条,占到总查询量的34%。
XXcategory不同模式的查询统计量如下图:
设想把其数据抽到缓存中,预期能减少30%的数据库查询压力。
3.2大SQL
统计提交给数据库的SQL文本行数,统计如下表所示:
分析 SQL 大于500行的SQL
这7条提交给商品库的SQL行数大于1万行,具有相同的SQL查询模式,且都是在IN 语句包含的较多的元素。 检查相关业务逻辑,优化点包括:
1) 缩小IN 子查询大小;
2) 在IN 子元素对应的字段上增加索引,避免全表扫描等;
3.3大结果集
通过分析SQL语句,发现很多SQL 取用了表的所有字段,如图:
1.这条结果集中取用了:创建时间、修改时间等字段,这些字段是否是全部需要的?
2.是否能为下游系统提供更为细粒度的查询API等?
产生这样的原因是:在写mappe.xml文件时,用到 include模板方便快速开发,随着系统并发增高,若能提供更为细粒度的结果集,在减少网络传输等维度上能起到积少成多的效果。
3.4 重复SQL
根据3.1 部分的归类文件,在同一张表下,通过同一段 where key 串查询的SQL 称为同一类SQL。在同一类SQL下,如果提交的where 值完全一样,称之为重复SQL。 我们也发生过提交给数据库7万多条SQL,有6万多条是重复SQL。后续根据业务状况,看是否考虑缓存,以及是否有缓存击穿等情况。
4.其他引申
上面部分从数据查询维度分析,但到底要给系统塞什么功能、这些功能涉及的数据模型和业务逻辑模型是否恰当、这些功能应当定位在商品系统的哪些子应用中?团队能力搭配、故障应急能力建设等都是需要想明白、规划好并落实。
4.1 团队建设
做好梯队建设、人员备份与安全、培养和提升团队成员、鼓舞团队士气、建设好与公司匹配的研发团队气质等,管理有时要有意为之、存乎一心。 构建团队技术底层思维,比如:做分析要有数据基础、要有量的概念、要知道数据从哪里到哪里、写代码要知道代码运行环境,分布式、一致性等基础问题;
4.2 需求识别
当获取到需求,预先看清需求并用自己的方式过一次,并罗列出涉及数据模型(数据库字段、信息体、对象等) 以及业务模型、思考需求涉及到哪些子应用、需求使用场景等。想清楚后罗列出和产品要确认的问题,胸有成竹地去看开需求评审会。 判断需求合理性,是否涉及到负责系统的数据模型以及业务模型。需求识别,实战总结经验。比如:小组的专题讨论、并形成识别原则和结论。
4.3 流程优化
1.测试用例评审;
2.需求设计和实现 研发侧介绍;
3.三人组代码实现评审(包括SQL评审);
4.系统日志研发侧分析和总结等措施;
4.4 应急能力
商品系统日常机器和网络资源等,有运维同学负责,但系统本身业务逻辑、数据库的读写、消息队列、缓存的使用等研发同学最清楚。基于以上的逻辑,商品系统要做好保障和应急能力,使 系统:安全、稳定、高效运行。 做法包括:
1.日常补齐功能&涉及的数据 从哪到哪的问题罗列;
2.日常补齐功能是那些研发同学研发的,形成列表;(团队的人员备份与安全)
3.根据紧急程度、搭配不同的应急处理人员;一般的就相应的研发人员处理即可。紧急的搭配:问题处理人员、对外联络员、功能验证员等不同的角色担当。长期建设过程、加强应急和模拟演练等。
其他参考:
我原来写过的一篇:# 《# 每分钟54万多条数据更新,商品系统性能如何优化?》juejin.cn/post/706968…