在阿里云上遇见更好的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感觉 ...
随机推荐
- 【洛谷P1801】黑匣子
黑匣子 题目链接 看到题解中“维护两个堆”,突然想到了这道题的解法 维护两个堆:大根堆h1, 小根堆h2 大根堆里的是最小的i个值,小根堆里是剩下的值 每Add一个值时 插入到小根堆中, 再比较小根堆 ...
- lucene&solr学习——solr学习(二) Solr管理索引库
1.什么是solrJ solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图: 依赖jar包: 2 ...
- kinect v2
http://www.tuicool.com/articles/NbmyyeU https://channel9.msdn.com/Blogs/raw-tech/Making-your-body-th ...
- Java基础随笔
1.一些简单的dos命令: – d: 回车 盘符切换 – dir(directory):列出当前目录下的文件以及文件夹 – del:删除文件 – ...
- Restframework中的Request
1.介绍 该篇博客主要介绍restframework内置的Request类,它扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 如: 在APIView中封装的r ...
- SpringBoot非官方教程 | 第十五篇:Springboot整合RabbitMQ
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot15-rabbitmq/ 本文出自方志朋的博客 这 ...
- iOS百度地图简单使用详解
iOS百度地图简单使用详解 百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索.路径规划.地图标注.离线地图.定位.周边雷达等丰 ...
- Largest Rectangle in a Histogram(hdu1506,单调栈裸题)
Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- spring boot 小案例
1. SpringBoot 1.1. 概要 在传统的SSM框架应用过程中,存在大量的配置文件,及相关的配置项,例如: 1. DispatcherServlet 2. CharacterEncoding ...
- Percona-Tookit工具包之pt-table-checksum
Preface The master-slave replication is commonly used in our product evironment.On account o ...