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