1、實(shí)現(xiàn)背景
1.1 背景
隨著大數(shù)據(jù)、云計(jì)算、物聯(lián)網(wǎng)的急速發(fā)展,數(shù)據(jù)量呈指數(shù)級(jí)增長(zhǎng),因此需要消耗更多的存儲(chǔ)空間。客戶對(duì)數(shù)據(jù)庫(kù)性能和資源的消耗也愈發(fā)看重,期望通過(guò)算法優(yōu)化和軟件優(yōu)化盡可能的對(duì)有限的硬件資源進(jìn)行充分且高效的利用。其中數(shù)據(jù)的存儲(chǔ)資源利用率首先成為行業(yè)關(guān)注的焦點(diǎn)。高效數(shù)據(jù)壓縮算法作為對(duì)數(shù)據(jù)庫(kù)存儲(chǔ)的優(yōu)化,期望通過(guò)將數(shù)據(jù)壓縮存儲(chǔ),在相同的硬件資源下可以更多的存儲(chǔ)處理數(shù)據(jù),有效提升數(shù)據(jù)庫(kù)對(duì)磁盤(pán)的利用。
1.2 現(xiàn)有技術(shù)
目前主流的數(shù)據(jù)庫(kù)廠家都有自己特有的壓縮方案,在此基礎(chǔ)上openGauss進(jìn)一步探索壓縮比更高的算法方案。
MySQL的透明壓縮,利用文件系統(tǒng)的打洞技術(shù)(文件系統(tǒng)特性,打洞單位是4K),單個(gè)page的所有數(shù)據(jù)在落盤(pán)前,先交給zlib或者lz4、zstd等通用壓縮算法進(jìn)行壓縮,再將壓縮后的數(shù)據(jù)存儲(chǔ)到原始地址,后面節(jié)省出來(lái)的空間就可以進(jìn)行打洞處理。優(yōu)點(diǎn)就是實(shí)現(xiàn)方便。缺點(diǎn)是在Linux上打洞單位是4K,且page大小為32K和64K時(shí)候不支持壓縮,最大是16K的page支持這種壓縮,因此,壓縮比最大能到4:1,這個(gè)也達(dá)到壓縮極限。
Oracle的字典壓縮,在塊級(jí)別(page概念)創(chuàng)建行字段的字典,字段存儲(chǔ)字典元素的引用。發(fā)生更新,插入,刪除操作的時(shí)候,通過(guò)一個(gè)閾值控制是否進(jìn)行壓縮。他壓縮算法在理解上是基于存儲(chǔ)塊的字典壓縮算法,在頁(yè)面內(nèi)維護(hù)一塊符號(hào)表,所有操作都基于此符號(hào)表做變換及逆變換,實(shí)現(xiàn)復(fù)雜。優(yōu)點(diǎn)在于不依賴于文件系統(tǒng)。缺點(diǎn)是字典壓縮很容易受到數(shù)據(jù)本身特征的影響,如果是重復(fù)度不高的數(shù)據(jù),壓縮率就很低。
2、openGauss高效數(shù)據(jù)壓縮算法
2.1 主要?jiǎng)?chuàng)新技術(shù)點(diǎn)
openGauss的主要?jiǎng)?chuàng)新技術(shù)點(diǎn)總結(jié)如下:
(一)改進(jìn)壓縮算法,壓縮數(shù)據(jù)單位依然是選擇頁(yè)級(jí)別,進(jìn)一步結(jié)合Page結(jié)構(gòu)以及本身數(shù)據(jù)的特征,將page交給通用壓縮算法前,先將Page按照字節(jié)級(jí)別進(jìn)行有序轉(zhuǎn)換、或者是多頁(yè)聯(lián)合重組、或者是差分預(yù)處理,這樣能獲得更高的壓縮率,且這一步預(yù)處理幾乎不會(huì)帶來(lái)多大的性能損耗。
(二)壓縮存儲(chǔ)塊管理,單個(gè)頁(yè)面壓縮后的壓縮塊以chunk為粒度進(jìn)行存儲(chǔ),然后將存儲(chǔ)結(jié)果和頁(yè)面的映射關(guān)系進(jìn)行管理,因此相對(duì)于壓縮頁(yè)面需要在內(nèi)存和磁盤(pán)之間加一層映射關(guān)系管理,記錄頁(yè)面壓縮塊與chunk存儲(chǔ)單元之前的關(guān)系,我們稱之為壓縮頁(yè)面地址管理(pca),對(duì)應(yīng)的將記錄壓縮塊chunk的頁(yè)面稱為壓縮頁(yè)面數(shù)據(jù)管理(pcd)。非壓縮頁(yè)面的頁(yè)面號(hào)與存儲(chǔ)資源block是一一對(duì)應(yīng)的,不需要單獨(dú)管理。Pca中不但要記錄每個(gè)頁(yè)面的壓縮塊使用了哪些chunk資源塊,而且記錄了chunk資源塊的排列順序,在頁(yè)面訪問(wèn)時(shí)都先通過(guò)查詢地址管理頁(yè)面才能找到壓縮塊的存儲(chǔ)位置。由于使用了更小的chunk,將每個(gè)頁(yè)面節(jié)省的空間累積在一起,通過(guò)打洞方式返還給操作系統(tǒng)。
2.2 功能實(shí)現(xiàn)
在page頁(yè)面落盤(pán)之前,根據(jù)條件(是否多頁(yè)聯(lián)動(dòng)、差分預(yù)處理等)選擇相應(yīng)壓縮算法,對(duì)單頁(yè)面page進(jìn)行壓縮,壓縮后至少需要一個(gè)chunk來(lái)存儲(chǔ),以page大小8K為例,選擇4K,2K,1K,0.5K的壓縮后理論上限分別為50%、25%、12.5%,6.25%。同時(shí)chunk的個(gè)數(shù)也決定了每個(gè)頁(yè)面壓縮后的大小不是連續(xù)變化的,而是以chunk大小階躍變化。同時(shí)以一個(gè)ext單元的形式進(jìn)行存儲(chǔ),一個(gè)ext單元由128個(gè)pcd數(shù)據(jù)頁(yè)面和1個(gè)pca映射頁(yè)面組成。Pcd數(shù)據(jù)頁(yè)面預(yù)劃分為8k,即使不進(jìn)行壓縮,存儲(chǔ)單元也足夠存儲(chǔ)。將壓縮后的chunk塊存儲(chǔ)在每個(gè)pcd頁(yè)面,將剩余的空間進(jìn)行打洞反還給操作系統(tǒng)。將映射消息記錄在pca頁(yè)面,為pca頁(yè)面建立pcabuffer緩存,方便快速訪問(wèn)。

落盤(pán)過(guò)程原理圖
3、壓縮方案應(yīng)用場(chǎng)景
1.在線生產(chǎn)環(huán)境OLTP,減少實(shí)時(shí)數(shù)據(jù)對(duì)磁盤(pán)空間占用。
2.數(shù)據(jù)庫(kù)文件壓縮備份存儲(chǔ),減少備份數(shù)據(jù)磁盤(pán)空間占用。
3.主備物流文件復(fù)制的場(chǎng)景,減少傳輸過(guò)程的網(wǎng)絡(luò)帶寬。
下面以開(kāi)源備份工具gs_basebackup兼容壓縮表數(shù)據(jù)備份示例:

basebackup備份流程圖↑
openGauss適配改進(jìn)的壓縮算法,在不影響數(shù)據(jù)庫(kù)性能的前提下對(duì)數(shù)據(jù)進(jìn)行壓縮和存儲(chǔ),可達(dá)到存儲(chǔ)大小整體下降20%的最終目標(biāo)。
上述內(nèi)容是openGauss在3.1.0版本上實(shí)現(xiàn)的數(shù)據(jù)高效壓縮功能。未來(lái),openGauss還會(huì)在數(shù)據(jù)庫(kù)的存儲(chǔ)領(lǐng)域持續(xù)研發(fā),打造頂尖的數(shù)據(jù)庫(kù)存儲(chǔ)方案,做到行業(yè)領(lǐng)先。