演进过程
看了《淘宝技术这十年》,总结于此。
LAMP架构
从无到有
2003年,eBay 和易趣在资本方面正打得不可开交,那怎么在最短的时间内把一个网站从零开始 建立起来呢?
淘宝为了尽快上线,仅花了一个月把买来的LAMP(Linux+ Apache+MySQL+PHP)改造上线。主要的改造是:从一个数据库进行所有的读写操作,拆分成一个主库、两个从库的结构,读写分离。
这么做的好处有几点:有了备份,使得安全性增加了,读写效率得以提升。随着用户需求和流量的不 断增长,系统做了很多日常改进,服务器由最初的一台变成了三 台,一台负责发送Email、一台负责运行数据库、一台负责运行 WebApp。一段时间之后,商品搜索的功能占用数据库资源太大了 (用like搜索的,很慢),2003年7月,多隆又把阿里巴巴中文站 的搜索引擎iSearch搬了过来。
数据库切换
在2003年年底,MySQL已经撑不住了,技术的替代方案非常简单,就是换成Oracle。换为Oracle的原因除了它容量大、稳定、 安全、性能高之外,还有人才方面的原因。在2003年的时候,Oracle给全球的技术专家颁发一些头衔,其中最高级别的叫ACE,被授予这个头衔当年全球只有十几名,而阿里巴巴就有4名。
Oracle的性能和并发访问能力之所以强大,有一个关键性的设计——连接池,连接池中放的是进程级别的长连接,要独占一部分内存空间。也就是说,这些连接数在固定内存的Oracle Server 上是有限的,任何一个请求只需要从连接池中取得一个连接即可,用完后释放,这不需要频繁地创建和断开连接,
但对于PHP语言来说,它对数据库的访问都是很直接的。每一个请求都要一个连接。如果是长连 接,应用服务器增多时连接数就多了,就会把数据库拖挂;如果是短连接,频繁地连接后再断开,性能会非常差(而Java语言有很多现成的连接池)。为了解决这个问题,引入了一个开源的连接池代理服务SQL Relay,提供连接池的功能,多隆对它进行了一些功能改进之后,系统的架构就变成了如下形式。
后来数据量变大后,本地存储无法 满足了,买了NAS(Network Attached Storage,网络附属存储), NetApp(Network Appliance,美国网域存储技术有限公司)的 NAS作为数据库的存储设备,加上Oracle RAC来实现负载均衡。后来采购了Dell和EMC合作的SAN低端存储,性能一下提升了十几倍,这才比较稳定了。再后来,数据 量更大了,存储的节点一拆二、二拆四,RAC又出问题了,这才 踏上了购买小型机的道路。在那段不稳定的时间里,替换完数据库后,时间到了2004年春天,他们在把数据的连接放 在SQL Relay之后就噩梦不断,这个代理服务经常会死锁,如同之 前的MySQL死锁一样。虽然多隆做了很多修改,问题很多,最快的解决办法就是“重启” 它的服务。这在白天还好,只要连接上机房的服务器,把进程杀 掉,然后开启就可以了。但是最痛苦的是它在晚上也要死掉,于 是工程师们不得不24小时开着手机,一旦收到“SQL Relay进程挂 起”的短信,打开电脑连上机房的网络重 启服务。
从Php到Java
2004年初, SQL Relay的问题解决不了,数据库必须要用Oracle,只有换开发语言了。
Java是当时 最成熟的网站开发语言,它有比较良好的企业开发框架,被世界 上主流的大规模网站普遍采用。现在摆在他 们面前的问题是用什么办法把一个庞大的网站从PHP语言迁移到 Java?
他们的大致方案是 给业务分模块,一个模块一个模块地渐进式替换。如用户模块, 老的member.taobao.com继续维护,不添加新功能,新功能在新 的模块上开发,跟老的模块共用一个数据库,开发完毕之后放到 不同的应用集群上,另开一个域名member1.taobao.com,同时再 替换老的功能,替换一个,就把老的模块上的功能关闭一个,逐 渐把用户引导到member1.taobao.com,等所有的功能都替换完之 后,关闭member.taobao.com上。
再说说用到的Java MVC框架,有个架 构师周悦虹,他在Jakarta Turbine的基础上做了很多扩展,打造了 一个阿里巴巴自己用的MVC框架WebX ,这个框架