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