容易引起雪崩的两个处理

简介: 容易引起雪崩的两个处理

背景


先介绍标题《容易引起雪崩的两个处理》的第一个处理:慢查询。上周在测试环境遇到一个慢查询问题,虽然是测试环境,但是现象还是很让人担忧的:“在大量执行update操作”“已经执行1个多小时”“负载200多,基本上库都卡死了”。把库都要搞挂了,细思极恐啊。于是,这个事件处理的优先级即刻被升级为S级别,我们进行了点线面的梳理和分析。



现象分析


首先针对此问题做一个分析。慢查询的原因简单可以这么理解:公司创立之初写的代码,当时上线工期紧,做的比较糙(声明:不代表公司水平)。后台有个人工查询操作,这个操作要查询下游,下游是异步返回结果。所以是通过异步转同步实现的,使用了一张表,每次操作将历史记录标识位全部改成“已过期”,再将新结果插入到数据表中。“在大量执行update操作”指的就是批量更新标识位的操作。大概一次操作要更新几十万条,然后插入几条。一次更新要执行几十秒。


问题解决


当时同事提出要加索引解决,我第一个反应:最主要的字段只有两个值:“已过期”、“未过期”。对这种字段加索引是不是没什么用?结果实际测试结果是:不加这条索引十几秒执行完的查询和更新操作,加了索引只要几毫秒。


原理分析


这里主要分析三个问题。


1>为什么这条索引如此管用?


先说说为什么我第一反应觉得不管用,看看某乎上的神回复:


1112728-20211002101531703-790099193.png


先说为什么能提高查询速度。举个例子,假设表中有一千万条记录,状态字段有0和1两个值。某个状态为0的记录总数大概会有100条,那么你想查询状态为0的记录时,有没有索引影响非常大,而查询状态为1的记录,则索引基本无用。如果两种状态的记录数相差无几的话,索引也基本无用。所有的关于索引的文章,建议你不要为这种字段建索引的依据,都是以值分布是均匀为前提的。但如果值分布不均匀的时候,这个建议就不一定是正确的了。当我们需要查询的记录恰好是分布较少的记录的时候,值分布越是不均匀,索引就越有价值!那为什么能提高更新速度呢?


对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。听起来很慢,但是更新操作实际上是先select再update的过程,这里因为“未过期”数据条数很少,所以select效率高,然后更新是按照id进行更新,所以很快。


2>为什么慢查询会导致库卡死?


一般慢查询,特别是这样将历史记录标识位全部改成“已过期”的,必然会引起锁表。这个表的相关操作会受到影响是可以理解的,但是为什么会影响到整个数据库呢?这就涉及一个最基本的问题:资源竞争。慢查询和慢请求一个道理,长时间占用连接不释放、连接数是有限的,其他后到的请求要排队。


这个问题在生产环境相对好些,因为生产环境一般都会用物理机,而且数据盘至少是SSD的。测试环境资源差很多,所以问题会更明显。


3>负载200多是什么概念?


系统平均负载(load averages)是对当前CPU工作量的度量,被定义为特定时间间隔内运行队列中的平均线程数。可以通过top, htop, uptime这些命令找到它们.关于负载的含义,网上最广泛的示例,是通过桥梁的通过率来解释的。讲的真心好,所以直接「借鉴」过来,需要看原文的直接从参考引用处自行穿越。注意这里的比喻是基于单核CPU的。


系统负荷为0,意味着大桥上一辆车也没有

系统负荷为0.5,意味着大桥一半的路段有车

系统负荷为1.0,意味着大桥的所有路段都有车,但任然可以顺次通行

系统负荷为1.7,除了桥满之外,在桥的入口处还有70%的车辆在等待


系统负荷为200,除了桥满之外,在桥的入口处还有19900%的车辆在等待!不卡死才怪!

 

线


sql问题影响巨大,所以我们针对所有的数据表进行了梳理,排查隐患。

 


还需要梳理所有可能引起稳定性隐患的问题。这里就要引出标题《容易引起雪崩的两个处理》的第二个处理了:递归。


递归如果深度控制不好,会产生栈溢出,也就是StackOverflowError。溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。怎么改呢?要解决这个问题之前刷的leetcode技能就排上用场了。把递归算法转化为非递归算法有如下三种基本方法


1、对于尾递归和单向递归的算法,可以用循环结构的算法替代


2、自己用堆栈模拟运行时栈,分析只保存必须保存的信息(因而可小幅提高时间效率),从而用非递归算法替代递归算法。


3、利用堆栈保存参数,由于堆栈的后进先出特性吻合递归算法的执行过程,因而可以用非递归算法替代递

 

后记


89年有个电影版的《红楼梦》,演员阵容豪华让人咋舌。赵丽蓉演的刘姥姥、刘晓庆演的王熙凤、傅艺伟演的薛宝钗……。很小就觉得经典电视剧版的《红楼梦》里薛宝钗优雅端庄,颇有大家闺秀之风。看到了电影版《红楼梦》,特别是有个名场面:宝玉管宝姐姐要她随身挂在脖子上的金锁来看:电视剧版的宝姐姐金锁是挂在贴身内层的,当时宝姐姐是这样的:宝姐姐脸微红,转过身去解下金锁,又缓缓转过来身来,微微笑着给了宝玉。电影版的宝姐姐也是金锁是挂在贴身内层的,宝姐姐听宝玉问他要,她不假思索、干脆利落的解下来给了宝玉。我看到这里,心里的表情是这样的:


1112728-20211002101641892-285607446.png


这是哪里来的英姿飒爽的女侠走错了片场?


而在实际工作,我也经常会遇到类似的反差。咱们的每个软件设计和代码,周围的人,后来的人内心都自有评价。愿他们看到的是最好的我们。


相关文章
|
10月前
|
JSON JavaScript 数据可视化
可视化JSON数据工具推荐:JSON Viewer Pro和JSONGrid
本文介绍了两款可视化JSON数据的工具:JSON Viewer Pro和JSONGrid。它们都提供了丰富的功能和用户友好的界面,使用户能够更轻松地理解和处理JSON格式的数据。这些功能包括查看和分析、编辑和修改、格式化和美化、折叠和展开、高亮和搜索、排序和过滤、导入和导出等。这些工具对于开发人员、数据分析师和任何需要处理JSON的人都非常实用。
1608 0
|
5天前
|
SQL 容灾 关系型数据库
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布!
[版本更新] PolarDB-X V2.4 列存引擎开源正式发布
|
5天前
|
存储 关系型数据库 分布式数据库
数据管理的艺术:PolarDB开源版详评与实战部署策略(二)
PolarDB-PG是阿里云的一款云原生关系型数据库,100%兼容PostgreSQL,支持Oracle语法,采用Shared-Storage存储计算分离架构,提供极致弹性、毫秒级延迟的HTAP能力。具备高可用、高可靠和弹性扩展特性,支持单机、存储计算分离和X-Paxos三节点等多种部署形态。通过Docker可快速部署实例,包括单节点、一主一备和HTAP(一主两备)实例。此外,文章还介绍了在ECS上使用ESSD云盘搭建PolarDB-PG的详细步骤,适合开发和测试环境。
123272 14
|
5天前
|
运维 监控 Cloud Native
如何设计与构建 FinOps 流程、团队、体系与目标
企业 FinOps 实施不是一蹴而就的项目,如果您正在推进企业云原生 FinOps 落地,除了选择合适的技术手段,企业内部的流程和体系建设也尤为重要。
162808 12
|
5天前
|
分布式计算 Java API
Java8 Lambda实现源码解析
Java8的lambda应该大家都比较熟悉了,本文主要从源码层面探讨一下lambda的设计和实现。
162577 11
|
5天前
|
关系型数据库 Serverless 分布式数据库
PolarDB PostgreSQL版Serverless技术原理解读
数据库是现代企业IT系统中非常重要的一部分。在创建数据库时,客户往往需要比较保守地去配置数据库集群的资源,包括CPU、内存、存储以及连接数等多种参数配置,以确保业务能够在波峰和波谷都能平稳运行。在这种情况下,客户购买的集群资源在业务波谷时期会被闲置,导致整体成本偏高;而在业务压力增长阶段,集群资源又应对不足。Serverless数据库可以很好地解决这个问题。它能够让数据库集群资源随客户业务负载动态弹性扩缩,将客户从复杂的业务资源评估和运维工作中解放出来。 本文描述PolarDB PostgreSQL版Serverless的构建中, 如何实现弹得快、弹得准、弹得稳、弹得广的几个关键技术点。
75821 5
PolarDB PostgreSQL版Serverless技术原理解读
|
5天前
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
168499 2
|
5天前
|
存储 关系型数据库 MySQL
数据管理的艺术:PolarDB开源版详评与实战部署策略(一)
PolarDB-X是阿里巴巴自研的高性能云原生分布式数据库,基于共享存储的Shared-nothing架构,支持MySQL生态,具备金融级高可用、分布式水平扩展、HTAP混合负载等能力。它通过CN(计算节点)和DN(存储节点)实现计算与存储分离,保证数据强一致性,并支持全局二级索引和多主多写。PolarDB-X开源版提供更高程度的定制化和控制权,适合追求技术自主性和成本优化的开发者。部署方式包括RPM包、PXD工具和Kubernetes,其中PXD工具提供了一键部署的便利性。
96810 15
|
5天前
|
NoSQL MongoDB 数据库
国内唯一 阿里云荣膺MongoDB“2024年度DBaaS认证合作伙伴奖”
阿里云连续第五年斩获MongoDB合作伙伴奖项,也是唯一获此殊荣的中国云厂商。一起学习MongoDB副本集的选举机制以及可能会出现的特殊情况。
国内唯一 阿里云荣膺MongoDB“2024年度DBaaS认证合作伙伴奖”
|
5天前
|
SQL 大数据 BI
从离线到实时:无锡锡商银行基于 Apache Doris 的数据仓库演进实践
从离线到实时:无锡锡商银行基于 Apache Doris 的数据仓库演进实践