MySQL 高并发场景实战|学习笔记(一)

简介: 快速学习 MySQL 高并发场景实战

开发者学堂课程【MySQL 实战进阶MySQL 高并发场景实战】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/83/detail/1306


MySQL 高并发场景实战

 

内容介绍

一.问题和挑战

二.系统调优

三.架构调优

四.实例调优

五.内核调优

六.监控报警

七.流程管理和生态工具

八.总结

 

一.问题和挑战

阿里巴巴 CEO 逍遥子说“双11是商业界的奥林匹克”

image.png

11开始于2009年,如图,双11期间,订单创建数,支付笔数和交易总额几乎逐年翻倍。随着这些数据的增长,双11在提供给商业界大量机会的同时,对于后端的技术、架构等各个模块也是比较好的技术的沉淀。

1.洪峰般地并发

image.png

如图所示,在0点的高峰,无论是系统的访问量还是数据库的访问量呈现接近90度上升趋势,在如此大的访问流量下,所有的核心链路的增删改查都是在数据库上操作,对应用和数据库都有比较大的冲击,

比如,复杂事务、链接数、锁竞争、线程调度等各个模块。

如果有复杂 SQL 或大事务的活还可能导致系统资源耗尽,整个数据库服务不可用,进而导致大促受到影响,甚至失败。比如:下单失败、网页无法打开、无法支付等。此外此类场景也会发生在在线教育、直播电商、在线协同办公等。

2.热点行更新

在大促的时候会有热点商品的售卖,而这些商品在数据库中只是一行记录,当单线程去更新一行记录时,性能非常高,但是当非常多的线程去并发更新一行记录时,整个数据库的性能会跌到趋近于零。在数据库中,由行锁来控制并发,在有非常多的竞争时,行锁的竞争十分激烈,并发越高,数据库的性能跌得越明显。

3.突发 SQL 访问

当缓存穿透或异常调用、有数据倾斜 SQL 、未创建索引 SQL 等情况发生时,在高并发场景下很容易导致数据库压力过大,响应过慢,导致应用链接释放慢,导致整个系统出现雪崩效应。

4.智能化运维

双十一期间有很多的实例,这些实例的水位管控,机器水位管控,高风险实例优化,在流量高峰期从收到警报、识别问题等,如果用人肉观察,从接受到报警到识别问题、诊断问题、解决问题至少需要十多分钟,足以在高并发的场景下给整个运维带来比较大的挑战。此外,我们结合一五场景以及商品畅卖的问题,以及技术设施的挑战等。

 

二.系统调优

针对以上问题,我们做出系统调优

1.容量评估

经验评估:预估压力/单机性能=服务器数量;应用机器设置、数据库设置等。

根据服务器数量以及应用机器的数量可以得出整个数据库的链接池的设置以及要扩充多少个实例、扩充多少台机器等,这些相应的配置也会出来。

通过经验的预估,也是一个预估值,能否支撑双十一的容量还是一个未知数,所以我们需要针对上述的预估做一个判断、验证。我们是通过压测来完成的。因为现在是分布式的系统,容量评估后,我们需要针对单个实例、单个应用单元以及单个应用模块来进行压测,所以需要单元压测。

单元压测

验证单元内容量;验证单个系统容量。单元压测主要是完成单元内的验证,因为现在整个的架构很多是异地多国,不仅要验证双十一内的容量,还要验证单元内的容量是否充足,以及单个系统的容量,比如压测某个模块、交易模块等,这个容量是否是充足的。每个应用模块验证完了之后,我们还需要对整个链路来进行压测,即全链路压测。

全链路压测

场景化压测;解决分布式系统容量评估。它是基于仿真化的测试,是最接近业务的系统值的。借助全链路压测,我们可以验证整个分布式系统的容量是否是充足的。

2.  性能评测

image.png

压测目的:发现基础设施的瓶颈、中间件瓶颈、系统容量瓶颈;发现分布式系统短板。

压测用途:保障大促容量充足,保障业务正常运转;保障核心功能、保证用户体验;评估大促成本(人工成本、机器成本以及整个运维保障的成本)。在前几年,我们的 slogan (标语)是,让用户买物品的时候,如丝般顺滑。

难点:真实业务场景压测;真实 SQL 模拟。

无压测不调优,压测十分重要。压测可分为基准测试和仿真测试。

基准测试:对于 MySQL 来说,我们可以用 sysbench 或者 mysqlslap 等。在官网上也有基于通用场景的测试,每一个实例所能达到的容量。在不同的业务场景下,它所能达到的容量是不同的。基准测试的场景相对比较简单,通过基本测试,我们可以预估实例在基准测试的情况下,所能达到的容量的最大值、极限值。通常情况下,真实的业务场景不太可能会超过基准测试的值。针对每一个实例,它所能达到的瓶颈,我们要做到心中有数。

 image.png

真实的业务场景往往比基准测试的场景要复杂得多。阿里在双十一的场景下是如何进行基准测试的,其整个过程可以分为四个步骤。

第一步:首先,针对基准涉及到的业务模块来进行梳理,相应的也会梳理技术架构的模块,以及我们的容量预估是否是充足的。

第二步:梳理完之后,我们就需要制造数据,准备服务器、压测流量、业务请求。

第三步:正式进入压测的阶段。通过压测,我们可以发现短板,验证我们的容量是否是充足的,验证预案,比如我们想验证,在某个压力场景下降级某个预案会给系统减少多少的压力,这就可以在压测的阶段来验证完成。

验证压测执行完之后,我们需要根据发现的短板压测问题,架构的问题来进行针对性的优化,这个过程需要很多轮的压测。

阿里巴巴集团及各 BU 每年压测4000+次。13年全链路发现700+问题,14年发现500+问题,15年发现400+问题。每一年都能发现几百个以前压测没有发现的问题,所以,全链路压测已经成为双十一必备阶段,是准备大促的核武器。

3.性能测评工具

PTSPerformance Testing Service

是面向所有技术背景人员的云化测试工具,可以理解为全链路压测工具。它是基于业务端发起,梳理完业务压测模块之后,进行构件请求。可以结合自己的实际的业务场景来随时发起,免去繁琐的搭建和维护成本,进而发现线上业务的短板以及需要优化的模块,来保证大促顺利进行。此外,如果想要单独压测 DB 的性能瓶颈,因为基于真实的业务此工具模拟还是比较难的。

DAS可以充分利用在采集以往真实的业务数据来进行到另外一个实例上回放,这是基于真实的场景的回放·,可以指定压力来验证单个实例的数据库的容量,比如翻6倍、10这样,是否能支撑地住系统的压力,为即将到来的短期业务高峰来做一个短期的准备。在这种情况下,应用不需要配合,由 DBA 或者运维人员来完成对 DB 的容量的压力的评估。或者,在业务上新之前验证 ADS 的规格是否能满足业务的需求。所以, DAS 可以很好地帮助我们基于真实业务来完成线上容量的压测。

4.性能评测需要注意什么

参数 RDS 参数对齐。如果要对比一两个参数在打开和关闭之后,以及设置不同的值对性能的影响,可以单独地做测试。一旦测试出来最优值,在压测之前,最好将参数调到最优值,不要在压测出现问题之后调参数。

网络:从压测机到 RDS 的网络延迟。一般情况下,购买实例时候, DAS RDS 是在同一个 VDC内的。但是不排除,有的用户用线下的机器来连接本地的数据库,用本地的应用机器来连接 RDS 来进行对比,这是不合适的,因为压测机的 RDS 网络延迟和到本地数据库的延迟差异很大。

规格RDS 规格对齐;不同规格 RDS 的性能差别比较大,如果想要测试 CPU 的性能,物理 IO 要少,数据量要小于内存大小。但是,对于大多数业务场景来说,都是涉及到物理 IO 的,实际业务场景都不是全内存操作,即数据量大于内存大小。

ESC 的网络带宽:阿里云的 ESC 是限制带宽的,如果想 ESC 带宽不受限制,需要购买比较大的网络带宽。以往有用户在做测试时, RDS 的资源没有弄满,压力无法提高,后来经过定位发现 ECS 的带宽打满了。所以,在准备压测的环境的时候,要把这些内容整理好。

 

三.架构调优

如果业务的访问都用数据库来支撑的话,成本太高。

缓存可以代替一部分关系性数据库在读方面的请求。此外,基于原理的设计以及成本方面的考虑,缓存的性能优于关系性数据库,而且·性价比更高。如果读多写少,针对于单个实例很难支撑,还可以借助于只读实例,它可以实现在线弹性地扩展读能力,读的业务请求可以实现隔离,比如,可以把清量分析型的以及吞数据型的在只读实例内完成。此外,每一个只读实例都有一个单独的链接地址,如果想要把某一类的业务和其他业务区分开、严格的隔离,比如,想要让托数据这一类的场景或者是某一类的只读的场景,它指到某一个实例上面访问的话,就可以单独地链接那一个只读实例的链接串。如果想要从整个的层面来控制主实例和只读实例的访问,就可以借助于负载均衡多项代理来完成,多项代理可以缓解大量的短链接的场景,使用代理后,就不用反复地变更应用内的链接地址,减少维护成本。使用多项代理之后,可以实现线上资源的扩展、承受更高的流量。如果是 RDS 的实例规格以及只读实例都已经升到最大,但仍然不能支撑业务的发展,

可以通过考虑升级 RDS ,来完成读写容量的扩展。

对于只读实例,大部分人最关心的问题就是主实例和只读实例的数据一致性,比如延迟以及中断这一类的场景,延迟是最常见的。

1.怎样降低只读实例和主实例的延迟

l  主实例的 DDL

40%,如 alterdrop 、修改表、回收表空间等,需要 kill DDL 语句或用 DMS 的无锁变更等。

l  主实例的大事务

20%,如大批量导入、删除、更新数据,都会产生大量的 binlog ,根据以往的经验,一个 binlog 最多有几十个 G MySQL binlog 是在主实例完成之后才传到只读实例上,因此会产生延迟,需要将大事务拆分成为小事务进行批量提交,这样只读节点就可以迅速的完成事务的执行,不会造成数据的延迟。

l  主实例写入压力过大

20%,如主实例规格较小、压力过大。这种情况需要升级主实例和只读实例的规格。

l  只读节点规格过小

10%,这种情况升级只读实例规格。

l  其他(无主键)

10% RDS 目前已经支持对表添加隐式主键,但是对于以前历史创建的表需要进行重建才能支持隐式主键。

2.怎样提升缓存命中率

在高并发的场景下,写入压力过大,如何才能提升缓存的命中率。根据以往的经验,有四种更新方式:

Cache aside, Read through, Write through, Write behind caching

缓存的更新可以从 cache 里面读取数据,取到后返回,如果没有得到就从数据库里取,成功后返回缓存当中。

Read through 是如果没有读到,就更新缓存。

Write through :在数据更新时,如果发现缓存里面没有数据,就更新缓存。可以合并同一个数据的多次操作。

Write behind caching :类似于底层的操作系统一个机制。

但是,这四种方式都不能保证缓存命中率。

我们在做核心系统的时候有一个小巧思,这个能力也以产品的方式提供给大家了。

image.png

如图,应用程序写请求到 RDS ,读请求到 Redis RDS的变更数据,底层是通过数据变更的方式拿到增量数据后,更新 RDS

优点:

l  更新路径短,延迟低

l  缓存失败为异步流程,业务更新 DB 完成后直接返回,不需要关心缓存失效流程,整个更新路径短,更新延迟低。

l  应用简单可靠

l  应用无需实现复杂双写逻辑,比如既写 RDS 又写 Redis ,只需启动异步线程监听增量数据,更新缓存数据同步到 Redis 里即可。

l  应用更新无额外性能消耗

因为数据订阅是通过解析 DB 的增量日志来获取增量数据,获取数据的过程对业务、 DB 性能无损,同时又能保证缓存的命中率100%。无需对 DB 造成额外的压力,也不需要从业务中拿出一部分资源来从 DB 读取数据,然后再更新缓存。这对 DB 和业务来说都是比较好的调优方法。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
5月前
|
缓存 关系型数据库 MySQL
在MySQL中处理高并发和负载峰值的关键技术与策略
采用上述策略和技术时,每个环节都要进行细致的规划和测试,确保数据库系统既能满足高并发的要求,又要保持足够的灵活性来应对各种突发的流量峰值。实施时,合理评估和测试改动对系统性能的影响,避免单一措施可能引起的连锁反应。持续的系统监控和分析将对维护系统稳定性和进行未来规划提供重要信息。
313 15
|
6月前
|
缓存 监控 Cloud Native
Java Solon v3.2.0 高并发与低内存实战指南之解决方案优化
本文深入解析了Java Solon v3.2.0框架的实战应用,聚焦高并发与低内存消耗场景。通过响应式编程、云原生支持、内存优化等特性,结合API网关、数据库操作及分布式缓存实例,展示其在秒杀系统中的性能优势。文章还提供了Docker部署、监控方案及实际效果数据,助力开发者构建高效稳定的应用系统。代码示例详尽,适合希望提升系统性能的Java开发者参考。
359 4
Java Solon v3.2.0 高并发与低内存实战指南之解决方案优化
|
6月前
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
6月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
1781 7
|
5月前
|
数据采集 监控 网络协议
基于aiohttp的高并发爬虫实战:从原理到代码的完整指南
在数据驱动时代,传统同步爬虫效率低下,而基于Python的aiohttp库可构建高并发异步爬虫。本文通过实战案例解析aiohttp的核心组件与优化策略,包括信号量控制、连接池复用、异常处理等,并探讨代理集成、分布式架构及反爬应对方案,助你打造高性能、稳定可靠的网络爬虫系统。
375 0
|
7月前
|
NoSQL 算法 安全
redis分布式锁在高并发场景下的方案设计与性能提升
本文探讨了Redis分布式锁在主从架构下失效的问题及其解决方案。首先通过CAP理论分析,Redis遵循AP原则,导致锁可能失效。针对此问题,提出两种解决方案:Zookeeper分布式锁(追求CP一致性)和Redlock算法(基于多个Redis实例提升可靠性)。文章还讨论了可能遇到的“坑”,如加从节点引发超卖问题、建议Redis节点数为奇数以及持久化策略对锁的影响。最后,从性能优化角度出发,介绍了减少锁粒度和分段锁的策略,并结合实际场景(如下单重复提交、支付与取消订单冲突)展示了分布式锁的应用方法。
577 3
|
11月前
|
存储 关系型数据库 MySQL
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
733 81
|
8月前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
1274 24
|
9月前
|
消息中间件 NoSQL 关系型数据库
去哪面试:1Wtps高并发,MySQL 热点行 问题, 怎么解决?
去哪面试:1Wtps高并发,MySQL 热点行 问题, 怎么解决?
去哪面试:1Wtps高并发,MySQL 热点行 问题, 怎么解决?
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
163 3

热门文章

最新文章

推荐镜像

更多