“热点”场景你真的能驾驭吗?从事电商的朋友必看!

简介: 阿里P9技术大神胡炜为你解读

作者:阿里云数据库资深技术专家胡炜

做电商业务的朋友一定不会对“热点” 这个数据库的使用场景感到陌生,大卖家、热点商品、热点库存等等都会遇到,即使在阿里这样电商业务相对非常成熟的体系中“热点”也困扰了业务非常久, 原因就在于“热点”是一个对于数据库业务不太友好的场景, 粗放的利用数据库来存取“热点”业务一定会遇到问题。

1、前言

在标准的关系型数据库中,由于需要确保事务的ACID, 因此不同的事务在并发更新同一行记录的时候需要完全的串行化。在乐观并发控制的实现中, 并发的多个更新事务只有一个能成功,其他的全部回滚;在悲观并发控制的实现中,每一个更新要等待前一个持有该行的事务提交或者回滚释放了行锁之后才可以进行更新。

常用的开源MySQL就是悲观的加锁并发控制实现。下图是一个典型的热点事务, 一共包含5条事务,其中Q3即是对热点行的更新。

1.png

经典热点事务场景

在加锁这样的悲观并发控制实现下,数据库理论上只要每时每刻都有一个事务处于更新这一行的过程,那么总的吞吐量能达到最优,吞吐量为:

2.png

但是随着并发请求的数量上升, 线程的上下文切换开销以及锁等待、唤醒的开销都会非常明显,因此在大并发下整体吞吐呈明显的下降趋势:

下面是简单的热点更新测试性能表现,即所有事务对同一行进行更新:
图三.jpg

第一个朴素的想法是消灭锁等待, 因此在过往的AliSQL 以及 官方MySQL-8.0 中都提供了no_wait的功能, 这相当于将热点场景变成了乐观的并发控制, 当事务发现需要等锁的时候直接回滚。

另一个很朴素的优化思路是控制事务的并发请求量,首先可以通过线程池来限制住数据库内部的并发线程数,假设线程池内部总共有128个工作线程, 那么性能基本就能够稳定图2的128并发的吞吐量上。 再其次, 通过对同一行更新的事务进行排队,也可以减少InnoDB锁等待唤醒的开销。 这种优化可以让吞吐无限接近于1s/trxrt。

RDS三节点企业版提供了另一种思路的解决方案,也就是提供新的思路来达到增加“热点”场景吞吐的目的。

RDS企业三节点的针对热点的主要手段包括:

  • 缩短事务持有锁的时间
  • 组提交

2、缩短事务持有锁的时间

事务的持续时间包括数据库内核中各条SQL执行的时间以及客户端与数据库之间的网络交互时间,根据图1的经典热点事务场景模型, 一个热点事务包括5条SQL语句,以及9次客户端以及数据库之间的网络通信(最后commit 返回客户端前事务已经结束)。

3、select from update

Oracle 有returning语法来通过一条DML完成修改数据和返回数据的目的。三节点企业版支持select from update的语法, 支持将某条记录更新,同时返回查询结果, 具体用法如下:

4.png

有了这个特性, 我们很容易将图1中经典热点模型的Q3 和 Q4 进行合并,节约一次数据库内部执行Query的时间,并且节约两次客户端和数据库的网络通信开销。

4、Commit On Success / Rollback On Fail /Target Affect Row

一个非auto commit的连接如果需要提交一个事务,在通常情况下需要客户端额外给数据库发送一个commit请求, 为了减少这一次客户端和数据库的网络开销,RDS企业三节点提供了Commit On Success / Rollback On Fail / Target Affect Row 的hint 语法。

Commit on success / Rollback on fail 非常容易理解, 即热点行更新操作成功即自动commit事务, 如果更新失败则rollback整个事务。

这里如何定义成功/失败是一个需要理解的概念, 这里引入Target Affect Row的概念,即更新语句实际更新了几条数据, 如果Target Affect Row为1,则更新到了一条数据我们认为更新是成功, 如果更新的where条件没有命中任何记录则认为是失败,这样配合Commit on success / Rollback on fail就能够方便的实现业务的逻辑。需要注意的是这几个hint必须是伴随着热点update 语句使用的。

5.png

5、组提交热点事务

通过上一节的缩短事务持有锁的时间,我们能够缩短每个事务的运行时长,从而使得1s/trxrt 尽量增大, 同过这样的方式,我们能将单线程的吞吐增加到接近10000TPS/s的量级, 想让吞吐更进一步则非常困难。RDS企业三节点提供了另外一种组提交的方式,即对并发更新同一行的不同事务打包成一个group, 这个group对这行热点记录做一次合并更新, 这样就能让系统的吞吐再提升好几倍。

为了方便理解这个概念, 举个例子,假设现在同时有10个事务想要更新t1表上id = 3 的记录,这里假设每个事务的更新语句都是:

6.png

通过组提交的技术,RDS三节点企业版内核可以把这样的更新语句进行内部逻辑合并打包,实际上是将id为3这一行的b值更新为b-10.这样实际上对数据库的存储引擎就进行了一次更新就达到了顺序执行10个事务一样的效果,持有锁的时间可以大大缩短,并且对客户端的用户是透明的。产生的binlog也是和原来十个事务串行是一样的效果。启用组更新需要设置系统的变量:

7.png

组更新的效果可以通过全局的status来观测:

8.png

这里的Group_update_leader_count 代表着热点更新组的数量, Group_update_follower_count代表的是组里的事务数目, 两个值相除就能得到平均每组中事务的数目。这个值越大则组更新合并的效果越好。

6、总结

RDS企业三节点提供的热点更新功能能够将关系数据库在热点记录更新这一个场景的吞吐得到大规模提升, 也是在阿里巴巴内部的场景中有着非常广泛应用的特性。它能缩短每个事务持有锁的时间,也能打包一批事务做合并更新。

图二.jpg

当然组更新有启用的限制, 即需要在更新语句中带上commit_on_success的 hint, 也要确定在where语句中带有主键的等值条件,这样的更新语句数据库才会识别为走热点组更新的语句,并按照组提交的逻辑进行处理,一个组的事务或者全部成功,或者全部回滚, 即如果组中有一个事务的用户发起断开连接回滚事务的操作, 那么这个组中的所有事务都会回滚。

总而言之如果用户对热点场景有诉求,并且需要数据库提供高成功率的吞吐保障,可以对SQL稍微加以设计使用RDS企业三节点的高级热点功能。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
7月前
|
存储 人工智能 监控
《生成式AI卓越架构设计指导原则》:从"能用AI"到"用好AI"
阿里云发布《生成式AI卓越架构设计指导原则》,围绕安全、稳定、效率、成本与性能五大支柱,助力企业构建可信赖、可持续演进的AI应用体系,推动AI从“能用”到“用好”的关键跨越。
《生成式AI卓越架构设计指导原则》:从"能用AI"到"用好AI"
|
数据挖掘
跟着 Nature 学作图 | 相关性热图(显示相关性散点图)
跟着 Nature 学作图 | 相关性热图(显示相关性散点图)
1859 0
|
开发工具 git 测试技术
Feature Toggle 实践总结
Feature Toggle 实践总结
14625 0
|
7月前
|
存储 NoSQL 关系型数据库
阿里云数据库产品介绍:关系型数据库、NoSQL数据库、数据库管理工具等产品类型与适用场景
阿里云推出了丰富多样的数据库产品,以满足不同行业、不同规模企业的多元化需求。本文为大家介绍阿里云的关系型数据库、NoSQL数据库、数据库管理工具、数据库平台与服务以及数据仓库等系列产品,探讨各产品的优势、应用场景以及数据库上云优选活动介绍。
857 0
|
2月前
|
缓存 人工智能 安全
从 Subagent 到 Agent Team:多 Agent 系统里的两种协作方式
上下文一多就容易乱,Agent 也就容易丢主线:前面确认过的需求,后面可能就忘了;日志里的问题还没处理完,测试结果又进来了;Review 意见一多,原本要改什么也开始变得模糊。 所以,多 Agent 系统里逐渐形成了两种常见协作方式:一种是 Subagent,另一种是 Agent Team。
312 0
从 Subagent 到 Agent Team:多 Agent 系统里的两种协作方式
|
9月前
|
边缘计算 自然语言处理 算法
实时交互数字人端到端延迟压至0.8秒:关键技术节点与商业价值解析
0.8秒是实时数字人体验的关键阈值,端到端延迟低于此值可实现自然流畅交互。本文解析其技术链路、核心支撑与商业价值,揭示为何这一指标成为数字人从“可用”到“好用”的分水岭。
|
10月前
|
存储 弹性计算 网络协议
超详细的阿里云服务器购买流程,ECS自定义购买配置教程
本文详细图解阿里云ECS服务器自定义购买全流程,涵盖付费模式、地域选择、网络配置、实例规格、镜像、存储、安全组及登录设置等核心步骤,助您轻松掌握专业级云服务器搭建方法。
|
存储 缓存 前端开发
软件架构分层,你的项目处于什么阶段?
软件架构分层,你的项目处于什么阶段?
2109 0
软件架构分层,你的项目处于什么阶段?
|
Python
使用python计算两个日期之前的相差天数,周数
使用python计算两个日期之前的相差天数,周数
1376 0
|
消息中间件 存储 监控
解析RocketMQ:高性能分布式消息队列的原理与应用
RocketMQ是阿里开源的高性能分布式消息队列,具备低延迟、高吞吐和高可靠性,广泛应用于电商、金融等领域。其核心概念包括Topic、Producer、Consumer、Message和Name Server/Broker。RocketMQ支持异步通信、系统解耦、异步处理和流量削峰。关键特性有分布式架构、顺序消息、高可用性设计和消息事务。提供发布/订阅和点对点模型,以及消息过滤功能。通过集群模式、存储方式、发送和消费方式的选择进行性能优化。RocketMQ易于部署,可与Spring集成,并与Kafka等系统对比各有优势,拥有丰富的生态系统。
1620 4