关于□张轩丞(朋春)•淘宝数据平台与产品部(杭州)•vi党,脚本语言爱好者•关注NodeJS,cnode社区组织者之一•pengchun@taobao.com•weibo.com:我是aleafs数据平台与产品数据产品用户淘宝网淘宝卖家供应商消费者搜索、浏览、收藏、交易、评价...一些数字□淘宝主站:•30亿店铺、宝贝浏览•10亿计的在线宝贝数•千万量级交易笔数□数据产品:•50G统计汇总结果•千万量级数据查询请求•平均20.8ms的响应时间(6月1日)海量数据带来的挑战□计算•计算的速度•处理吞吐量□存储•存储是为了更方便地查询•硬盘、内存的成本□查询•“大海捞针”•全“表”扫描架构总览主站备库RAC主站日志数据源MyFOXProm存储层数据中间层/glider查询层数据魔方淘宝指数开放API产品Hadoop集群/云梯计算层实时流数据DataX/DbSync/TimeTunnel1500节点,每日40000JOB,处理数据1.5PB,凌晨2点结束,结果20T今天的话题□关系型数据库仍然是王道□NoSQL是SQL的有益补充□用中间层隔离前后端□缓存是系统化的工程关系型数据库仍然是王道关系型数据库□有成熟稳定的开源产品□SQL有较强的表达能力•只存储中间状态的数据•查询时过滤、计算、排序□数据产品的本质•拉关系•做计算SELECTIF(INSTR(f.keyword,'')0,UPPER(TRIM(f.keyword)),CONCAT(b.brand_name,'',UPPER(TRIM(f.keyword))))ASf0,SUM(f.search_num)ASf1,ROUND(SUM(f.search_num)/SUM(f.uv),2)ASf3,ROUND(AVG(f.uv),2)ASf4FROMdm_fact_keyword_brand_dfINNERJOINdim_brandbONf.keyword_brand_id=b.brand_idWHEREf.keyword_type_id=1ANDf.keyword!=''ANDkeyword_cat_idIN('50002535')ANDthedate='2011-07-09'ANDthedate='2011-07-07'GROUPBYf0ORDERBYSUM(f.search_num)DESCLIMIT0,100存储在DB中的数据00.10.20.30.40.50.60.72010/8/102010/9/292010/11/182011/1/72011/2/262011/4/172011/6/62011/7/26十亿分布式MySQL集群□字段+条目数分片□MyISAM引擎□离线批量装载□跨机房互备云梯APPMySQL集群数据装载数据查询MyFOX透明的集群中间层—MyFOX□透明查询•基于NodeJS,1200QPS□数据装载•路由计算•数据装入•一致性校验□集群管理•配置信息维护•监控报警MyFOX-数据查询取分片数据(异步并发)取分片结果合并(表达式求值)合并计算缓存路由SQL解析语义理解查询路由字段改写分片SQL计算规则APC缓存XMyFOX-节点结构MyFOX热节点(MySQL)15kSAS盘,300G*12,raid10内存:24G成本:4.5W/T冷节点(MySQL)7.2kSATA盘,1T*12,raid10内存:24G成本:1.6W/T路由表30天无访问的冷数据新增热数据小结□根据业务特点分库分表□冷热数据分离•降低成本,好钢用在刀刃上•更有效地使用内存SQL虽牛,但是…如果继续用MySQL来存储数据,你怎么建索引?NoSQL是SQL的有益补充全属性交叉运算□不同类目的商品有不同的属性□同一商品的属性对有很多□用户查询所选择的属性对不确定□Prometheus•定制化的存储•实时计算Prom—数据装载PromHbaseHbaseHbase……索引:交易id列表属性对交易1(二进制,定长)交易2Prom—数据查询求SUM(alipay)属性属性值笔记本尺寸13寸笔记本定位商务定位节点11,2,3,4,5,6,7,8,9节点21,2,3,4,5,6,7查索引求交集节点21,2,4,6,7本地SUM运算(Hbase扩展)汇总计算写入缓存Prom—数据冗余□明细数据大量冗余□牺牲磁盘容量,以得到:•避免明细数据网络传输•变大量随机读为顺序读小结□NoSQL是SQL的有益补充□“预算”与“现算”的权衡□“本地”与“集中”的协同其他的数据来源□Prom的其他应用(淘词、指数等)□从isearch获取实时的店铺、商品描述□从主站搜索获取实时的商品数□…异构数据源如何整合统一?用中间层隔离前后端[pengchun]$tail~/logs/glider-rt2.log127.0.0.1[14/Jun/2011:14:54:29+0800]GET/glider/db/brand/brandinfo_d/get_hot_brand_top/where…HTTP/1.1200170.065数据中间层—Glider□多数据源整合•UNION•JOIN□输出格式化•PERCENT/RANKOVER…•JSON输出Glider架构DispatcherController配置解析请求解析一级缓存actionMyFOXProm二级缓存datasourceJOINUNIONfilter缓存是系统化的工程glider缓存系统前端产品一级缓存data二级缓存URL请求,nocache?nocache?nocache?Min(ttl)ttl,httpheaderetag,httpheader小结□用中间层隔离前后端•底层架构对前端透明•水平可扩展性□缓存是把双刃剑•降低后端存储压力•数据一致性问题•缓存穿透与失效回顾□关系型数据库仍然是王道分库分表、冷热分离□NoSQL是SQL的有益补充用冗余避免网络传输和随机读□用中间层隔离前后端异构数据源的整合□缓存是系统化的工程数据一致性、穿透与雪崩矛盾之美SQLNoSQL计算时机“预算”Hadoop/实时计算引擎“现算”MySQL+中间层Hbase+中间层计算场所本地MySQL单机HbaseRegionServer集中MyFOX中间层Prom中间层数据存储冷7200SATA盘HDFS热15000SAS盘+缓存HDFS+缓存谢谢