阿里双11大促秒杀活动下的缓存技术与高水位限流实现-阿里云开发者社区

开发者社区> 技术小能手> 正文

阿里双11大促秒杀活动下的缓存技术与高水位限流实现

简介: 秒杀最早来自天猫双11各种商品的促销活动中,现在已经有很多业务场景在使用,比如抢红包,抢票等。其特点有三高:瞬时并发高,数据一致性高,热点更新频度高。这样三高的场景下往往给数据库造成极大的压力,大量更新数据库中的同一行,这样必然会产生锁等待,导致数据库的性能急剧下降的问题,很容出现雪崩效应。
+关注继续查看

秒杀最早来自天猫双11各种商品的促销活动中,现在已经有很多业务场景在使用,比如抢红包,抢票等。其特点有三高:瞬时并发高,数据一致性高,热点更新频度高。这样三高的场景下往往给数据库造成极大的压力,大量更新数据库中的同一行,这样必然会产生锁等待,导致数据库的性能急剧下降的问题,很容出现雪崩效应。

记得有一年春节,一个电视台定时在整点发放红包,结果由于压力太高,导致更新数据库红包数额的请求全部堆积,业务全部挂掉,面对这样的情况我们当时也束手无策。

面对秒杀业务的场景,数据库成为了底层系统中最重要的瓶颈点,阿里经过几年的沉淀也诞生了很多的技术手段来进行优化。主要包括以下几个方面:

. 业务流程优化
. 访问来源优化
. 流量控制

业务流程优化

以淘宝的交易订单为例,在共享服务平台模式下,订单创建流程需要调用超过200个服务,如果以严格的顺序调用的方式,哪怕每一个服务调用都控制在20ms以内,那么完成一个订单也需要4s的时间,远远超过了用户的忍耐极限。

另外,顺序调用会导致对系统资源的过度占用,给服务器整体的吞吐量产生巨大影响。

因此,对于有严格先后顺序的服务保持顺序调用,对于能够同步执行的服务均采用异步化的方式处理。

从数据库层面,实现的核心技术就是采用数据库事务的异步化。也就是将大事务拆分成小事务,同样根据以上原则,进行相对异步化处理。(在该过程中,最重要的是要控制程序或者业务异常时,不会导致结果不一致,或支持有效的回滚和重试机制。)

访问来源优化

在传统的数据库访问中,一次SSD盘数据访问在几十微秒,一次SATA盘数据访问在几十毫秒,而内存数据库的操作时间是纳秒级的,因此通过缓存技术改变业务访问的数据来源从而提高系统性能和吞吐量的技术被各大企业的互联网应用广泛使用。

淘宝在业务的发展过程中,也不断通过缓存技术的研究和应用的改进高性能。

早期通过缓存实现应用分布式session,以避免应用实例间会话的复制,后来发展为将缓存用于业务去重判断、交易快照、图片索引等场景,最后 替换数据库在业务交易处理中的职能。缓存在业务中扮演越来越重要的角色。

流量控制

接下来我们重点讲一下底层数据所做的优化。当大量的并发更新同一条记录时,使用排队的方式来保证高并发下热点记录更新依然能保持较好的性能,为threads_running设置一个硬上线,当并发超过此值是,拒绝执行sql,保护MySQL,我们将这个称之为高水位限流,这样就给数据库加上了一层限流的功能,使得数据库不被瞬间的高爆发请求打爆。

高水位限流实现:

监控系统status变量threads_running,当满足拒绝条件,拒绝执行sql,返回用户:MySQL Server is too busy,判断逻辑在dispatch_command中,sql解析之后。

增加的系统variables:

1 threads_running_ctl_mode: 限流的sql类型,有两个取值:[ALL | SELECTS],默认SELECTS,设置为ALL需谨慎。
2 threads_running_high_watermark: 限流水位值,只有threads_running超过此值才会触发,默认值为max_connections,当set global threads_running_high_watermark=0时自动设置为max_connections。

拒绝必要条件:

1 .threads_running超过threads_running_high_watermark。
2 .threads_running_ctl_mode与sql类型相符。


以下情况不拒绝:

1 用户具有super权限。
2 sql所在事务已经开启。
3 sql为commit/rollback。

阿里云的RDS已经集成了阿里秒杀场景下的参数优化,所以如果你的应用场景中具有大量并发更新同一行记录的场景,可以打开数据库的限流参数:threads_running_ctl_mode和threads_running_high_watermark来保护数据库,让数据库平稳过渡。

下面我们来看一则生产案例。

b11202a509b7731f788a05f6cca0a48f85b2064b

从上图中看到该数据库的活跃连接数最高的时候到达了1W,通过show processlist可以看到大量的并发更新

cfe12d9116ca498b571d3835da6d19f28e8bdae4

我们来看一下数据库并发更新的TPS有多大:

a2aaec3288cc3bc4a7cc020b7b1dbd1d1ab38eb5

可以看到数据库中的活跃连接数非常高,每秒的update非常不稳定。

我们在把限流开关打开后看一下性能表现:

mysql> set global  rds_threads_running_high_watermark=300;

Query OK, 0 rows affected (0.00 sec)

mysql> set global  rds_threads_running_ctl_mode='all';

Query OK, 0 rows affected (0.00 sec)
faa45de2f4fafc0eb96ab16abe7c8b800a1f4c5b

从上图可以明显的观察到,通过打开数据库的限流开关,数据库的活跃连接数在300左右,同时数据库的TPS也没有再出现很大的波动,这样很好的保护住了DB。

3a7e63d80c6c1688cba7e61a52680561cf6b5c69

双11至今为止发展为中国乃至全球最成功的大型促销活动。用户对系统性能的极致追求业务的巨大压力给整个系统的建设和运维管控都提出了很高的要求。而阿里正是在这样的大促秒杀活动中,积累了相当丰富的架构设计经验和平台开发能力。


原文发布时间为:2018-02-5

本文作者:Alibaba

本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”微信公众号

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9305 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
11136 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10785 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13010 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
7371 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6860 0
+关注
技术小能手
云栖运营小编~
7208
文章
9
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载