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