在阿里云上遇见更好的Oracle(二)
从上一篇文章的反馈来看,大家还是喜欢八卦多过技术细节,那这一篇继续一些题外话,说说我对“去IOE”的看法。
对同一件事情,参与的没参与的人,讨论起来,都会有各自的立场。所以这里先申明一下,以下内容只是我个人的观点,与任何公司及组织及其他个人皆无关;限于个人记忆力,部分细节可能有出入,如有差错,纯属年老失忆。
淘宝当年从单个Java应用到服务化后的垂直分库,再到水平分库,一步一步走过来,每一步皆有其必然性。但从传播性和话题性上来讲,“淘宝技术架构升级”,显然不如“去IOE”这种标签化的短语有力量,短短几个字,既有动词“去”,又牵扯到当世三大企业服务厂商,想不吸引眼球当“网红”都难。
说起淘宝技术架构升级,2007年是一个绕不过去的时间点,呃,这么说的原因,当然很大一部分也因为我是这一年加入淘宝的。那一年的淘宝,意气风发,空降了几位很有影响力的高管,包括阿里巴巴集团现任CEO逍遥子、菜鸟现任CTO菲青、现任VP优昙(记不太清楚是07年底还是08年初了),还有已经离职的前技术VP空闻、前HR VP赵敏等。
2007年的淘宝技术架构,在Java层有一个大名鼎鼎的应用denali。真的是一个应用哦,淘宝前台业务大部分代码都堆砌在这一个应用中,牵一发而动全身。所以空闻和菲青来了以后,招了几个技术好手开始做服务化改造。于是有几个基础性的东西产生了: 毕玄主导HSF(High Speed Framwork)做为服务化的基础RPC框架,解决了服务化后各个应用之间的高性能通信需求;华黎主导的消息中间件Notify(后来Kafka出来后,又用Java重写了个MetaQ),解决了服务化后各应用之间异步依赖的消息通信需求。从产品命名上就可以看出来,包括后面的数据库中间件TDDL,当年淘宝的技术人员是有多土鳖了。有了这两大法宝,服务化和垂直拆分就水到渠成。
从2007年到2009年,马不停蹄的从denali中拆分出了用户中心UIC、商品中心IC、交易中心TC、店铺中心SC、评价中心、收藏夹等等垂直的服务中心,以及每个服务中心对应的上层应用,那些暂时拆不出来的一大坨,就都塞在一个叫Misc的数据库里面。数据库也从原来集中的商品和交易库垂直拆分成了十几套数据库,压力大的用IBM p950和EMC DMX高端存储,压力小一点的用IBM p550和EMC CX中端存储,2007年到2009年在每年业务至少翻番,系统压力翻几番的情况下,土鳖的淘宝技术人员,用土办法见招拆招,算是顺利度过了这段艰难时期,也奠定了后续的技术方向。这段时期当然也有很多插曲,包括各种宕机,甚至是机房两次断电等,那又是另外一个故事了。
时间到了2009年,数据库这么垂直的拆下去,到最后单个数据库只放一张用户表或者一张交易表,用最高端的小型机和最高端的存储,也快顶不住压力了,尤其是连接数。前端无状态的Java应用服务器现在已经能够随着业务压力加机器扩容了,但应用加机器都得要加连接数啊。Oracle是进程模式的,基本上一个连接数需要消耗8~10MB的内存,这样5000个连接数就需要50GB左右的内存,加上SGA,连接数的天花板近在眼前。
数据库当时采用的高端小型机+高端存储+Oracle,价格确实是不便宜。垂直拆分已经搞出了十几套这样的硬件,再来个水平拆分,DBA团队做预算的压力真是山大。所以开始把目光投向了MySQL。当时比较成熟的版本应该还是5.0,2008年底刚刚GA没多长时间的5.1算是新锐版本。我们开始在一些边缘系统尝试,也面向全国开始招MySQL DBA,但其实一个也没招到,只好从应届生开始培养。好在服务化垂直拆分做完以后,大量的关联查询都在应用服务层通过接口调用来解决,数据库基本上就只有基于主键的增删改查操作了,基本上也就相当于一个KeyValue存储在使用。所以说,服务化是数据库水平拆分很重要的一个前提。
但是,服务化只是一个前提。要做核心数据库如用户库和交易库的拆分,还必须要解决IOPS的问题。为什么要用高端存储?因为IOPS啊。传统机械硬盘在可接受的10ms响应时间内的IOPS峰值大约只有80~100。当时我们一个交易库使用的高端存储配置了480块硬盘,可以支撑大约4万~5万的IOPS,按照一台PC Server可以插16块硬盘来计算,需要30台机器。看起来也不多是吧?但这么大的动作做完,肯定需要至少能支撑2~3倍的余量才行啊,所以需要一下子拆分到至少64个节点128台机器,而且很可能两三年后就要朝着上千台的规模去了,而这个规模纯粹是因为IOPS,CPU却是大大浪费的。对于当时还只有十几套Oracle数据库的DBA团队来说,维护成本也犹如达摩克利斯之剑啊。
正所谓车到山前必有路。我们在Percona的mysqlperformanceblog.com上了解到了一款名叫FusionIO的PCI-E Flash闪存卡,小小一片印刷电路,竟然拥有超过十万甚至百万IOPS的能力,响应时间还能到1ms级别,这种法宝正好也开始进入中国了。于是我们相当激进的开始引入测试,并且一举上线,反正压力在身不得不前行,加上有主备复制,还有Notify做Oracle/MySQL异步复制新旧两套数据库系统并行的双保险,就这么搞成了。
所以说,所谓的“去IOE”,在当时其实有两个重要的前提条件:
1. 服务化的完成,数据库变成了简单的KeyValue存储模式;
2. PCI-E Flash卡的成熟,解决了IOPS的问题
PCI-E卡是好东西,可是也很贵,当时一片的价格要10万左右。Flash存储成熟后,英特尔也跑出来要分一杯羹,推出了传统IDE接口的SSD硬盘,虽然单个盘的IOPS比PCI-E卡下降了至少一个数量级,但价格也便宜了很多,而且一台机器上可以插多个盘。所以除了压力非常大的核心数据库,其他的数据库也就可以一股脑儿的从Oracle迁移到了基于SSD的MySQL上。反正迁移和拆分这事儿,一回生二回熟了。
水平拆分的架构升级帮助淘宝沉淀了另外一个神器:TDDL(Taobao Distributed Data Layer)。TDDL除了水平分库的路由功能,还有一个非常核心的模块叫动态数据源。因为原来需要在Java应用中显式的配置每个数据库的连接参数,每次修改都需要重新打包发布应用。水平拆分以后,数据库节点变多了,应用的机器也越来越多,这个事情就越来越不好玩。我就和华黎/沈询商量,能不能把数据库连接参数搞成动态可配置,这样DBA干拆库/主备切换这样的小动作时,应用的同学就不用陪着熬夜了。就这样,这帮靠谱的家伙就搞定了三层的动态数据源。
淘宝这一路的技术架构升级,沉淀出来,其实就三个东西,今天已经在阿里云上做为互联网中间件对外提供服务,这是一个好事情:
企业级分布式应用服务EDAS,就是HSF和阿里巴巴B2B团队搞的Dubbo(已经开源)的内部合体版本
消息队列MQ,就是Kafka的Java版本MetaQ
分布式关系型数据库服务DRDS,就是内部的TDDL
所以我一直认为,“去IOE”更准确的说法应该是淘宝技术架构的大升级;而云计算,则是传统IT架构的一次大升级。这两者相互之间也可以说是有传承的,都是在向着拥抱X86开放式体系,向着弹性升缩的方向升级。但“去IOE”这种简单粗暴的标签化提法,虽然在宣传上比较有效,但其实掩盖了很多的来龙去脉。
在阿里云上遇见更好的Oracle(二)的更多相关文章
- 在阿里云上遇见更好的Oracle(一)
2003年毕业那年正好遇上非典,好不容易找到一份制造工厂的工作,凭着一点点的SQL基础进入了IT部门,在那里第一次听说了Oracle.在此之前,我对数据库的认知基本还停留在Access阶段,耳闻过一点 ...
- 在阿里云上遇见更好的Oracle(四)
2016.5.13,北京,第七届数据库技术大会. 从最初的itpub社区,到后来被it168收购,DBA社区的线下聚会发展成2010年第一届数据库技术大会(DTCC).第一届大会汇聚了社区内活跃的各位 ...
- 在阿里云上遇见更好的Oracle(三)
鬼扯完“去IOE”,继续回来说说这个系列文章的主角Oracle. 在DB-Engine的数据库排行榜中,Oracle已经占据了多年的第一(最新排名可以点击“阅读原文”).当然因为互联网行业的兴起,My ...
- 云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析
在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. “黑色30秒”问题现象的主要特征是:排队的请求(Requests Queued)突增 ...
- 从运维的角度分析使用阿里云数据库RDS的必要性--你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库
开宗明义,你不应该在阿里云上使用自建的MySQL or SQL Server数据库,对了,还有Oracle or PostgreSQL数据库. 云数据库 RDS(Relational Database ...
- 云计算之路-阿里云上:SLB会话保持的一个坑
冒着被大家厌烦的风险,今天再发一篇“云计算之路-阿里云上”.这是在前一篇发过之后真实发生的事情,我们觉得定位问题的过程值得分享.而且估计园子里不少朋友被这个问题骚扰过,我们有责任让大家知道问题的真正原 ...
- 阿里云上到底能运行SAP哪些产品?
本文主要内容大部分来源于SAP已经发布的note: 2552731 - SAP Applications on Alibaba Cloud: Supported Products and IaaS ...
- 云计算之路-阿里云上:原来“黑色0.1秒”发生在socket读取数据时
在昨天的博文(云计算之路-阿里云上:读取缓存时的“黑色0.1秒”)中我们犯了一个很低级的错误——把13ms算成了130ms(感谢陈硕发现这个错误!),从而对问题的原因作出了错误的推断,望大家谅解! 从 ...
- 如何在阿里云上部署war包到tomcat服务器
一. 准备工作:xshell和xftp 首先我们得确保,xshell能够远程连接阿里云ECS,xftp能够保证windows和linux之间的文件传输(当然也可以选择FileZilla,但xftp感觉 ...
随机推荐
- Android学习笔记_40_系统结构 目录结构
1.系统结构: 一.应用程序层 Android平台不仅仅是操作系统,也包含了许多应用程序,诸如SMS短信客户端程序.电话拨号程序.图片浏览器.Web浏览器等应用程序.这些应用程序都是用Java语言编写 ...
- Ueditor插入script标签
对于这个问题.我想有的人会遇到有的人不会遇到,后面说为什么. 有的人会百度解决问题.百度官方文档这样回答 然而你去editor_config.js搜索根本找不到这个配置.(百度你该更新了.....) ...
- C# 基础(一) 访问修饰符、ref与out、标志枚举等等
C# 基础(一) 访问修饰符.ref与out.标志枚举等等 一.访问修饰符 在C#中的访问修饰符有:private.protected.internal.public public:公共类型,同一程序 ...
- AngularJS显示一个简单表格
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- deep learning学习记录二
接着我的微博继续八卦吧 微博里问了几个人,关于deep learning和cnn的区别,有不少热心网友给了回答,非常感谢.结合我听课和看文章的理解,我大胆大概总结一下: 在上世纪90年代,neural ...
- watch、computed、methods的区别
1. `computed`属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算.主要当作属性来使用,要return出去一个值:2. `methods`方法表示一个具体的操作,主要书写业务逻辑:3. ...
- Dubbo源码分析之ExtensionLoader加载过程解析
ExtensionLoader加载机制阅读: Dubbo的类加载机制是模仿jdk的spi加载机制: Jdk的SPI扩展加载机制:约定是当服务的提供者每增加一个接口的实现类时,需要在jar包的META ...
- iOS Block界面反向传值小demo
1.在第二个视图控制器的.h文件中定义声明Block属性: // 定义block @property (nonatomic, copy) void (^NextViewControllerBlock) ...
- DBCacheServer升级
前段时间完成了该服务的设计的功能,花了很多时间和经历,最终完成了一个版本,已经测试了:现在后期再次在以前的基础上,完成了一些扩展. 1.扩展了内存存储 最初版本只是采用了gauva cache进行存储 ...
- jquery mobile 移动web(4)
下拉菜单: 设置label 元素的for 属性为 select label 元素的文本内容作为选项的名称 定义div元素并设置data-role 属性值为 fieldcontain. <div ...