Transcript 买家库
淘宝在线交易数据演变
胡嘉川(牧劳)
2012-04-21
主要内容
一次淘宝购物之旅
交易业务和系统结构介绍
2003~2008从Mysql到小型机Oracle
2009年交易库拆分为买家库和卖家库
2010年交易卖家库的优化和买家库一拆二
2011年交易卖家库从Oracle到Mysql,磁盘SSD
2011年交易买家库去小型机和Oracle,磁盘 FusionIO
一次淘宝购物之旅
一次淘宝购物之旅
第一步:找到想买的宝贝
一次淘宝购物之旅
第二步:查看宝贝详情
一次淘宝购物之旅
第三步:把想买的宝贝加入购物车
一次淘宝购物之旅
第四步:结算订单
一次淘宝购物之旅
第五步:付款
一次淘宝购物之旅
第六步:查看购买的宝贝
交易业务和系统结构介绍
淘宝交易数据库的组成结构
交易数据库
买 买 买
家 家 家
库 库 库
1 2 3
买
家
库
32
Mysql + FusionIO
卖 卖 卖
家 家 家
库 库 库
1 2 3
Mysql + SSD
卖
家
库
16
Hbase集群
历史库
买家库的业务结构
买家数据库
已买到
交易流程
下
单
付
款
确
认
收
货
单条查询
退
款
卖家库的业务结构
卖家数据库
已卖出
Detail页交易查询
TOP导出订单
淘宝交易流程介绍
COD交易
酒店交易
下单
机票交易
卡易售
付款
普通宝贝
自动发货
发货
确认收货
直冲交易
分销交易
商城家装
商超交易
淘宝交易角色介绍
买家
下
单
付
款
卖家
确
认
收
货
交
易
查
询
发
货
修
改
价
格
交
易
查
询
淘宝交易数据库的系统结构
写
交易服务系统
读
买家库
卖家库
消息中间件
交易复制系统
2003~2008从MYSQL到Oracle
2003年的数据库体系
……
Auction
Member
Apache
Search
Apache
Mod_php4
Apache
Mod_php4
Apache
Pear DB
Mod_php4
Pear DB
Mod_php4
Pear DB
Pear DB
读
读写
读
MySQL
Slave
复制
MySQL
Master
复制
MySQL
Slave
2003年到2008年数据库的演变
商品
Mysql
Oracle,小型机
业务发展
垂直拆分
交易
用户
2008年交易日均达到200万订单
2009年交易库拆分为买家库和卖家库
2009年交易库概况
Oracle
交易主库
小型机
EMC
2009年日均交易达到600万订单
交
易
写
入
已
买
到
查
询
已
卖
出
查
询
宝
贝
详
情
TOP
导
订
单
把卖家查询分离出去
各种卖家辅助工具
已卖出
TOP导出订单
累计售出数
Detail页
销售列表
如何拆分卖家库(2009年7月)
买家
写交易,已买到
买家单条查询交易
买家库
卖家单条查询交易和写交易
卖家
16个Oracle节点
按卖家查询交易
卖家库
如何迁移和实时复制订单数据
订单更改发Notify消息
交易系统
订阅交易消息
实时更新卖家库数据
卖家库
交易复制系统
卖家库拆分后所承担的业务结构
Detail页交易查询
卖家库备1
卖家库主库
TOP及其它卖家查询
已卖出查询
卖家库备2
卖家库拆分后的一些故障
卖
家
库
1
卖
家
库
2
卖
家
库
3
变
慢
卖
家
库
3
HSF服务
前端请求
卖
家
库
4
防止此问题采取的措施-流控
防止此问题采取的措施-监控
卖家主库监控
卖家备一监控
卖家备二监控
2010年交易卖家库的优化和买家库一拆二
卖家库的压力越来越大
卖家数据库
大卖家查询
各类卖家辅助工具
卖家主库
TOP订单导出
Detail订单查询
备1
备2
卖家库的优化-查询Tair化
累计售出Tair化
销售列表Tair化
卖家提醒Tair化
卖家查询Tair化原理
获取累计售出数和销售列表
Detail
Tair
Tair里没数据,到TP取
业务变更,实时更新Tair
交易复制系统
交易系统
Notify
买家库拆分方案准备-选型
Oracle
一拆二
comm
Oracle
一拆多
comm2
Comm备库
小型机+EMC
Comm2备库
Oracle
PC+EMC
Oracle
买家拆分方案准备-业务模型
已买到查询
交易流程
买家
单条查询
买家拆分确定最终方案
一拆二
Comm(交易老主
库)
Comm(交易老备
库)
交易数据是冗余两份,不需要迁移数据
不使用TDDL,对DAO层暴露路由
Comm备(原IC主)
Comm2备(原IC备)
买家拆分准备工作,订单ID路由
卖家ID后两位
订单ID
6323940234 79 64
Sequence
买家ID后两位
(1) 定位具体库
(2) 为保持简单老订单ID,直接查两次
(3) 不依赖路由表
2011年卖家库去O和买家库去IOE
卖家库继续只有一倍余量
卖家查询的IO瓶颈越来越大
Oracle的授权费用问题
卖家库的去O选型
KSearch
OceanBase
卖家库
Mysql + SSD
目标:解决磁盘IO瓶颈
卖家库去O的详细步骤
1. 设定4倍容量,4倍性能余量目标
2. 收集接口访问数据,准备性能测试方案
3. 准备交易增量复制和全量导入
4. Beta卖家查询,观察日志
5. 全部切换到Mysql,添加监控
买家库去IOE前的准备-已买到的Tair化
已买到列表
订单详情
交易买家库扩展目标(2011年)
当
前
性
能
情
况
极
限
性
能
情
况
集群QPS:7万/秒
集群TPS:3000/秒
集群QPS:14万/秒
集群TPS:6000/秒
交易买家库Oracle集群只有一倍余量
拆
分
后
目
标
集群QPS:42万/秒
集群TPS:19万/秒
目标:4倍数据量下,支撑6倍现有系统压力
交易买家库去IOE硬件选型-Fusion IO
IOPS性能很高
寿命较长
稳定性比SSD好
较SSD成本高
交易买家库去IOE硬件选型-SSD
相对FIO便宜不少
满足买家库性能要求
极端情况稳定性较FIO差
极端情况稳定性较FIO差
交易买家库去IOE硬件选型-EMC+PC
Oracle结合很好,不丢数据
有4倍余量
成本过高,扩展性不好
交易买家库去IOE硬件选型-成本对比
当前买家Oracle主库成本:2200万RMB
RAID:504万RMB
不做RAID:364万RMB
RAID:294万RMB
1060万RMB
交易买家库去IOE最终硬件选定-FusionIO
稳定性好
性能最好,性价比高
硬件在发展,成本在降低
性能测试结果:MYSQL成为了性能瓶颈,FIO的极限远未达到
单台QPS:3.5W * 16 = 56万
单台TPS:1.2W * 16 = 19.2万
交易买家库去IOE-如何分库分表
分库分表目标
保
持
简
单
考
虑
4
倍
数
据
量
考
虑
4
倍
性
能
考
虑
未
来
节
点
扩
展
分32逻辑库, 16台服务器
1024张表,尽量只对核心表作分库分表
减少各表事务依赖,把其它业务放到杂表库
交易买家库去IOE-新订单ID路由准备
买家ID后3,4位
订单ID
6323940234 79 64
Sequence
买家ID后两位
(1) 定位具体库
(2) 添加路由Tair,通过Tair拿到具体的买家ID
(3) 新订单ID直接通过ID里的路由信息定位库和表
(4)老订单ID会随着历史库迁移,访问慢慢变少
交易买家库去IOE-更新丢失如何补偿
交易系统
买家库
通过支付宝恢复淘宝交易
支付宝
对账系统
交易买家库去IOE-增量复制和全量导入
交易数据写入
交易系统
买家库(Oracle)
对账系统
订阅交易消息复制
Notify
Tradelogs
买家库(Mysql)
交易买家库去IOE-如何Beta
写交易
交易系统
已买到和订单详情查询Mysql
买家库
(Mysql)
买家库(Oracle)
交易买家库去IOE-容灾方案
单库容灾切换
TDDL动态数据源切换(可批量切换)
Mysql主库
Mysql备库
Mysql回切Oracle
程序开关切换
Oracle买家库
Mysql买家库
交易买家库去IOE-停机发布
数
据
一
致
性
保
证
全量对账
每天增量对账
停机前一天开启实时对账
实时对账保证停前数据一致
发
布
阶
段
停Oracle写
发新代码
经验教训总结
一些经验教训
尽量短事务,利用消息中间件实现最终一致性
更新数据按照固定的顺序更新,防止死锁
处理异步事务比同步事务快导致事务回滚率高
尽量去掉一切单点,设计快速容灾手段
对资源做好流量控制,防止互相影响
建立快速对账的手段,出问题时可以快速恢复
数据底层改动线上BETA时尽量使用异步方式
数据库有较大余量时尽量不要引入实时缓存
谢谢大家
我现在愿意回答
您的任何问题