揭秘 | 成立17年的淘寶,萬億級海量交易訂單都儲存在哪?

阿里巴巴資料庫技術發表於2020-04-28

作者 | 北樓 / 冷之

阿里巴巴旗下的淘寶和天貓作為國內最大線上購物平臺,提供售賣的商品數目數以億計,其活躍使用者數量超過了7億人,服務的商家的數量也在數千萬量級。面對效能和成本的雙重壓力,阿里資料庫核心團隊如何應對?


淘寶交易訂單系統介紹

天貓和淘寶每天發生的實物和虛擬商品的交易達到億級別。一次成功交易的整個鏈路會涉及到會員資訊驗證,商品庫資訊查詢,訂單建立,庫存扣減,優惠扣減,訂單支付,物流資訊更新,確認支付等。
鏈路中的每一環都涉及到資料庫中記錄的建立和狀態的更新,一次成功的交易可能對應到後臺資訊系統上數百次資料庫事務操作,支撐交易系統的整個資料庫叢集則會承擔每日高達數百億的事務讀寫。這除了給資料庫系統帶來巨大的效能挑戰之外,每日遞增的海量資料也帶來巨大的儲存成本壓力。
交易訂單作為其中最為關鍵的資訊,由於可能涉及交易糾紛處理,需要隨時提供使用者查詢,必須永久的記錄在資料庫中。淘寶成立至今近17年,所有與訂單相關的資料庫記錄總量達到了萬億級別,其所佔用的磁碟空間也早已超過PB級。

在一個這樣大體量的資料集上,需要能夠滿足使用者隨時查詢的低延時需求,同時需要達到極低的儲存成本,在技術上是一個非常大的挑戰。

揭秘 | 成立17年的淘寶,萬億級海量交易訂單都儲存在哪?

使用者的歷史訂單記錄資料量巨大且不能丟失


淘寶交易訂單庫的架構演進歷史

淘寶從2003年成立至今近17年的時間,隨著流量不斷上漲,交易訂單資料庫的架構也經歷過數次演進。

揭秘 | 成立17年的淘寶,萬億級海量交易訂單都儲存在哪?

第一階段,開始由於流量較小,使用了一套Oracle資料儲存了所有的訂單資訊,新訂單建立和歷史訂單查詢都在同一套資料庫進行。

第二階段,由於歷史訂單量資料量越來越大,單一一套庫已經不能滿足同時滿足效能和容量的問題,於是對交易訂單庫進行了拆分,單獨建立了一個Oracle歷史庫,將三個月以前的訂單遷移進歷史庫,同時由於資料量巨大,查詢效能不能滿足需求,因此當時的歷史訂單不提供查詢功能。使用者只能查詢三個月之內的訂單資訊。


第三個階段,為了解決擴充套件性和儲存成本問題,交易歷史庫整體遷移到了HBase方案,這套方案在當時很好了解決了儲存成本和業務查詢需求這2個訴求。整體方案是使用主表結合索引表,查詢訂單詳細資訊透過主表完成,透過買家或者賣家ID查詢訂單,則需要藉助索引表先得到訂單號。


但這個方案遺留一個問題:訂單並不是嚴格按照90天進行遷移的,有很多型別的訂單並不遷移到歷史庫,導致已買到--訂單列表的排序是亂序的,已買到的訂單列表不是嚴格按照時間由近到遠排序的,使用者如果按照訂單列表一頁一頁往下翻,會發現自己最近的訂單”突然丟了”(實際上沒有丟的,只是亂序了,再往後翻就有了)。
第四個階段,歷史庫採用基於X-Engine引擎的PolarDB-X叢集,在滿足儲存成本的同事,提供與線上庫一樣的索引能力,解決亂序問題。


淘寶交易訂單庫的業務痛點



回顧淘寶交易庫的演進歷史,自拆分出獨立的交易歷史庫之後,在持續十年時間裡,業務團隊和資料庫團隊一直在應對幾個核心的挑戰:
  • 儲存成本,每日寫入量巨大且資料永不刪除,必須要保證極低的成本。

  • 節省儲存成本的前提下,保證豐富的查詢特性,例如按時間維度排序等。因此底層資料庫需要支援二級索引,且二級索引需要保證一致性和效能。

  • 保證較低的查詢延時,不影響使用者使用體驗。雖然90天前的歷史訂單的查詢量比90天內要少很多,但這依然是直接面對使用者的,需要保證長尾延時在一定限度內。

在2018年,因為資料庫儲存的原因導致的訂單排序錯亂的問題,受到越來越多的投訴,給使用者帶來非常大的困擾,業務上決定根治這個問題。從前面的分析總結看,理想中的交易歷史庫方案需要同時滿足三個條件: 低成本,低延時,特性豐富。使用和線上庫一樣的InnoDB引擎則滿足不了儲存成本的要求,而使用HBase則滿足不了一致性二級索引等要求。


基於X-Engine引擎的歷史庫方案


2018年,阿里自研的X-Engine引擎逐步在集團內部落地,其針對阿里巴巴交易業務的流水型特徵設計了原生的冷熱分離的架構,X-Engine引擎中的冷資料記錄在資料頁中緊湊排列並預設對所有資料塊進行壓縮,這套架構兼顧了效能和成本,很快在內部非常多的業務中落地,例如:X-Engine如何支撐釘釘資料量激增
在考察交易歷史庫的方案時,一個思路是合併線上庫和歷史庫,依賴X-Engine自身的冷熱分離能力,  實現對90天內交易訂單的高效能訪問和90天以前交易訂單記錄的低成本儲存。同時一套統一的交易訂單庫,可以提供諸如二級索引等功能,使用者訂單不能按時間排序的問題也隨之解決,業務層的程式碼將非常簡單。
但交易訂單系統在線上庫/歷史庫分離的架構下迭代了十年的時間,很多業務系統的程式碼對這套分離架構做了相容,考慮到對業務程式碼改造以及遷移的風險,我們在初期繼承了之前線上和歷史分離的架構。只是將原有的HBase叢集替換成了PolarDB-X叢集(基於X-Engine引擎的版本):
  • 線上庫依然沿用之前的MySQL InnoDB叢集,但是隻儲存90天的資料量,90天之前的訂單會被刪除,資料量少,可以保證較高的快取命中率,確保讀寫延時。

  • 透過資料同步將線上庫中超過90天的訂單遷移到歷史庫中,遷移之後該部分訂單從線上庫刪除。

  • 歷史庫切換為X-Engine,儲存全量的交易訂單資料,90之前的訂單讀寫,直接操作歷史庫, 同時歷史庫承接線上庫的所有遷移寫入負載。

揭秘 | 成立17年的淘寶,萬億級海量交易訂單都儲存在哪?

這套架構上線之後,交易歷史庫的儲存成本相比較於使用HBase沒有上升,同時由於歷史庫和線上庫能力相同,可以建立完全一樣的索引,歷史訂單恢復了對訂單按時間排序功能的支援,同時其讀取延時也得到了保證。


資料庫架構參考


在淘寶交易歷史庫的方案中,考慮到業務層面歷史程式碼架構的延續性,採用了InnoDB引擎線上庫和X-Engine歷史庫分離的方案。在這套架構中,X-Engine歷史庫其實同時承擔了線上庫遷移過來的寫入以及90天以前記錄的讀寫流量。 


實際上,考慮到淘寶交易訂單記錄流水型的訪問特徵(最近寫入的記錄會被大量訪問,隨著時間推移,記錄訪問頻次急劇衰減),X-Engine引擎內部的冷熱分離機制就能很好的處理這種流水型業務,所以單一X-Engine資料庫叢集完全解決需求。


對於新開業務或者有大量流水型記錄儲存需求的現有業務且業務層面還未做冷熱分離,我們建議直接使用一套X-Engine引擎,在儲存成本降低的同時,DB層的訪問程式碼會更簡單。基於X-Engine引擎的PolarDB-X分散式資料庫可以同時解決scale out問題和成本問題。


目前X-Engine引擎已經上線阿里雲, 經過阿里內部業務驗證,歡迎有成本和效能需求的使用者購買使用。


揭秘 | 成立17年的淘寶,萬億級海量交易訂單都儲存在哪?


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940574/viewspace-2688964/,如需轉載,請註明出處,否則將追究法律責任。

相關文章