MySQL的公开课,可能目前用不上这些,但是往往能在以后想解决方案的时候帮助到我。以下是阿里对公开课的整理

摘要: 本文根据阿里高级数据库专家何登成在首届阿里巴巴在线技术峰会上的分享整理而成。他主要介绍了AliSQL相对于MySQL进行的性能优化。通过大连接、高并发下的数据库稳定性保障和库存热点更新两个问题的解决方案介绍了高低水位限流和线程池的使用方法以及库存热点优化的三步改进,提出AliSQL的完整生态体系。

本文根据阿里高级数据库专家何登成在首届阿里巴巴在线技术峰会上的分享整理而成。他主要介绍了AliSQL相对于MySQL进行的性能优化。通过大连接、高并发下的数据库稳定性保障和库存热点更新两个问题的解决方案介绍了高低水位限流和线程池的使用方法以及库存热点优化的三步改进,最后提出了AliSQL的完整生态体系。

以下为整理内容。


背景:当使用官方的MySQL时,发现在我们的体量下会面临比较大的挑战,所以,2011年我们在MySQL的基础上做了一些功能增强和bug修复。在之后的版本中增加了并行复制,增强了线程池、热点补丁,加入了SQL防火墙。

AliSQL改进一览——性能优化

AliSQL改进一览——功能、稳定性增强

主要讲解一个很小的功能:在线执行计划优化。在MySQL内部,每一个SQL执行都会解析,在解析的过程中可能会解析出一个错误的执行计划,致使执行效率大大降低,甚至会把整个系统打爆。针对这个问题,其实Oracle是有解法的,即所谓的执行计划绑定。在在线执行计划优化技术出现之前,我们能做的是告诉应用我们现在有SQL走错了执行计划,让应用加hint把执行计划固定下来,这种做法耗时非常长,并且需要应用介入,对可持续服务是一个很大的挑战。所以,我们可以做这么一件事,在线把一个应用的执行计划绑定好。具体做法是:我们识别在线的SQL,对SQL进行模式识别,对于错误的SQL,我们在SQL发到MySQL之后再对它识别之后做一个hint来把执行计划固定下来。这样一个功能能够很快把整个系统的响应时间降下来,使业务马上恢复服务。

两个完整的故事

大连接、高并发下的数据库稳定性保障

大连接、高并发下的数据库会出现什么问题呢?

这是一个商品库的监控图。上边是threads running,用于在MySQL内部监控活跃线程数,下面是response time(响应时间),这两个是MySQL里面两个重要的指标。一般情况下,这两个数值都是非常低的,但是偶尔会出现图中的高峰,高峰的持续时间也很短,但是峰值特别高。

在压力很低的情况下,数据库为什么会时不时的停止服务?如上图所示,下面是数据库,上面是APP Servers,每一个应用服务器到达数据库的时间是不固定的。如果很多用户恰巧在同一时间访问相同商品的话,从系统看来就是几万个连接同时活跃,就会出现之前所说的问题。这个问题并不是阿里特有的问题,它其实是一个排队论的问题。

解决方案1:高低水位限流

高水位限流方法:当发现数据库的threads running超过一个阈值时,直接将超过阈值的连接数抛弃掉。这种方式虽然保证了部分请求能够顺利的执行并且有很好的响应时间,但是却抛弃了很大一部分的并发用户请求。

考虑到抛弃的不可行性,想到了排队,即低水位限流:在数据库内部做了一个队列,所有的用户请求到达的时候,先hash到队列上。当数据库出现并发的请求数激增时,可以先服务一批,服务完成之后再服务下一批,这样就可以在不抛弃的基础上保证数据库的稳定。低水位限流有了一些线程池的思想在里面,是一个比较粗的线程池。

解决方案2:线程池

处理并发请求,线程池是一个很好的解决思路,上图就是线程池的简单架构图。在MySQL中,一个用户请求对应到MySQL的一个工作线程。线程池是把用户请求线程和工作线程进行解耦,用户请求线程可以非常多,比如用户请求线程可以有成千上万,而工作线程只有固定的几十个上百个。把这些工作线程进行聚合,每一个Group里面有多个工作线程。用户线程通过哈希算法映射到Group中。如果Group中所有的工作线程都正在服务,那么就进行排队等待。为什么所有工作线程不放到一起,而是分开成一个个的Group?因为Group是可以与CPU的核进行绑定的,可以减少很多CPU的调度开销,这样又进一步提高了整个线程池的效率。

使用线程池时应该注意哪些问题?

  • 慢SQL是线程池的大敌!如果慢SQL比较多的话,所有的工作线程就会被占满,这样导致非常快的SQL也不能去抢占工作单元,相当于慢SQL把整个系统完全堵住了。所以,使用线程池时要对整个数据库系统进行一个很大的优化,把数据库的SQL性能进行比较好的调优,频繁执行的SQL不能是慢SQL。慢SQL的来源包括:正常业务SQL、定时任务、系统后台操作(例如:binlog
    dump)。
  • 无论任何原因导致线程池堵塞,确保管理命令不受影响!管理命令不应该走正常的业务线程池,而应该走一个单独的接口。当线程池堵塞时,管理命令可以通过Extra port将慢SQL处理掉。
  • 线程池和用户的登录请求也是有关的。登录到数据库的那些请求其实走的也是线程池。使用线程池之后,处理连接风暴的能力也会变弱。

库存热点更新

“双十一”时,有很多商品是大家都想去抢购的,库存在数据库内部只是一行标识商品剩余件数的记录,买商品的行为其实是大家在并发的扣减商品记录。当我们并发的去扣减记录的时候,为了保证正确性,一定要对这条记录加锁,由于锁的存在,就把商品扣减变成了一个串行的过程。这个问题与之前问题的不同之处是,这个问题是很多用户去抢一个热点商品所带来的问题。

先把它做成一个简化的模型,先开始一个事务,对它做一个插入,更新热点行,读出热点行的后项,最后进行提交。其中,更新热点行需要加锁,提交的时候放锁。MySQL会出现排队等锁的过程,并且每次排队都会进行死锁检测,这样逐渐使得死锁检测时间越来越长。

第一版做了一个很简单的优化,由于很多线程进入到数据库,但是又无事可做,所以控制进入数据库的线程数,保证InnoDB中有固定数目的线程,这样会使死锁检测、线程切换时间等都急剧下降。

继续分析该模型,持有锁的时间是从第三步开始,第五步结束,这个过程中有两个网络交互时间。考虑到降低网络交互时间,把第三步和第四步合并,先对热点行进行更新,更新完之后顺便把热点行返回给应用服务器。在此基础上,再考虑继续减少网络交互时间,把三四五步都合并。更新库存时,如果更新到了一行,并且更新后项也满足,就直接把这个事务提交;如果说这里面的逻辑不满足,则自动把事务回滚掉。这样一来,所有持有锁的SQL都在数据库内部,没有任何网络交互。

既然串行已经优化到了一定的极致,能不能把所有穿行的用户请求做一个batch合并?怎么演进?用户发SQL过来后,对热点记录做哈希,其中每一个桶是一个热点行,对每个桶做收集,然后由桶里面的第一个事务一批次的把当前桶里收集的所有扣减请求全部一次性提交掉,这样虽然仍旧是串行化,但是用批处理去做了。为了提升整体性能,当第一批提交的时候第二批开始收集,这样就将单线程的串行变成了批处理的线程。

完整生态体系

数据库追求的是一个体系,而不仅仅是一个数据库。想要用好数据库,需要为数据库构建完整的生态体系。其中,第二层是运维组件层,第三层是运维服务层,最上层是用户服务层。运维组件层直接和数据库内核打交道,包括一些高可用、数据恢复、测试、调度等。运维服务层提供自动化运维平台DBFree,把整个数据库的申请、交付、扩容、缩容全部做成一个自动化平台。面向用户服务中面向应用开发的可以通过数据服务平台自助完成。

AliSQL未来发展规划

紧跟开源,引领变革,扩展数据库服务边界,为阿里业务发展赋能。

参考:https://yq.aliyun.com/articles/57826

演讲PDF:【阿里在线技术峰会】何登成:AliSQL性能优化与功能突破的演进之路.pdf【http://pan.baidu.com/s/1kVuDBxl

【公开课】【阿里在线技术峰会】何登成:AliSQL性能优化与功能突破的演进之路的更多相关文章

  1. 【公开课】【阿里在线技术峰会】魏鹏:基于Java容器的多应用部署技术实践

    对于公开课,可能目前用不上这些,但是往往能在以后想解决方案的时候帮助到我.以下是阿里对公开课的整理 摘要: 在首届阿里巴巴在线峰会上,阿里巴巴中间件技术部专家魏鹏为大家带来了题为<基于Java容 ...

  2. 首届阿里巴巴在线技术峰会,9位大V演讲整理!

    https://yq.aliyun.com/articles/57826 感谢参加阿里巴巴在线技术峰会.7月19日的3场专家分享:Blink.Docker.电商互动:7月20日的云数据库十大经典案 例 ...

  3. 大V云集!参加首届阿里巴巴在线技术峰会的八大理由

    由阿里巴巴集团.阿里巴巴技术协会(ATA)和阿里云云栖社区联合举办的首届阿里巴巴在线技术峰会(Alibaba Online Technology Summit)将于7月19日-21日20:00-21: ...

  4. aws在线技术峰会笔记-基于AWS的Devops最佳实践

    AWS CodeCommit AWS CodePipeline 可以和github集成 可以支持蓝绿部署 微服务架构, API Gateway进行转发

  5. aws在线技术峰会笔记-电商解决方案

    Redshift PB级别的数据仓库

  6. aws在线技术峰会笔记-游戏解决方案

    选项1:可以将aws的SDK嵌入到APP中. 选项2:Mobile Hub自动生成代码. 选项3:开源免费的游戏引擎.可视化脚本编程,实现客户端的逻辑代码. 用户管理 Cognito Identity ...

  7. aws在线技术峰会笔记-主会场

    容器服务:Elastic container service IoT可以采用无服务器架构.

  8. 阿里云云主机添加swap分区与swap性能优化

    1.swap的功能与相应内核参数 Linux 将物理内存分为内存段的部分被称作“页面”.交换是指内存页面被复制到预先设定好的硬盘空间(叫做交换空间)的过程,目的是释放用于页面的内存.物理内存和交换空间 ...

  9. 【.Net免费公开课】--授技.Net中的高帅富技术-"工作流"

    课程简介 免费公开课主题: .Net中的高帅富技术-“工作流” 公开课开课时间:     10月17日 19:30--21:30 公开课YY频道:       85155393   (重要:公开课QQ ...

随机推荐

  1. Dubbo框架应用之(二)--服务治理

    Dubbo服务治理全貌图 当我们现有ITOO平台系统的业务随着用户的逐渐增大,设计的业务越来越广,系统会异常的复杂,在大规模服务之前,我们可以采用的是RMI或Hessian等工具,暴露和引用远程服务, ...

  2. DragVideo,一种在播放视频时,可以任意拖拽的方案

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53638896 前言 项目已开源到 ...

  3. Android实现多条Toast快速显示(强制中止上一条Toast的显示)

    Android实现多条Toast快速显示 Toast多用于我们开发人员调试使用,有时候也作为给用户的弱提示使用,我们常用的方法是 Toast.makeText(this, "弹出Toast& ...

  4. 物料分类新增&更新

    --新增 INV_ITEM_CATEGORY_PUB.Create_Category ( p_api_version IN NUMBER, p_init_msg_list IN VARCHAR2 DE ...

  5. [Vim]vim学习笔记--多个文件打开,切换,关闭

    一种情况是在shell中用vim打开多个文件,另一种是在vim编辑器中打开多个文件 同时打开多个文件 vim file1 file2  打开文件并水平窗口显示 vim -o file1 file2 打 ...

  6. SQLite 附加数据库(http://www.w3cschool.cc/sqlite/sqlite-attach-database.html)

    SQLite 附加数据库 假设这样一种情况,当在同一时间有多个数据库可用,您想使用其中的任何一个.SQLite 的 ATTACH DTABASE 语句是用来选择一个特定的数据库,使用该命令后,所有的 ...

  7. Android Multimedia框架总结(十)Stagefright框架之音视频输出过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52560012 前言:上篇文中最后 ...

  8. 在OC代码中创建Swift编写的视图控制器

    背景 近日在和一群朋友做项目,我和另一位同学负责iOS客户端,我是一直使用OC的,而他只会Swift,因此在我们分工协作之后,就需要把代码合在一起,这就牵扯到如何在TabbarController中添 ...

  9. Spring Boot微服务架构入门

    概述 还记得在10年毕业实习的时候,当时后台三大框架为主流的后台开发框架成软件行业的标杆,当时对于软件的认识也就是照猫画虎,对于为什么会有这么样的写法,以及这种框架的优势或劣势,是不清楚的,Sprin ...

  10. Nhibernate系列学习之(一) ORM and Nhibernate入门实例解析

    最近框架项目需要,数据层想使用Nhibernate,代替传统的sql语句的写法,更加使用面向对象的思维来维护实体与数据库的这层关系映射(ORM),好在之前接触过Java时学习使用了Hibernate, ...