【双11背后的技术】AliCloudDB——双11商家后台数据库的基石

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 作者:玄惭 前言 2016年天猫双11购物狂欢节已经完美落下帷幕,千亿成交的背后,作为整个天猫商家后台数据库的基石,AliCloudDB是如何保障在零点洪峰来临时候稳定、安全和顺畅?如此庞大规模的数据库实例集群又是怎样一步步成长起来的?AliCloudDB团队核心老司机玄惭,为你带来,双11是这

选自《不一样的技术创新——阿里巴巴2016双11背后的技术》,全书目录:https://yq.aliyun.com/articles/68637

本文作者:玄惭

前言

2016年天猫双11购物狂欢节已经完美落下帷幕,千亿成交的背后,作为整个天猫商家后台数据库的基石,AliCloudDB是如何保障在零点洪峰来临时候稳定、安全和顺畅?如此庞大规模的数据库实例集群又是怎样一步步成长起来的?AliCloudDB团队核心老司机玄惭,为你带来,双11是这样用云的姿势.... 

1. 弹性扩容

多数用户在双11到来之前都会进行弹性扩容,常见的弹性扩容分为两类:本机升降级和跨机升降级。例如现在有一个6G/6C的RDS数据库想要升级到12G/12C,如果本机资源足够,则可以在本机完成升降级,无需迁移到其他机器上。云数据库默认是主备架构,本机升级时资源系统首先判断升级是否可以在本机完成,工作原理如上图所示:首先升级RDS备库;然后重启备库;之后进行主备切换,再修改重启原主库。 

将本地升级变成一次主备切换,进而避免了重启主库的操作。这里需要注意的坑是:如果主备有延迟,那么主备切换不会进行,升级任务也会被block。

另一种弹性扩容的方式是:跨机升降级。当本机资源不足以支撑升级所需要的资源的时候,需要将实例分配到另外一台机器上。所以跨机升级需要使用数据库最近一次的备份和日志实时同步到新的主机上,保证新实例和旧实例的数据是完全一致的。 

而这里需要注意的坑是:如果历史备份集较大或原主库压力较大时,会导致跨机迁移时间较长。

弹性扩容最佳实践可以总结为以下四点:

     1.   如果升级很长时间也没有完成,可能发生了跨机迁移或者主备存在延迟。

     2.   可用区迁移、数据库版本升级耗时通常较长,是因为两者迁移都会发生跨机迁移。

     3.   空间升级非常快,这是因为空间升级无需重启、迁移数据库,对业务也不会造成影响。

     4.   弹性扩容时间的选择,建议在业务低峰期进行弹性扩容。  

2. 访问链路

在云数据库中,访问链路分为两种模式:高安全访问链路和标准访问链路。在图上流程图的右侧,RDS在数据库的前面增加了一层代理层,所有请求在代理层都被解析,在解析过程中添加了SQL拦截规则,进而可以防止SQL注入的攻击。此外,高安全访问链路可以防止90%的连接闪断;并支持内外网地址同时访问;对短连接应用有缓冲防护作用。需要注意的是高安全访问链路较标准链路增加了5%左右的响应时间。

标准访问链路与高安全访问链路相比,缺少了代理层,进而失去了连接保持、SQL拦截以及内外网同时访问的能力;但相对于高安全访问链路响应时间会减少。

因此,访问链路最佳实践可以总结为以下几点:

     1.   建议使用高安全访问模式,特别是短连接应用,高安全访问模式具有缓冲短连接对数据库冲击的效果。

     2.   在标准访问链路切换到高安全访问链路时,切换过程最多会有30秒不可访问。

     3.   如果ECS使用VPC,那么数据库只能选择高安全访问链路。

     4.   访问链路上需要注意应用不要使用IP来访问数据库,避免由于IP变化导致故障。

 3. 架构设计

架构设计就像我们修建一幢坚固的房子一样,需要有整体的布局设计,同时在细节上材料的选择以及施工质量的保障也同样重要。在历年的双11中,由于业务流量的突增,那些平时没有暴露出来的问题往往在这个时候爆发出来,所以我们要把数据库这块地基打好,细节上做好,架构设计就需要我们在这些上下功夫。

读写分离是常见的架构设计手段。RDS支持只读节点,主库主要承担写和实时性要求高操作,一些复杂的分析计算业务操作最好不要放在主库上执行,而是选择放在只读节点运算。使用读写分离架构时,首先数据库版本需要升级到MySQL5.6版本;同时目前RDS最多只支持五个只读节点。在读写分离时,延时是我们必须关注的重点,目前RDS上通过源码改进并行复制,提升复制性能,降低了主库与备库之间数据同步的延迟。

正如上图的压测结果显示,5.6版本较5.5版本,在性能上有很大的提升。目前,RDS只有5.6版本支持只读实例,应用可以做读写分离;支持在线添加字段、索引和重建数据表,应用不再被阻塞。

引擎选择是数据库设计中很基础的一点,这里重点介绍下Tokudb引擎。日志型应用的特性是:写操作很高、读操作相对较少。Tokudb引擎压缩比Innodb引擎高出5~7倍,适合写多读少的应用;同时,Tokudb引擎online ddl速度较快,适合表很大需要经常DDL操作的应用。同样,Tokudb引擎缺点也十分明显,它会增加响应时间;同时online ddl对大字段不适用。

这里需要注意一点的是:在5.5版本以后innodb 引擎已经是MySQL的默认引擎,建议将Myisam引擎转换为innodb引擎,会避免很多问题的发生。

对于大字段,数据库的更新写入压力过大,update、insert、delete会导致binlog日志急剧增加,导致实例磁盘报警。因此在数据库设计时,要注意规避大字段引起的问题。常见的大字段有varchar(8000)、text、blob、clob(sqlserver/mysql),使用时建议将大字段拆分出主表或者存入到其他存储系统中。

字段类型也是常见的问题之一。如上图所示案例中表的user_ID是varchar(64),但访问SQL传入的是数值类型,这就会导致隐式转换发生,进而导致索引无效,可以使用explain 查看是否使用到索引。因此,在设计开发阶段,就要避免数据库字段定义与应用程序参数定义不一致的情况。


字段大小同样会对数据库性能造成影响。字段长度超过索引允许的最大长度会导致索引字段被截断;同时,过长的字段定义会消耗大量的排序内存以及临时表空间。

索引设计也是大家经常犯错的一个点,在历年双11保障中,索引出现的问题最多。这里,重点讲解单条SQL的创建索引思路:

select person_role_id from moive where movie_id=1000 and role_id=1 order by nr_role desc;

对于这条SQL语句,首先需要评估参与运算的结果集范围,在该语句中创建movie_id和role_id的组合索引;第二步,考虑参与排序字段,在该语句中,排序用到的是nr_role,因此需要将其添加到索引中。大部分情况下,经过前两步,就已经完成了索引的创建。

有时候,还需要考虑第三步:覆盖索引,在索引中添加需要查找的字段,无需回表,以期达到优化目的,在该例中将person_role_id添加到索引中。

常见的索引误区包括:

       •      对SQL语句的每个查询条件字段建立一个单列索引,MySQL只能使用其一个索引;

       •      对SQL语句的所有查询字段建立组合索引,导致索引远大于数据,同时性能低下;

       •      小表不建立索引。


4. 高可用配置

RDS本身是一个主备的高可用架构,当主库Down后,会快速切换到备库。在高可用架构中很重要的一点是数据同步,保障主备数据一致不丢失。常见的高可用配置包括:

       •      单可用区:主备都在统一个可用区内,可以实现主备之间的快速切换;

       •      Binlog同步:采取异步和半同步的方式保障主备的数据一致;

       •      Binlog刷写:根据应用特点设置安全模式或者高性能模式;

       •      事务提交:默认采用最高安全模式。

 

此外,为了保障服务高可用,也可以采用多可用区配置,即主备在不同可用区,此时,应用同样需要多可用区部署。此时需要注意Binlog在主备的同步模式,通常这种情况下开启半同步模式跨可用区访问,可能导致写入性能下降。

另外,还有一种跨数据中心的灾备方案,在历年的双11中,已经有很多用户实施过这样的方案,你可以选择在两个不同的数据中心部署数据库和应用,比如在杭州和上海两个地区部署,两个数据中心的数据同步采用DTS,以保证一个数据中心挂掉后,另外一个数据中心能够接管起来。  

5. 性能优化

当性能问题出现时,例如上图所示数据库的QPS高达2W+,这时候如何进行优化?首先我们需要明确导致QPS过高的原因,可以查看SQL运行报告,对一段时间内的SQL语句进行归类排序,这样就知道了数据库中是那些SQL导致QPS提升的,然后针对这些SQL进行分析,对应地给出解决方案,判断调用是否合理,是否添加缓存等。性能优化中,慢日志也是需要重点关注的点。通过查看慢日志运行报告,分析这些慢SQL产生的原因:是否缺少索引、字段设计存在问题等等,在双11之前优化掉,避免双11高峰来临的时候引发雪崩。

6. 参数优化

 在RDS中,大部分参数是已经经过调优的,因此很多参数是不需要再去调整的。但是用户可以根据应用场景的不同选择合适的参数,这里重点看下RDS新增的四个参数优化:

       •      rds_max_tmp_disk_space:控制MySQL能够使用的临时文件的大小,适用于一个SQL就消耗掉整个数据库的磁盘空间;

       •      tokudb_buffer_pool_ratio:控制TokuDB引擎能够使用的buffer内存大小,适用于选择了tokudb作为存储引擎的场景;

       •      max_statement_time:控制单个SQL语句的最长执行时间,适用于控制数据库中的慢SQL数量;

       •      rds_threads_running_high_watermark:控制MySQL并发的查询数目,常用于秒杀场景的业务; 

除此以外,阿里云的异地灾备的产品化也非常值得分享。从2015年起,RDS为天猫的商家后台数据库提供了异地灾备的功能。当主机房出现较大的负载压力、断网、断电等极端情况,RDS可将商家的后台系统在30分钟内切换至灾备机房继续运行,以保障总体可靠性,进一步确保平台大型品牌商家双11期间后台系统安全、稳定。 

7. 未来,走出去传承最佳实践和保障经验

 还记得2012年一家天猫服务商和我说:“今年遇到了一群靠谱的人,在加上靠谱的技术,才能够一起做靠谱的事情。”这句话一直激励着我。我们也相信,能够真正地帮到商家,是对这次参与双11所有人的最大回报。   

从上云肩挑背扛到在线迁移,让上云不再成为难事;

从资源手工离散和下线到自动化扩容和收容,让资源真正流动起来;

将诊断经验沉淀为自动化诊断工具,让诊断不再成为难事。 

一幕又一幕,我们始终坚信只有把双11的经验和能力产品化和工具化,利用双11这样极具挑战的项目不断锤炼我们的产品,才是真正长远发展之计。




相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
数据库 索引
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
52 3
|
1月前
|
数据库 索引
深入理解数据库索引技术:回表与索引下推详解
【10月更文挑战第23天】 在数据库查询性能优化中,索引的使用是提升查询效率的关键。然而,并非所有的索引都能直接加速查询。本文将深入探讨两个重要的数据库索引技术:回表和索引下推,解释它们的概念、工作原理以及对性能的影响。
72 3
|
2月前
|
存储 NoSQL 关系型数据库
数据库技术深度解析:从基础到进阶
【10月更文挑战第17天】数据库技术深度解析:从基础到进阶
96 0
|
1月前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
114 61
|
1月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
53 3
|
1月前
|
缓存 负载均衡 监控
数据库多实例的负载均衡技术深入
【10月更文挑战第23天】数据库多实例负载均衡技术是确保数据库系统高效运行的重要手段。通过合理选择负载均衡策略、实时监控实例状态、不断优化调整,能够实现资源的最优分配和系统性能的提升。在实际应用中,需要根据具体情况灵活运用各种负载均衡技术,并结合其他相关技术,以满足不断变化的业务需求。
|
1月前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
31 4
|
1月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
37 1
|
1月前
|
SQL Java 数据库连接
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
59 2
|
2月前
|
存储 SQL NoSQL
数据库技术深度探索:从关系型到NoSQL的演变
【10月更文挑战第21天】数据库技术深度探索:从关系型到NoSQL的演变
79 1
下一篇
DataWorks