5、阿里巴巴实践分析理解数据架构演进
在阿里巴巴的商品页面有很多元素,有图片、价格、能够选择颜色、视频、评论、成交信息、以及一些说明等,这些数据是多种多样的。
如此多样的数据很显然一个MySQL是无法解决的。因为一个数据库中要么放视频,要么放评论,有些是需要经常改的,有些是不需要经常改的,
- 最早阿里巴巴在1999年的第一代网络架构,此时的架构用的还是Oracle数据库。
- 2000年正式进入Java时代,最早的时候阿里是从国外购买的PHP制作的网站,改成Java后就变成了Java+Servlet。
- 2001-2004进入了一个比较繁重的时代EJB时代
- 2005年-2007年就开始了去EJB,开始了EJB的重构,用到了Spring引入了iBatis,Antx,这个时候MQ是消息队列,数据挖掘,也就是阿里在2007年就开始做大数据了。
- 2008-2009是淘宝飞速发展的一年,这一年阿里几乎把底层都换了,此时因为大量的数据,阿里不得不开始做分布式,使用了memcached集群,MySQL+数据切分,一些基本的分布式存储,Hadoop、以及CDN(静态资源加速)
- 2010年镜像就开始使用了,开始可以做秒杀,这个时候NoSQL已经开始使用。应用服务器开始升级。
接下来进入到了第五代网站架构
第五代网络架构几乎变革了阿里的所有的东西
- 敏捷开发,极限编程,每天都上线大量的需求,程序一定要保证这些需求都能够实时的被处理。此外,应用程序系统越来越大,耦合恶化,所以一定要降低耦合性,开发成本越来越高,因为一个新的程序员入职后,如果耦合太大了,需要将整个系统都研究一遍,目前来看没有多少程序员能够做的到。
- 开放,从Facebook和App Store得到的启示一定要开源,开源才是技术的王道,吸引了很多人参与阿里的开发。
- 网站的体验,任何一家互联网公司,都不可能只是简简单单让用户能用就可以了!因为大量的公司都是做的相同的业务,所以就被用户逼着用户体验更好。随着这样的竞争,业务就越来越完善了。对于开发者的要求也是越来越高。
面对以上的这些问题,阿里就开始对第五代网站架构去一一的实现,为了实现以上三种使命有很多的挑战
数据层:面临如此多种类的数据如何去处理,所以数据层的解决方案就是统一数据服务平台,就像Java中的JDBC一样,JDBC就是实现的这个功能,底层的各种数据库不管是MySQL、Oracle还是SqlServer或者别的数据库都通过JDBC来进行连接访问。使用JDBC来去差异化。
我们看到阿里的数据架构种类很多有Oracle、MySQL、cobar、搜索引擎等等如果每个前端页面都调取就十分的麻烦,这里在架构设计中有一句话叫做架构师的真理是“没有什么是加一层解决不了的,如果加一层解决不了就加两层”,就像JDBC去差异化一样。
-
此外一个基本的商品信息,基本信息就存储在MySQL这种关系型数据库中淘宝早年就已经开始去IOE,也就是IBM、Oracle、EMC存储的过度依赖,这时就是阿里的王坚模式(推荐文章:阿里云的这群疯子)当然淘宝内部使用的MySQL并不是我们常用的MySQL
-
商品的基本属性、商品的描述、评论(文字比较多)文字比较多就不能放在关系型数据库中,就可以放在文档型数据库中,文档型数据库对于IO的处理性能比较高一点比如MongoDB,
-
图片信息存放在一些第三方的接口、分布式文件系统如FastDFS、淘宝自己的TFS、谷歌的GFS、Hadoop的HDFS、阿里云的oss云存储
-
商品的关键字(用来搜索的)这时不可能使用SQL来搜索,这个时候就需要用到一些搜索引擎,比如solr、elasticserach,淘宝用的是ISearch(这里不得不提阿里的“多隆”他是阿里的第一个程序员)
-
商品热门的波段信息,比如一些秒杀,这些信息会存放在内存数据库中比如Redis、tair、memcache
-
商品的交易、外部的支付接口,这些需要调用一些三方应用,比如支付宝、银行接口
我们可以看到一个简单的商品页面他们来自以上不同类型的数据库,但是还能做得到。
大型互联网应用面对的问题:
- 数据类型太多了
- 数据源繁多,经常重构
- 数据要改造
解决问题
也就是在应用和底层之间构建一层代理层,所有的东西都提供统一的API
从图中我们知道,之前的数据库连接是所有的应用直接连接数据库,阿里在中间加了一层统一数据服务平台。就像Java去连接JDBC去操作数据库一样。UDSL上线之后阿里的数据架构大幅简化了,开发更加敏捷了,但是性能问题还是很严重,这个时候网站面临的主要问题是网站太大了,缓存太多了,只能缓存热点数据,面对这样的问题阿里的结局方案是开发热点缓存平台,提供给UDSL作为缓存系统
首先作为UDSL的二级缓存,是处在整个统一数据服务平台和数据库之间,用户连接统一数据服务平台,而统一数据服务平台不直接连接数据库而是连接到热点缓存,