簡介:做者:旺德/志歉算法
圖片空間是淘寶智能圖片中心面向商家提供的免費圖片存儲管理服務,因爲淘寶、天貓主站上累積的用戶圖片數據量很是大(想一想淘寶/天貓的商家和消費者天天要上傳多少圖片!),而且增加量驚人,圖片空間業務面臨着很是巨大的存儲空間和寫入性能壓力。尤爲每一年雙11以前,商家大量更新商品庫存保有單位SKU(Stock keeping Unit),此時數據會急劇增加。 數據庫
淘寶/天貓每日新增大量商品、評論圖片
某年雙十一前夕,當時阿里大部分數據庫系統還使用的是InnoDB存儲引擎,圖片空間的研發同窗梳理雙十一線上風險時,諮詢到DB磁盤及水位的容量是否足夠,咱們曾信誓旦旦地說:「沒有問題,四個月前咱們剛擴了一倍機器」。但是沒過多久就被現實打臉了:不到5個月的時間,業務數據累積了過去6-7年的量,每日增量急劇上升,擴容的磁盤很快也將不夠了。緩存
最簡單粗暴的方法固然是擴容,這樣作風險最小,但卻只能解決眼前的問題。以如今數據的膨脹速度,將來不免屢次擴容。僅僅由於空間不足的問題,致使成本翻好幾倍,這是難以接受的。
另一個方法是換引擎,當時阿里主打高性能低成本的自研存儲引擎X-Engine剛剛成熟(TODO:X-ENGINE架構超連接),相較於基於B+-Tree的存儲引擎(例如InnoDB)數據頁存在較多空間浪費,基於LSM-Tree的X-Engine數據徹底緊湊排列,空間利用率更高。而緊湊排列的數據施之前綴壓縮技術,空間使用進一步減小。 架構
X-Engine的Data Block無需原地更新,能夠方便使用通用壓縮算法(zlib,zstd,snapy等)壓縮。全部位於LSM-tree低層次的數據都會默認壓縮。通過大量對比測試,X-Engine默認選用了ZSTD壓縮算法,但同時也保留了對其餘算法的支持。此外後臺compaction會持續刪除無效記錄(LSM-Tree更新和刪除都是寫入新記錄,舊版本記錄再也不被須要時,視爲無效),持續釋放冗餘的空間。
由於上述技術特色,X-Engine對存儲空間的節省幾乎到達了「變態」的程度,以致於當圖片空間庫的數據所有從InnoDB轉移到X-Engine後,空間節省了7倍,以下圖所示 併發
爲何數據從InnoDB遷移至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引擎,節省了大量的存儲成本。測試
X-Engine分層存儲的架構,特別適合具備以下業務負載特徵的業務:優化