淘宝在线交易数据演变

57
淘淘淘淘淘淘淘淘淘淘 胡胡胡 胡胡胡 () 2012-04-21

Upload: gail-mullen

Post on 30-Dec-2015

86 views

Category:

Documents


5 download

DESCRIPTION

淘宝在线交易数据演变. 胡嘉川(牧劳) 2012-04-21. 主要内容. 一次淘宝购物之旅 交易业务和系统结构介绍 2003~2008 从 Mysql 到小型机 Oracle 2009 年交易库拆分为买家库和卖家库 2010 年交易卖家库的优化和买家库一拆二 2011 年交易卖家库从 Oracle 到 Mysql , 磁盘 SSD 2011 年交易买家库去小型机和 Oracle, 磁盘 FusionIO. 一次淘宝购物之旅. 一次淘宝购物之旅. 第一步:找到想买的宝贝. 一次淘宝购物之旅. 第二步:查看宝贝详情. 一次淘宝购物之旅. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 淘宝在线交易数据演变

淘宝在线交易数据演变

胡嘉川(牧劳)2012-04-21

Page 2: 淘宝在线交易数据演变

一次淘宝购物之旅交易业务和系统结构介绍2003~2008 从 Mysql 到小型机 Oracle2009 年交易库拆分为买家库和卖家库2010 年交易卖家库的优化和买家库一拆二2011 年交易卖家库从 Oracle 到 Mysql, 磁盘 SSD2011 年交易买家库去小型机和 Oracle, 磁盘 FusionIO

主要内容

Page 3: 淘宝在线交易数据演变

一次淘宝购物之旅

Page 4: 淘宝在线交易数据演变

一次淘宝购物之旅第一步:找到想买的宝贝

Page 5: 淘宝在线交易数据演变

一次淘宝购物之旅第二步:查看宝贝详情

Page 6: 淘宝在线交易数据演变

一次淘宝购物之旅第三步:把想买的宝贝加入购物车

Page 7: 淘宝在线交易数据演变

一次淘宝购物之旅第四步:结算订单

Page 8: 淘宝在线交易数据演变

一次淘宝购物之旅第五步:付款

Page 9: 淘宝在线交易数据演变

一次淘宝购物之旅第六步:查看购买的宝贝

Page 10: 淘宝在线交易数据演变

交易业务和系统结构介绍

Page 11: 淘宝在线交易数据演变

淘宝交易数据库的组成结构

买家库1

买家库2

买家库3

买家库32

Mysql + FusionIO

卖家库1

卖家库2

卖家库3

卖家库16

Mysql + SSD

Hbase集群

交易数据库

历史库

Page 12: 淘宝在线交易数据演变

买家库的业务结构

已买到 交易流程 单条查询

下单

付款

确认收货

退款

买家数据库

Page 13: 淘宝在线交易数据演变

卖家库的业务结构

卖家数据库

已卖出 Detail页交易查询 TOP导出订单

Page 14: 淘宝在线交易数据演变

淘宝交易流程介绍

下单 付款 发货 确认收货

COD交易 卡易售 自动发货 分销交易

酒店交易

机票交易 普通宝贝 直冲交易 商超交易

商城家装

Page 15: 淘宝在线交易数据演变

淘宝交易角色介绍

买家 卖家

下单

付款

确认收货

交易查询

发货

修改价格

交易查询

Page 16: 淘宝在线交易数据演变

淘宝交易数据库的系统结构

消息中间件 交易复制系统

交易服务系统 买家库

卖家库

Page 17: 淘宝在线交易数据演变

2003~2008从MYSQL到 Oracle

Page 18: 淘宝在线交易数据演变

2003年的数据库体系

MySQL Master

……

Apache

Mod_php4

Pear DB

Auction

Apache

Mod_php4

Pear DB

Member

Apache

Mod_php4

Pear DB

Search

Apache

Mod_php4

Pear DB

MySQL Slave

MySQL Slave

复制 复制

读写读

Page 19: 淘宝在线交易数据演变

2003年到 2008年数据库的演变

Oracle ,小型机Mysql

商品

用户

交易

业务发展 垂直拆分

2008 年交易日均达到 200 万订单

Page 20: 淘宝在线交易数据演变

2009年交易库拆分为买家库和卖家库

Page 21: 淘宝在线交易数据演变

2009年交易库概况

Oracle

小型机 EMC交易主库

交易写入

已买到查询

已卖出查询

宝贝详情

TOP导订单

2009 年日均交易达到 600 万订单

Page 22: 淘宝在线交易数据演变

把卖家查询分离出去

已卖出

Detail页

各种卖家辅助工具

TOP导出订单

累计售出数

销售列表

Page 23: 淘宝在线交易数据演变

如何拆分卖家库( 2009年 7月)

买家

卖家

买家库

卖家库

写交易,已买到

买家单条查询交易

卖家单条查询交易和写交易

按卖家查询交易

16个 Oracle节点

Page 24: 淘宝在线交易数据演变

如何迁移和实时复制订单数据

交易系统

订单更改发 Notify 消息

卖家库交易复制系统

订阅交易消息

实时更新卖家库数据

Page 25: 淘宝在线交易数据演变

卖家库拆分后所承担的业务结构

卖家库主库

卖家库备 1

卖家库备 2已卖出查询

Detail页交易查询

TOP及其它卖家查询

Page 26: 淘宝在线交易数据演变

卖家库拆分后的一些故障

卖家库1

卖家库2

卖家库3变慢

卖家库3

卖家库4

HSF服务

前端请求

Page 27: 淘宝在线交易数据演变

防止此问题采取的措施 -流控

Page 28: 淘宝在线交易数据演变

防止此问题采取的措施 -监控

卖家主库监控

卖家备一监控

卖家备二监控

Page 29: 淘宝在线交易数据演变

2010年交易卖家库的优化和买家库一拆二

Page 30: 淘宝在线交易数据演变

卖家库的压力越来越大

大卖家查询

各类卖家辅助工具

TOP 订单导出

Detail 订单查询

备1

卖家主库

备2

卖家数据库

Page 31: 淘宝在线交易数据演变

卖家库的优化 -查询 Tair化

累计售出 Tair化

销售列表 Tair化

卖家提醒 Tair化

Page 32: 淘宝在线交易数据演变

卖家查询 Tair化原理

Notify

交易系统

Detail Tair

交易复制系统

获取累计售出数和销售列表

Tair 里没数据,到 TP取

业务变更,实时更新 Tair

Page 33: 淘宝在线交易数据演变

买家库拆分方案准备 -选型

一拆二

一拆多

Oracle

Oracle

comm

comm2

Comm 备库

Comm2 备库

小型机 +EMC

PC+EMC

Oracle

Oracle

Page 34: 淘宝在线交易数据演变

买家拆分方案准备 -业务模型

已买到查询

交易流程 买家 单条查询

Page 35: 淘宝在线交易数据演变

买家拆分确定最终方案

一拆二

Comm(交易老主库 )

Comm(交易老备库 )

Comm备 (原 IC主 )

Comm2备 (原 IC备 )

交易数据是冗余两份,不需要迁移数据不使用 TDDL ,对 DAO 层暴露路由

Page 36: 淘宝在线交易数据演变

买家拆分准备工作,订单 ID路由

订单 ID 6323940234

Sequence

79 64

买家 ID后两位

卖家 ID后两位

( 1 ) 定位具体库( 2 ) 为保持简单老订单 ID ,直接查两次( 3 ) 不依赖路由表

Page 37: 淘宝在线交易数据演变

2011年卖家库去 O和买家库去 IOE

Page 38: 淘宝在线交易数据演变

卖家库继续只有一倍余量

卖家查询的 IO瓶颈越来越大

Oracle的授权费用问题

Page 39: 淘宝在线交易数据演变

卖家库的去 O选型

KSearch OceanBase

卖家库

Mysql + SSD

目标:解决磁盘 IO 瓶颈

Page 40: 淘宝在线交易数据演变

卖家库去 O的详细步骤

1. 设定 4倍容量, 4倍性能余量目标

2. 收集接口访问数据,准备性能测试方案

3. 准备交易增量复制和全量导入

4. Beta卖家查询,观察日志

5. 全部切换到Mysql,添加监控

Page 41: 淘宝在线交易数据演变

买家库去 IOE前的准备 -已买到的 Tair化

已买到列表

订单详情

Page 42: 淘宝在线交易数据演变

交易买家库扩展目标( 2011年)

当前性能情况

集群 QPS: 7万 /秒

集群 TPS: 3000/秒

极限性能情况

集群 QPS: 14万 /秒

集群 TPS: 6000/秒

交易买家库 Oracle 集群只有一倍余量

拆分后目标

集群 QPS: 42万 /秒

集群 TPS: 19万 /秒

目标: 4 倍数据量下,支撑 6 倍现有系统压力

Page 43: 淘宝在线交易数据演变

交易买家库去 IOE硬件选型 -Fusion IO

IOPS性能很高

寿命较长

较 SSD成本高

稳定性比 SSD好

Page 44: 淘宝在线交易数据演变

交易买家库去 IOE硬件选型 -SSD

相对 FIO便宜不少

满足买家库性能要求

极端情况稳定性较 FIO差

极端情况稳定性较 FIO差

Page 45: 淘宝在线交易数据演变

交易买家库去 IOE硬件选型 -EMC+PC

Oracle结合很好,不丢数据

有 4倍余量

成本过高,扩展性不好

Page 46: 淘宝在线交易数据演变

交易买家库去 IOE硬件选型 -成本对比当前买家 Oracle 主库成本: 2200 万RMB

RAID:504万 RMB

不做 RAID: 364万 RMB

RAID:294万 RMB

1060万 RMB

Page 47: 淘宝在线交易数据演变

交易买家库去 IOE最终硬件选定 -FusionIO

稳定性好

性能最好,性价比高

硬件在发展,成本在降低

性能测试结果: MYSQL 成为了性能瓶颈, FIO 的极限远未达到单台 QPS:3.5W * 16 = 56 万单台 TPS:1.2W * 16 = 19.2 万

Page 48: 淘宝在线交易数据演变

交易买家库去 IOE-如何分库分表

分库分表目标

保持简单

考虑4倍数据量

考虑4倍性能

考虑未来节点扩展

分 32 逻辑库, 16 台服务器1024 张表,尽量只对核心表作分库分表减少各表事务依赖,把其它业务放到杂表库

Page 49: 淘宝在线交易数据演变

交易买家库去 IOE-新订单 ID路由准备

订单 ID 6323940234

Sequence

79 64

买家 ID后两位

买家 ID后 3, 4位

( 1 ) 定位具体库( 2 ) 添加路由 Tair ,通过 Tair 拿到具体的买家 ID( 3 ) 新订单 ID 直接通过 ID 里的路由信息定位库和表( 4 )老订单 ID 会随着历史库迁移,访问慢慢变少

Page 50: 淘宝在线交易数据演变

交易买家库去 IOE-更新丢失如何补偿

交易系统

支付宝

买家库

对账系统

通过支付宝恢复淘宝交易

Page 51: 淘宝在线交易数据演变

交易买家库去 IOE-增量复制和全量导入

交易系统

Notify

买家库(Oracle)

Tradelogs

订阅交易消息复制

买家库(Mysql)

交易数据写入

对账系统

Page 52: 淘宝在线交易数据演变

交易买家库去 IOE-如何 Beta

交易系统 买家库(Oracle)

写交易

买家库(Mysql)

已买到和订单详情查询 Mysql

Page 53: 淘宝在线交易数据演变

交易买家库去 IOE-容灾方案

单库容灾切换

Mysql主库 Mysql备库

TDDL 动态数据源切换(可批量切换)

Mysql回切 Oracle

Oracle买家库 Mysql买家库

程序开关切换

Page 54: 淘宝在线交易数据演变

交易买家库去 IOE-停机发布

数据一致性保证

全量对账

每天增量对账

停机前一天开启实时对账

发布阶段

实时对账保证停前数据一致

停 Oracle写

发新代码

Page 55: 淘宝在线交易数据演变

经验教训总结

Page 56: 淘宝在线交易数据演变

一些经验教训尽量短事务,利用消息中间件实现最终一致性更新数据按照固定的顺序更新,防止死锁处理异步事务比同步事务快导致事务回滚率高尽量去掉一切单点,设计快速容灾手段对资源做好流量控制,防止互相影响建立快速对账的手段,出问题时可以快速恢复数据底层改动线上 BETA 时尽量使用异步方式数据库有较大余量时尽量不要引入实时缓存

Page 57: 淘宝在线交易数据演变

谢谢大家

我现在愿意回答您的任何问题