GaussDB技術解讀系列:高級壓縮之OLTP表壓縮

来源:https://www.cnblogs.com/huaweiyun/archive/2023/08/23/17651532.html
-Advertisement-
Play Games

第14屆中國資料庫技術大會(DTCC2023)上,華為雲資料庫GaussDB首席架構師馮柯對華為雲GaussDB資料庫的高級壓縮技術進行了詳細的解讀。 ...


本文分享自華為雲社區《DTCC 2023專家解讀 | GaussDB技術解讀系列:高級壓縮之OLTP表壓縮》,作者:GaussDB 資料庫 。

8月16日,第14屆中國資料庫技術大會(DTCC2023)在北京國際會議中心順利舉行。在GaussDB“五高兩易”核心技術,給世界一個更優選擇的專場,華為雲資料庫GaussDB首席架構師馮柯對華為雲GaussDB資料庫的高級壓縮技術進行了詳細的解讀。

2.jpg

以下為演講實錄:

各位嘉賓,大家下午好!很高興由我開始給大家帶來今年GaussDB一系列新特性的技術解讀。我解讀的是第一個特性,高級壓縮。

GaussDB高級壓縮全景

高級壓縮是面向業務全場景的資料庫壓縮解決方案,適用的場景主要分兩類。第一類是存儲類,主要為業務提供容量控制,減少業務擴容的概率和成本;第二類是傳輸類,主要是面向跨Region、跨AZ的業務場景如何去匹配業務的網路帶寬的現實條件,為業務提供更穩定的SLA保證。這裡面又有很多細分的場景,TP、AP都有。

3.png

這裡面有非常多的挑戰,一是壓縮演算法怎麼設計,二是怎麼做冷熱判定。我們在整個存儲類的壓縮里用的都是選擇性壓縮,基於系統自動發現數據的冷熱,只壓縮業務中相對比較冷的數據,不去碰相對熱的數據。包括實現業務的零侵入、和存儲引擎的結合,有很多技術挑戰。

典型場景和目標設計

不同的場景對於壓縮演算法,包括壓縮率、業務影響、業務侵入容忍度是不一樣的。這裡要介紹的,是我們第一個發佈的OLTP表壓縮的技術細節。講這個之前,先講一下OLTP表壓縮究竟解決的是什麼樣的客戶場景,這決定了我們整個技術目標。

有兩個典型場景是我們在真實業務中碰到的。第一個場景,客戶的業務來自於IBM小機,整個單庫容量達到幾十個TB,容量比較大。業務如果遷移到開放平臺,比較大的問題是單體容量太大,整個運維視窗的時間比較長。我們有不同的選擇,可以選擇大家說的拆庫,也就是分表分庫,但拆庫意味著需要做整個分散式改造,對有些業務來講是很多年的存量的關鍵業務,這種改造方式整個風險是非常高的。第二個選擇可以用壓縮,壓縮可以減少容量,但客戶在業務設計的開始並沒有做冷熱分離,比如沒有把用戶的數據基於時間維度做分片,如果用壓縮,客戶首要的訴求是能否做到壓縮對業務的影響足夠低,其次才是壓縮率,這是第一個典型場景。

第二個典型場景,客戶業務基於分散式集群部署,容量增長得非常快,已經超過一個PB,並且還在不斷增長。對於客戶來講,這是非常大的問題,需要定期做擴容。使用壓縮同樣可以幫助客戶減少擴容的頻率、變更的風險。但問題是一樣的,客戶數據同樣沒有做冷熱分離,是面向擴展性來設計的,比如基於用戶ID號進行分片,讓不同用戶的負載能夠平均分配給不同的數據節點。由於沒有做冷熱分離,如果要用壓縮,能否做到壓縮對於業務的影響足夠低,其次才是壓縮率。這也是我們看到的非常典型的OLTP壓縮的場景。

我們對這兩個場景進行了分析,推導出三個基本的設計目標。首先,整個壓縮方案必須是零侵入的,不能假設業務的已有數據分佈,不能說建一個分區,數據一定能區分冷熱,因為業務沒有這樣的條件。不能對業務的數據分佈、邏輯模型有任何的假設,方案必須是零侵入的。第二,如果業務開啟壓縮,對業務的影響應該是極低的,我們定義至少10%,甚至5%,這是非常重要的。第三才是合理的壓縮率,2:1或3:1,如果沒有壓縮率,做這些事情的價值就不存在了。這三個基本目標也決定了我們後面整個技術方案的設計和工程落地。

關鍵挑戰一:如何判定業務的冷熱數據?

確定完目標,有三個比較關鍵的問題需要解決。一是怎麼判定業務的冷熱數據,二是判定完之後怎麼和現有的壓縮引擎結合,對壓縮後的數據有效地存儲,第三點才是怎麼實現有競爭力的壓縮演算法。

我們做冷熱判定,首先是確定判定的粒度。可以按照表、分區、塊來判定,也可以按照行來判定。判定的粒度越細,意味著對業務的侵入越低,對業務整個數據分佈沒有任何假設,當然實現的挑戰也越大。基於我們定義的技術目標,在做OLTP表壓縮時,第一個目標就是冷熱判定必須是行級別的,這樣對業務的侵入是最小的。

我們利用了GaussDB現有存儲引擎已有的機制。GaussDB現在的存儲引擎和其他引擎一樣,在整個數據上除了存放用戶數據之外還存放元數據,元數據里有事務信息,這個事務信息通常是用來實現事務的可見性,裡面記錄了最後一次修改的事務ID號。當這個事務ID號足夠老,對於當前所有事務都可見,這個時候我們把事務ID號替換成物理時間戳,這個物理時間戳可以用來表達這行數據最後一次修改的時間是什麼時候,如果這個時間足夠早、足夠老,真正達到了冷的條件,那麼我們就可以對它進行壓縮,用戶可以用非常簡單的邏輯實現冷熱的判定。

4.png

第二個例子是,用戶可以自定義冷熱條件,這個行如果長時間沒有做任何修改,系統就可以把它壓縮掉,否則不要碰,這是一個非常簡單的策略。如果客戶業務中有一些欄位有非常清楚的冷熱屬性,比如交易的時間、交易的完成狀態,那可以指定這個欄位進行冷熱判定。或者客戶大部分的交易數據都滿足3個月前的交易是冷數據,但其中某些特殊類型的交易,像擔保交易,可能沒有辦法滿足這個約束,這時候也可以自定義冷熱條件。比如交易狀態必須是完結的,或者交易類型不能是特定類型,通過自定義條件和最近修改時間的組合,可以靈活地定義什麼樣的數據應該壓縮。這是第一點,怎麼做冷熱判定。

關鍵挑戰二:如何對壓縮後的數據有效地存儲?

第二點,壓縮後的目標數據怎麼存。根據總體設計目標,我們希望做到對業務的侵入越低越好。我們選擇了直接做塊內的壓縮:把一個塊內所有滿足冷熱判定的行一次性壓縮完,把壓縮後的數據包就存放在當前數據塊內。這樣做從壓縮率上講並不是最優選擇,但從對業務的影響上講是一個更好的選擇。因為業務即使定義了冷熱判定條件,我們仍有一定的概率會訪問冷數據,我們希望通過塊內壓縮的實現來保證訪問冷數據的代價有一個確定性的上限,這是塊內壓縮的基本思考。

5.png

關鍵挑戰三:如何實現有競爭力的壓縮演算法?

為什麼做選擇性壓縮?很簡單,沒有任何一個壓縮演算法能做到數據壓縮之後對業務沒有影響,今天沒有這樣的黑科技,這是我們基本的技術判斷,所以要去平衡壓縮率和對業務的影響。我們首先做的是選擇性壓縮,業務數據分佈滿足典型的80-20分佈政策,80%的數據占有80%的存儲容量,但只消耗了20%的算力。比如銀行交易,隨著時間的推移,整個訂單的訪問頻率會迅速降低,這是非常典型的滿足冷熱特征的業務。

如果做選擇性壓縮,那麼只壓縮那些占用80%存儲容量,但只消耗20%算力的冷數據,就意味著我們在節省存儲成本方面達成了80%的目標;而不去壓縮那些只占用20%的存儲容量,但卻消耗80%算力的熱數據,就意味著我們在降低對用戶的業務影響方面達成了80%的目標,這是非常簡單的技術選擇。

壓縮演算法我們也看了一些,比如LZ4是現在性能最好的演算法,我們一開始用的就是這個演算法,但比較大的問題是壓縮率相對較低。如果仔細去分析演算法原理,LZ4是基於LZ77演算法的一種實現,是把壓縮的數據看成一個連續的位元組流,從當前開始尋找匹配的字元串,找到字元串長度和偏移進行編碼來代替被匹配的字元串,從而實現壓縮的效果。LZ77演算法從原理上講非常適合於長文本,相對不太適合像結構化數據這樣的,裡面有大量的數值類型和短文本,這是資料庫的特征。

我們做了很多優化,比如對數值類型做了差值編碼,所以壓縮框架實際上有兩層,第一層對數據做編碼,第二層用LZ77演算法。原生LZ77演算法有很多優化是面向長文本的,包括3位元組的編碼,我們做了非常多的工程優化,使它更容易面向短文本,比如兩位元組短編碼,包括內置行邊界。這裡我們無法給出很多細節,主要的優化背景其實就兩個:一個是通用壓縮演算法並不特別適合於關係型資料庫結構化數據的場景,二是我們所做的這些工程優化,從通用的壓縮場景來講,並不一定是最優的,但它們是特別適合關係型數據的。

6.png

競爭力評估

最後有一個簡單的評估,是通過TPCC和TPCH測試對目前的商用資料庫O*進行的壓縮率評估。O*和我們的GaussDB一樣,也提供了完整的冷熱判定能力,但由於發展原因,它實際上先做了數據壓縮,再做冷熱判定,所以整個壓縮演算法的壓縮率是比較低的;我們使用了標準的TPCH的數據,測試表明我們的壓縮率相對於O*平均提高了50%,這些數據可以被直接驗證。

7.png

其他的一些廠商,像開源資料庫,還有國內的廠商都提供了壓縮的解決方案,但共同問題是沒有做冷熱判定,對用戶來講可以指定一個表或一個分區,裡面的數據要麼都被壓縮,要麼都不壓縮。壓縮意味著存儲成本節省,但性能會下降,不壓縮則是另外一個選擇。這個看上去簡單的選擇對客戶來講反而是最難的,這也是為什麼我們看到今天有很多壓縮的解決方案,但用戶卻不會去用,因為誰也不知道開啟壓縮之後有什麼後果,這是比較大的問題。

這裡我們也做了一個標準的TPCC的測試評估,基於GaussDB單機版本進行選擇性壓縮。根據TPCC的語義,所有已經配送完成的訂單就不會再變更,但仍有一定的概率被訪問到,這是非常貼近於真實業務場景的訪問模型。所以,我們的壓縮演算法選擇了壓縮流水類數據,比如訂單數據,而一些狀態類的數據,比如庫存、賬戶等沒有去壓縮,在流水數據里,我們也只壓縮已經配送完成的訂單,不壓縮沒有配送完成的訂單。從最後的結果看,整個壓縮之後對於業務的影響在1.5%左右。我們相信我們是業內第一個在150萬tpmC性能峰值仍然能夠開啟壓縮並且性能基本不下降的產品。

下一步計劃:語義壓縮

我們已經打破了數據編碼和壓縮演算法的邊界,但對壓縮演算法的使用本質上沒有變化,即把整個數據看成是一維的位元組流。但關係數據是兩維的、結構化的數據,所以在數據的行與行之間、列與列之間存在非常豐富的關聯。這種關聯主要來自兩種場景,一種是業務本身在做建模時引入的關聯,比如為了消除連接,數據模型設計成扁平化或低範式化,這會引入非常常見的關聯。第二種是業務服務化改造進行服務的分層,數據在不同的服務分層之間被不斷傳遞而造成的一種關聯。我們通過一些演算法自動發現這種結構化數據之間的關聯,發現這些關聯不是用於商品推薦或者服務治理,而是希望通過消除這些關聯達到壓縮的目的。在很多場景里,這種基於語義的關聯消除技術會比通用演算法提供更好的壓縮效能,這是我們後面會重點去構建競爭力的地方。

小結

為什麼做高級壓縮的特性?因為我們希望在三個領域實現業內領先。

一是在性能敏感場景,在提供合理的壓縮率的前提下,對業務的影響(越小越好)實現業內領先。

二是在成本敏感的場景,在提供合理的壓縮解壓性能的前提下,壓縮率(越高越好)實現業內領先。

第三,大家可能註意到,冷熱判定本身不僅可以做數據壓縮,還可以做很多別的工作,比如多存儲介質、負載的感知,我們希望對於整個冷熱判定,包括模型及方法,在能夠支持的業務領域的廣度方面,能夠做到業內領先,這是我們做高級壓縮特性的一個基本目的。

號外!

cke_6464.jpeg

華為將於2023年9月20-22日,在上海世博展覽館和上海世博中心舉辦第八屆華為全聯接大會(HUAWEICONNECT 2023)。本次大會以“加速行業智能化”為主題,邀請思想領袖、商業精英、技術專家、合作伙伴、開發者等業界同仁,從商業、產業、生態等方面探討如何加速行業智能化。

我們誠邀您蒞臨現場,分享智能化的機遇和挑戰,共商智能化的關鍵舉措,體驗智能化技術的創新和應用。您可以:

  • 在100+場主題演講、峰會、論壇中,碰撞加速行業智能化的觀點
  • 參觀17000平米展區,近距離感受智能化技術在行業中的創新和應用
  • 與技術專家面對面交流,瞭解最新的解決方案、開發工具並動手實踐
  • 與客戶和伙伴共尋商機

感謝您一如既往的支持和信賴,我們熱忱期待與您在上海見面。

大會官網:https://www.huawei.com/cn/events/huaweiconnect

歡迎關註“華為雲開發者聯盟”公眾號,獲取大會議程、精彩活動和前沿乾貨。

 

點擊關註,第一時間瞭解華為雲新鮮技術~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [toc] # Linux運維工程師面試題(1) > 祝各位小伙伴們早日找到自己心儀的工作。 > 持續學習才不會被淘汰。 > 地球不爆炸,我們不放假。 > 機會總是留給有有準備的人的。 > 加油,打工人! ## 1 別名、內部命令、外部命令的執行順序 命令執行尋找順序:別名 > 內部命令 > 外部命 ...
  • [toc] ### 1.文件操作 #### 1.1 創建文件 ``` shell # touch+文件名 # 例子: # 創建一個文件 touch hello.c # 創建多個文件 touch hello.c hi.c ``` #### 1.2 刪除文件 ``` shell # rm+文件名 # 例 ...
  • 因為我用的是windows伺服器,因此需要一臺虛擬機,用來安裝centos,虛擬機的安裝網上好多教程,這裡不做過多介紹 這次同樣是按步操作 在本地伺服器創建下載目錄 -> 將yum文件下載到本地 -> 在遠程伺服器上創建目錄 -> 上傳文件到遠程伺服器目錄 -> 使用命令安裝yum到伺服器上 這次的 ...
  • # 任務與協程 ## 區別 > 一個程式可以只有任務、只有協程、二者都有,但不可以通過隊列/信號量互相傳遞數據 ## 任務特點 1. 任務之間可以互相獨立 2. 每個任務分配自己的堆棧,提高了RAM使用率 3. 操作簡單、按優先順序搶占式執行 4. 搶占容易導致重入(執行任務時被其他線程或進程調用了) ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230822115524099-438612716.png) # 1. 在執行語句之前,會先檢查下列事項 ## 1.1. 是否有許可權執行該語句 ## 1.2. 是否有許可權訪問指 ...
  • 排序查詢:select 欄位列表 from [表名] order by [欄位名1] [asc升序/desc降序,預設值為升序],[欄位名2] [排序方式];//欄位名1為優先順序排序,如果欄位名1有相同的,再以欄位名2排序 聚合函數: count 統計數量(一般不選null的列) max 最大值 m ...
  • ## 1、字元集概述 - Oracle語言環境的描述包括三部分:language、territory、characterset(語言、地域、字元集) - language:主要指定伺服器消息的語言,提示信息顯示中文還是英文 - territory:主要指定伺服器的數字和日期的格式 - charact ...
  • 在日常工作中,有時會遇到一次性往頁面中插入大量數據的場景,在數棧的[離線開發](https://www.dtstack.com/dtinsight/batchworks?src=szsm)(以下簡稱離線)產品中,就有類似的場景。本文將通過分享一個實際場景中的[前端開發](https://www.dt ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...