天天看點

阿裡雲自研存儲引擎X-Engine如何支撐釘釘資料量激增1.為什麼是X-Engine2.X-Engine架構3.X-Engine如何有效降低成本4. 寫在最後

釘釘作為國内領先的企業IM工具,在中國有超過億級别的使用者。随着新型冠狀病毒肺炎疫情的爆發,大量的企業員工選擇了soho模式,企業辦公協同工具的需求瞬間爆發。

釘釘作為中國企業辦公IM的首選應用,不僅具有項目群、視訊通話、視訊會議、日報、打卡、遠端投屏等基礎能力,還具備深度、靈活訂制各種 OA (Office Automation,辦公室自動化) 應用的能力,極大友善了人與人之間的連結,可以幫助企業員工快速、高效地溝通和協作。

阿裡雲自研存儲引擎X-Engine如何支撐釘釘資料量激增1.為什麼是X-Engine2.X-Engine架構3.X-Engine如何有效降低成本4. 寫在最後

也是以,釘釘迅速沖上了AppStore免費榜的第一位。瞬間爆發的線上辦公需求,導緻釘釘的通路流量激增。每天早晨的打卡風暴,迅速增長的聊天資訊,一次次的流量洪峰沖擊着釘釘的業務背景。但是借助于阿裡雲提供的彈性基礎設施,釘釘平穩的渡過了每一次的流量洪峰。

在億級别的使用者體量下,釘釘的消息系統,除了要保證消息及時正确地傳遞,還要保證已讀/未讀等特有功能。而且不同于市場上常見的使用者級IM工具,企業IM需要實作聊天記錄的永久儲存,并且提供多端漫遊功能。

在使用者量持續爆炸性增長的前提下,聊天記錄永久儲存給釘釘業務帶來極大的成本壓力。同時在資料爆炸的前提下保證聊天記錄的讀寫性能不降低也是一個極大的挑戰。

面對這些挑戰,釘釘業務選用了X-Engine作為全量釘釘消息的最終存儲引擎,實作了性能和成本的平衡。而且在此次企業協同辦公需求爆發期間,釘釘業務的資料庫系統頂住了所有的流量洪峰。

1.為什麼是X-Engine

在X-Engine誕生之前,釘釘采用的是InnoDB引擎。在使用者爆發增長,面臨存儲的壓力之後,釘釘考慮了多種候選方案,例如Hbase等nosql服務。但企業IM對資料一緻性如事務等功能有比較苛刻的需求,同時業務類型的多樣化,也對諸如二級索引等資料庫的功能有比較強的依賴。

釘釘消息業務采用X-Engine之後,相同資料所需的磁盤空間比InnoDB引擎減少了62%,同時繼續保留了對事務以及二級索引等資料庫特性的支援。業務代碼不做任何修改,即可以遷移到X-Engine叢集上。

釘釘的聊天消息有着非常典型的時效性,即最近發送的消息會被經常通路,而曆史的消息則很少被讀取。X-Engine天然的冷熱分離能力,確定了我們對最新的消息有着最高的處理能力,而對曆史的消息有着最高的壓縮比,這樣的設計兼顧了性能和存儲成本。

我們在著名的Link-Bench和阿裡巴巴内部交易業務兩個資料集上測試了X-Engine的存儲空間效率。在測試中,對比開壓縮的InnoDB引擎,X-Engine有着2倍空間優勢,而對比未開壓縮的InnoDB,X-Engine則有着3~5倍的優勢。

阿裡雲自研存儲引擎X-Engine如何支撐釘釘資料量激增1.為什麼是X-Engine2.X-Engine架構3.X-Engine如何有效降低成本4. 寫在最後

2.X-Engine架構

在闡述為什麼X-Engine可以節約這麼多存儲成本之前,我們先看看它的整體架構。

X-Engine采用了LSM-tree典型架構。在LSM-tree的資料組織下,寫入的資料首先進入一個記憶體表中,對該部分資料的讀寫都是在記憶體中進行,是以通路最新的資料有着最高的效率。

在記憶體表的大小達到一定門檻值之後,将會當機進行轉儲,并持久化到磁盤上。X-Engine在磁盤上的資料也是分層的,随着時間的推移,compaction過程會根據資料的通路頻度,将最冷的資料轉移到LSM-tree的最底層并進行壓縮。是以通路最少最冷的資料有着最長的通路路徑,而溫度稍高的資料通路路徑更短。

阿裡雲自研存儲引擎X-Engine如何支撐釘釘資料量激增1.為什麼是X-Engine2.X-Engine架構3.X-Engine如何有效降低成本4. 寫在最後

資料分層的架構,讓我們可以對不同的資料集采用不同的處理模型。例如對于新寫入的資料,使用高度并發的事務流水線技術,這項技術可以提高極高的寫入吞吐。而對于占整體資料量95%以上的底層資料,使用緊湊編碼并進行壓縮,以降低空間。而對于底層資料中散布的部分熱點資料,則充分使用BlockCache和RowCache來加速讀操作。

3.X-Engine如何有效降低成本

目前廣泛使用的InnoDB引擎也是可以通過開啟壓縮來降低存儲空間的,那為什麼在釘釘IM的消息存儲中,X-Engine有着更好的表現呢?因為X-Engine有以下幾個獨門秘籍:

3.1 緊湊的資料頁格式

X-Engine的記錄更新使用的是copy-on-write技術,避免原地更新資料頁,新資料寫入到新的資料頁中。由于既有資料不可更新,可以緊湊存儲隻讀資料頁面,并使用字首編碼等資料壓縮技術,提升頁面空間的使用效率。已經失效的曆史記錄版本則由compaction過程負責清理,保證有效記錄都緊湊排列。

Innodb引擎采用傳統B+tree組織資料,每個page是一個節點。它在記憶體中會組織為一個記憶體堆。為保證插入和更新的效率,InnoDB的page大部分時候都不是全滿狀态。這種結構雖然有較好的記憶體原地更新性能,但是持久化到磁盤上,空間使用效率非常低下。

即使初始順序批量灌入資料建立了緊湊的page結構,後續更新帶來的分裂、合并依然會在page中引入縫隙,降低空間使用率。記錄在InnoDB的page中的組織和X-Engine的DataBlock中的組織對比如下圖所示,可以看到在InnoDB的page中存在大量空洞。

阿裡雲自研存儲引擎X-Engine如何支撐釘釘資料量激增1.為什麼是X-Engine2.X-Engine架構3.X-Engine如何有效降低成本4. 寫在最後

一個經常碰到的場景是:使用InnoDB引擎導入所有基礎資料并開啟壓縮之後,空間表現非常優秀。但是運作一段時間,空間膨脹會非常厲害。這種特性對于資料庫執行個體在不同機器上的彈性排程是非常不利的,而X-Engine則能保證非常穩定的空間占用。

除了LSM-tree帶來的天然壓縮優勢之外,X-Engine團隊也探索了其他的資料壓縮技術,例如Extent級别的列存,這個可以進一步提升壓縮效率到10倍以上。當然在如何在一個TP型存儲引擎中,在提升存儲效率的前提下保證讀取性能是一個值得進一步探讨的話題。

3.2 資料壓縮及無效記錄清理

由于X-Engine的Data Block無需原地更新,經編碼之後的資料頁,可以使用通用壓縮算法(zlib,zstd,snapy等)壓縮。所有X-Engine執行個體中處在LSM-tree中低層次的資料都會預設壓縮。

資料壓縮是以計算資源換空間的技術,在Data Block的生成時需要消耗CPU資源進行壓縮,被壓縮的Data Block被通路到時,則需要消耗資源進行解壓。是以選用一個壓縮率高及壓縮/解壓速度快的壓縮算法也非常關鍵。

經過大量對比測試,X-Engine預設選用了ZSTD壓縮算法,但同時也保留了對其他算法的支援。除了使用壓縮之外, compaction過程會對無效記錄進行删除,隻保留有效記錄。compaction執行的越頻繁,無效記錄的占比越低,空間使用效率越高。是以保證合适的compaction頻率也是提升空間使用效率的關鍵。

從某種删除無效記錄的角度上看,compaciton和壓縮一樣,代表着一種以計算資源換空間的理念。為了應對compaction對計算資源的消耗,X-Engine團隊研發了FPGA compaction技術,使用異構計算裝置來加速compaction過程。

壓縮是在compaction過程中同步進行的。我們FPAG 上實作compaction算子的同時,也實作了壓縮算子,在一個FPGA硬體流水線内同時完成compaction+壓縮操作。雖然FPGA價格不菲,但是經過評估,X-Engine異構計算加速技術能夠提供更優異的成本效益比。更詳細的資料可以檢視論文FPGA-Accelerated Compactions for LSM-based Key-Value Store

阿裡雲自研存儲引擎X-Engine如何支撐釘釘資料量激增1.為什麼是X-Engine2.X-Engine架構3.X-Engine如何有效降低成本4. 寫在最後

壓縮及compaction可以減少磁盤空間占用。而FPGA等異構計算裝置算力的加持讓我們可以不用付出性能的代價。即使在沒有FPGA加速卡的機器上,借助合理的排程算法,X-Engine也能以較小的性能代價獲得存儲空間的節省。

3.3 智能冷熱分離算法

雖然X-Engine有緊湊資料布局的優勢, 有ZSTD這樣高效的壓縮算法,有FPGA提供的澎湃算力。但如何巧妙的利用好這些能力也是一個挑戰。其中最核心的問題是保證通路更頻繁的資料存儲在LSM-tree架構中更高的層級,緩存在BlockCache/RowCache中,縮短這些資料的通路路徑。對于那些很少被通路到的資料,可以下沉到LSM-tree的最底層,并壓縮存儲。

傳統LSM-tree的compaction是基于層數門檻值或者一層的容量大小門檻值觸發的,它并不感覺資料自身的冷熱。一條經常被讀取的資料,可能因為時間的推移被推到了LSM-tree的最底層。讀取該資料會涉及到對DataBlock的解壓,效率低下。是以冷熱分離的精準性同時關乎到性能和成本。

為了解決這個問題,我們分析了大量業務的資料通路特征,發現對于絕大部分業務。資料在寫入之後,通路頻率大緻随着時間推移按照指數衰減,但是也會由于某些原因再次變熱并被頻繁通路。這樣一個複雜的特征,傳統LRU的模型是難以描述的。

阿裡雲自研存儲引擎X-Engine如何支撐釘釘資料量激增1.為什麼是X-Engine2.X-Engine架構3.X-Engine如何有效降低成本4. 寫在最後

為此我們在X-Engine中除了應用傳統的基于統計的模型,還引入了描述能力更強的AI算法。X-Engine中的冷熱分離算法主要完成如下幾個任務:

  • compaciton過程挑選出未來最不可能被通路到的資料頁和記錄,下推到LSM-tree的更底層。
  • 挑選目前熱點資料,在compaction或者轉儲的過程中回填到記憶體中(BlockCache和RowCache), 避免cache命中率的抖動影響性能。
  • 更進一步的,AI算法會識别出未來可能被通路到的資料,提前preload到記憶體中,減少首次通路的cache miss。

準确識别出資料冷熱,可以避免無效壓縮或解壓帶來的算力浪費,提升熱點資料在記憶體中的命中機率,并最終提升系統吞吐。而要做到冷熱識别的完全精準非常困難,我們目前做到了基于機率統計模型來挑選compaction目标資料以及挑選回填到記憶體中的資料頁。基于于未來請求特征的預熱算法還在研究中(很快會在新的論文中和大家見面),此技術方向我們也在和各大高校如浙大,北大的研究機構進行合作,也歡迎感興趣的同學加入我們。

我們有一個先進的LSM-tree引擎X-Engine做基礎,同時也有阿裡巴巴豐富的業務場景資料做支撐。相信我們能在AI For DB上探索出一條切實可行的道路。

4. 寫在最後

X-Engine具有LSM-tree天然分層架構帶來的優勢,可以使用緊湊的資料頁存儲格式并結合壓縮來降低存儲空間開銷。我們創新設計的事務流水線處理技術,FPGA異構計算加速技術則提升了X-Engine的性能上限。結合智能化的冷熱資料分離技術,X-Engine同時兼具了成本和性能的優勢。

除了服務于釘釘業務之外,X-Engine 在阿裡巴巴内部也被大量業務所采用,并線上上經過了三四年的錘煉。目前X-Engine也在阿裡雲RDS MySQL作為一個可選存儲引擎售賣,點選閱讀原文了解等多詳情。

在未來X-Engine作為PolarDB分布式版本的一個底層存儲引擎,将在分布式資料庫領域服務更多的客戶。