我们都知道淘宝,也都在使用淘宝。但让我们自己制作一个淘宝app很难,让我们想出关于淘宝的架构更难。最近阅读了《淘宝数据魔方技术架构解析》(https://mp.weixin.qq.com/s?__biz=MzAxNjAzMTQyMA==&mid=2648476063&idx=1&sn=882fb8584b82107d5af191af5b805d0e&chksm=83d3224cb4a4ab5a72e04dbaa6c6621cc866ab913bb7abb1aa8e6f7860e128501ca1a3c26d4a&scene=21#wechat_redirect),感叹人类的智慧吧!这篇文章是介绍淘宝在海量数据产品技术架构方面的探索。
淘宝网拥有国内最具商业价值的海量数据。
按照数据的流向来划分,可以把淘宝数据产品的技术架构分为五层,分别是数据源、计算层、存储层、查询层和产品层。位于架构顶端的是我们的数据来源层,这里有淘宝主站的用户、店铺、商品和交易等数据库,还有用户的浏览、搜索等行为日志等。这一系列的数据是数据产品最原始的生命力所在。
对于计算层,在淘宝中主要有两种计算平台——“云梯”和“银河”,他们是计算层的主要组成部分。“云梯”主要处理数据源层实时产生的数据,这些数据通过淘宝的数据传输组件DataX、DbSync、Timetunnel准确实时地传输到一个拥有大量节点的Hadoop集群上,这个集群我们就称之为“云梯”。在“云梯”上,不同的作业对于这些实时产生的数据根据不同的产品需求会进行不同的MapReduce计算,但是该计算结果可能并不是我们在前端看到的数据,而只是数据冗余与前端计算之间做了一个平衡的结果,它只是一个中间结果,在前端显示的数据是对这些计算结果进一步处理的结果。显然,如果我们希望某些数据可以尽快的传送到前端,这时候我们再使用“云梯”计算就比较慢了,因此就有了“银河”计算平台。“银河”,顾名思义,是“水流”,它是对流式数据进行处理,通过对来自Timetunnel的实时数据做实时计算,然后将计算结果在尽可能短的时间里更新到NoSQL数据库中,以便前端的使用。但是,这两种计算平台都不太适合用于实时的数据查询,“云梯”更适合用于离线计算,“银河”要想实现实时查询,需要完整地将数据接收,实时计算、存储、查询等功能都集成在这个计算平台上,显然,这又需要分层实现,最终又落到目前的架构上。
因为“云梯”和“银河”无法提供实时数据查询,淘宝针对前端设计了专门的存储层。首先,淘宝选择MySQL的MyISAM引擎作为底层的数据存储引擎。在此基础上,为了应对海量数据,淘宝设计了MyFox,它是分布式MySQL集群的查询代理层,使分区对前端应用透明。在MyFox中,根据需要数据的情况,将MyFox中的节点分为“冷节点”和“热节点”,“冷节点”,顾名思义,存放人们冷落、不太关心的数据,即一些访问频率较低,产生时间较长的数据,与之相对地,“热节点”存放的是最新产生的,用户访问频率较高的数据。不同的数据存放在效率不同的硬盘中,例如,“热节点”中的数据存放在SAS硬盘中,成本较高;“冷节点”中的数据存放在SATA硬盘中,成本较低。
以下是淘宝的总体架构图:
可以说,淘宝在处理大量数据的这方面做得相当不错了。