天貓淘寶海量圖片元信息存儲在哪?

簡介:做者:旺德/志歉算法

1.圖片空間數據庫存儲成本暴漲

圖片空間是淘寶智能圖片中心面向商家提供的免費圖片存儲管理服務,因爲淘寶、天貓主站上累積的用戶圖片數據量很是大(想一想淘寶/天貓的商家和消費者天天要上傳多少圖片!),而且增加量驚人,圖片空間業務面臨着很是巨大的存儲空間和寫入性能壓力。尤爲每一年雙11以前,商家大量更新商品庫存保有單位SKU(Stock keeping Unit),此時數據會急劇增加。
image.png數據庫

淘寶/天貓每日新增大量商品、評論圖片
某年雙十一前夕,當時阿里大部分數據庫系統還使用的是InnoDB存儲引擎,圖片空間的研發同窗梳理雙十一線上風險時,諮詢到DB磁盤及水位的容量是否足夠,咱們曾信誓旦旦地說:「沒有問題,四個月前咱們剛擴了一倍機器」。但是沒過多久就被現實打臉了:不到5個月的時間,業務數據累積了過去6-7年的量,每日增量急劇上升,擴容的磁盤很快也將不夠了。緩存

2.解決方案,擴容仍是換引擎?

爲何選擇新引擎

最簡單粗暴的方法固然是擴容,這樣作風險最小,但卻只能解決眼前的問題。以如今數據的膨脹速度,將來不免屢次擴容。僅僅由於空間不足的問題,致使成本翻好幾倍,這是難以接受的
另一個方法是換引擎,當時阿里主打高性能低成本的自研存儲引擎X-Engine剛剛成熟(TODO:X-ENGINE架構超連接),相較於基於B+-Tree的存儲引擎(例如InnoDB)數據頁存在較多空間浪費,基於LSM-Tree的X-Engine數據徹底緊湊排列,空間利用率更高。而緊湊排列的數據施之前綴壓縮技術,空間使用進一步減小。
image.png架構

X-Engine的Data Block無需原地更新,能夠方便使用通用壓縮算法(zlib,zstd,snapy等)壓縮。全部位於LSM-tree低層次的數據都會默認壓縮。通過大量對比測試,X-Engine默認選用了ZSTD壓縮算法,但同時也保留了對其餘算法的支持。此外後臺compaction會持續刪除無效記錄(LSM-Tree更新和刪除都是寫入新記錄,舊版本記錄再也不被須要時,視爲無效),持續釋放冗餘的空間。
由於上述技術特色,X-Engine對存儲空間的節省幾乎到達了「變態」的程度,以致於當圖片空間庫的數據所有從InnoDB轉移到X-Engine後,空間節省了7倍,以下圖所示
image.png併發

如何作到下降7倍成本

爲何數據從InnoDB遷移至X-Engine後,取得了如此巨大的成本收益?異步

  • 首先,InnoDB採用B+-Tree索引數據,伴隨着數據寫入,樹的節點不停地分裂合併,致使定長的數據頁長期處於「半滿」狀態,空間存在浪費。而X-Engine的更新刪除操做,都是追加寫到內存memtable,不會更改磁盤上的數據,所以這些靜態數據能夠緊湊的排列,不用爲將來的寫入預留空間,空間利用率很高。雖然追加寫會產生冗餘的多版本數據,X-Engine後臺Compaction操做每每能夠及時地清理無用的多版本數據。
  • 其次,圖片空間庫存儲了大量的圖片元信息(例如user_id、圖片地址URL等),這些信息有一個特色:相鄰數據之間類似度很是高,例如同一個user_id每每對應多個圖片地址,圖片地址URL之間的前綴十分類似。X-Engine的前綴壓縮機制保證:相鄰key的相同前綴,儘可能只存儲一次。所以包含圖片元信息的二級索引,通過前綴壓縮,所佔空間不多。
  • 最後,主表的key雖然不能使用前綴壓縮,但通用壓縮算法,面對圖片元信息記錄中大量類似的文本字符(URL等),也能大顯身手,取得理想的壓縮比率。InnoDB雖然也支持數據頁壓縮,且對靜態數據有較好的壓縮比率,可是隨着數據寫入,B+-Tree持續分裂合併,空間很快就會膨脹起來。X-Engine靜態的數據頁,不存在這個問題。

性能表現依然優異

此外,因爲圖片空間是一個高頻使用的應用,若是X-Engine的性能不知足要求,也沒法落地。得益於LSM輕量化寫機制,X-Engine寫入操做本就是優點,況且還引入了group commit和事務處理流水線機制,大大增長了寫入處理的併發度。讀請求本是LSM的弱項,分層的結構和追加寫產生的多版本數據,會增長讀請求查詢路徑的長度,X-Engine爲此作了大量的優化,諸如:多粒度Cache(memtable,Block Cache和Row Cache)、bloomfilter和range scan filter(Surf, SIGMOD'18)有效減小點查詢和範圍掃描的次數、異步I/O預取等,盡力把它打形成讀寫性能均衡,成本優點突出的存儲引擎。關於X-Engine讀寫優化,能夠參考這篇文章(TODO:超連接)。性能

通過DBA和業務開發同窗的驗證,X-Engine的讀寫性能及延時徹底知足業務需求。很快,淘寶圖片空間庫所有切換爲X-Engine引擎,節省了大量的存儲成本。測試

3.X-Engine適合什麼樣的業務

X-Engine分層存儲的架構,特別適合具備以下業務負載特徵的業務:優化

  • 庫表數據量特別大,對成本敏感的業務。傳統InnoDB引擎遷移到X-Engine後,依據數據特徵不一樣,存儲空間可下降2倍~10倍。遷移到X-Engine以後,不少業務能夠免除分庫分表的需求,使用單庫便可承載近10TB的數據存儲服務。例如:X-Engine在釘釘的應用。
  • 數據訪問具備鮮明的時間特徵。例如大部分讀取及修改操做集中在最近寫入的數據上,而歷史數據較少被訪問(例如淘寶交易庫(超連接))。X-Engine新寫入的數據經過高效的內存索引緩存,訪問性能極高,而較少訪問的歷史數據保存在磁盤,提供稍遜的讀寫性能。例如:X-Engine在淘寶交易庫的應用。
相關文章
相關標籤/搜索