這次,聽人大教授講講分散式資料庫的多級一致性|TDSQL 關鍵技術突破

来源:https://www.cnblogs.com/tencentdb/archive/2022/11/16/16895862.html
-Advertisement-
Play Games

近年來,憑藉高可擴展、高可用等技術特性,分散式資料庫正在成為金融行業數字化轉型的重要支撐。分散式資料庫如何在不同的金融級應用場景下,在確保數據一致性的前提下,同時保障系統的高性能和高可擴展性,是分散式資料庫的一個核心技術挑戰。 針對以上分散式一致性的困境,中國人民大學-騰訊協同創新實驗室研究提出“多 ...


近年來,憑藉高可擴展、高可用等技術特性,分散式資料庫正在成為金融行業數字化轉型的重要支撐。分散式資料庫如何在不同的金融級應用場景下,在確保數據一致性的前提下,同時保障系統的高性能和高可擴展性,是分散式資料庫的一個核心技術挑戰

針對以上分散式一致性的困境,中國人民大學-騰訊協同創新實驗室研究提出“多級一致性”的事務處理理念。該技術包含嚴格可串列化、順序可串列化、可串列化三大隔離級別,可針對不同應用場景要求,極大地平衡性能與一致性要求,滿足金融及各類企業場景的分散式事務處理需求。該項技術已應用於騰訊分散式資料庫TDSQL產品中,確保TDSQL按需提供數據一致性,並確保數據無異常。TDSQL是當前國內率先進入國有大型銀行核心系統正式投產的國產分散式資料庫,該項技術是其中的關鍵支撐。

這次,中國人民大學教授、博士生導師盧衛老師為大家全面解鎖分散式資料庫的多級一致性及構建技術!

背景

從本質上看,資料庫是長期存儲在電腦內、有組織的、可共用的數據集合。當多個用戶併發操作資料庫時,事務調度的可串列化是併發控制的正確性理論。但該觀點在當前卻受到了挑戰。Daniel J. Abadi 在2019年發佈的一篇博客中提到,以往學界普遍認為可串列化是資料庫隔離級別的黃金標準,但經過研究,他發現實際上嚴格可串列化才是黃金標準。即在該理論中,可串列化仍存在一定的問題,只有嚴格可串列化才能做到沒有問題。

file

在過去,為什麼可串列化不存在問題?原因有兩方面:

一是對集中式資料庫而言,可串列化其實就是嚴格可串列化,兩者之間並沒有區別。
二是對於分佈資料庫而言,如果資料庫里有唯一的事務調度器或協調器,這兩者之間也可等價。

file

當來到去中心化的分散式資料庫時代,我們希望分散式資料庫產品可在全球部署。全球部署意味著範圍更大,如果仍然依賴集中式調度,性能和可擴展性都無法滿足應用的需求,因此需要在系統當中安排多個事務協調者進行協調。

file

回顧發展歷程,20年前的資料庫的標註配置為業務系統+主庫+備庫。業務系統訪問主庫,主庫通過同步協議使數據在主庫和備庫之間保持一致性。在這一階段,集中式的IBM小型機、Oracle資料庫、EMC存儲(IOE)在處理小規模的數據場景時較為合適。但這種架構模式的問題在於,當數據量比較大或者業務場景比較密集時,集中式主庫就會成為整個系統的負擔。

file

到了第二階段,典型的做法是分庫分表,將業務按照主庫進行拆分,因為業務系統建立在主庫之上,因此實現了業務的隔離,TDSQL的早期版本也採用了這種做法。這種做法的前提假設是數據/業務能夠很好地進行切分,從而解決前一階段業務不可擴展的問題。但當業務系統進行跨庫訪問時,就會帶來新的問題。

file

為瞭解決上述問題,我們來到了第三階段,即去中心化的分散式資料庫階段。在該階段,資料庫中設置了更多的事務調度器,由調度器來對每個節點數據上的子事務進行事務提交,每個事務調度器都可以獨立地去處理事務。但這也會產生新的問題,即不同協調者之間如何協調。

file

問題與挑戰

我們以下圖中的例子來說明分散式資料庫中不同協調者之間如何協調的問題。假設有一個家庭賬戶,丈夫和妻子共用,都可以進行讀和寫。丈夫在 ATM機上存了 100 塊,存完後通知妻子,但妻子有可能看不到丈夫存的這筆錢。因為這是一個多協調器的架構,設備1交由協調者1來進行協調,妻子發起的這個事務可能由另外一個協調者去發起,這就會出現協調者之間AMG時鐘不統一的問題。

file

該事務發起的時間雖然在 2:01 PM後,但因為協調的時間偏慢,所以此時1:59 PM的這個時鐘去讀 2:01 PM的時間戳提交的這個數據,就會出現讀不到的情況。

file

形象地說,即有兩個協調器,其中一個協調器執行了事務 T0 、T1,T1 事務已經提交成功。這時協調者 2 發起了事務T2,當T2 查詢餘額時,我們發現時鐘比 T1 提交的時鐘來得小,所以讀不到T1。但實際上,是先執行 T0 再執行 T2 再執行T1,屬於可串列化。但這又會跟前述提到的執行相違背,因為既然T1已經提交, T2理應可以讀到,但結果沒有讀到。因此Daniel J. Abadi 的可串列化存在一定的問題,讀不到最新數據。

file

這個問題的本質是保序,而嚴格可串化的本質是線性一致性加上可串列化。從事務角度來看,根據線性一致性要求,如果T0事務已經結束,T1才開始,則T1要讀到T0的寫;同理,T1已經完成了T2才開始,T2要讀到T1的寫。雖然這裡的 T0、T2、T1 是可串列化,但違背線性一致性的要求,只有T0→ T1→ T2時才是正確的,這就是保序。

因此,這裡的實時序就是T0 結束後開始T1事務,T0 排在T1的前面;T0 完成後T2才開始,T0 排在T2的前面;T1結束後T2才開始,T1排在T2的前面。因此核心理念就是保序,即在原來可串列化全序的基礎上,對可串列化的序做約束,這個約束是線性一致性所造成的。

file

嚴格串列化雖然能保證數據的準確性,但也帶來了較多的問題。以Google Spanner為例,Google Spanner支持嚴格可串列化,但是嚴格可串列化要求有一個原子鐘,或者有一個中心授時器(本質上是因為協調器和協調器之間缺少一個協調),因而導致性能較低,難以被廣泛應用於實際業務場景中。

file

多級可串列化建模

基於上述情況,我們希望可以找到一個中間環節,在一致性上比可串列化級別高、比嚴格串列化級別低;在性能上接近可串列化、優於嚴格可串列化。針對這個需求,我們提出了多級可串列化建模,本質是在可串列化的基礎上加了序。

線性一致性是併發系統中一致性最強的,比它弱一點的有順序一致性、因果一致性、寫讀一致性、最終一致性等。我們嘗試將可串列化與它們進行結合,最終發現只有可串列化和線性一致性以及可串列化和順序一致性可以實現結合。因為可串列化要求全序,但因果一致性不要求全序,因此無法結合。

file

我們的做法是將可串列化+線性一致性,從而得到嚴格可串列化;可串列化+順序一致性,從而得到順序可串列化。所以我們提出了嚴格可串列化、順序可串列化、可串列化這三個隔離級別。

file

多級可串列化實現的核心理念就是保序。我們定義了五個序:

  • 實時序,即原來的線性一致性要求。
  • 程式序,比如代碼中的session order,session 連接後,事務之間就變成了T0,T0 提交後才能提交T1,這就是程式序。

file

  • 寫讀序,即如果T2讀取了T1的寫,T1必定排在T2 之前。
  • 因果序,指寫讀序和程式序之間形成的閉包。
  • 寫合法,假設有一個x數據項,T1寫了數據項x1,T3 寫了數據項x2,但如果T2 讀了一個x ,就必須要求T2 要緊跟T1,因為它不能緊跟在T3 後;如果它排在T3 後,則它讀的應該是 x2 ,因此這時T1和T3形成了一個序,要求T2要排在T3 前。

file

有了序後,我們重新定義了事務的可串列化理論,即可串列化等於寫讀序的傳遞閉包+寫合法;可串列化+順序一致性,即寫讀序+程式序的傳遞閉包,再加寫合法;嚴格可串列化就是寫讀序+實時序的傳遞閉包,加寫合法。因此可以理解為所有的一致性模型就是保序。

file

該理論成果已經應用於騰訊分散式資料庫TDSQL產品當中,使得TDSQL成為全球範圍內首個能夠具備嚴格可串列化、順序可串列化、可串列化三大隔離級別的國產分散式資料庫,還可針對不同應用場景要求,極大地平衡性能與一致性要求,滿足金融及各類企業場景的分散式事務處理需求。

併發控制演算法

併發控制演算法-雙向動態時間戳調整的實現如下圖所示。圖中有兩個協調者P1和P2,協調者P1有兩個事務T1和T3,協調者P2有T2 和T4 。我們先定義順序,T1和T3之間有一個session order或program order,T2和T4也存在一個program order,我們將它preserve 出來。

file

其中還存在寫讀序,像T1和T4之間,T1寫了x1,T4讀了x1,此時就存在一個寫讀序,所以要把T1和T4的order preserve出來。同時還存在寫合法,因為T3 讀了y 數據項,然後 T2 寫了y數據項, 但是基於可串列化理論,R3讀取的是y0,沒有讀取到y2,如果讀到y2,這時T3就必須排在T2後。因為此時讀不到y2 ,要排在T2前面,因此T3和 T2之間存在寫合法。在整個執行過程中,我們要保證必須存在保序。

主要思想是每次事務提交時,都需要判斷能否違背事務的先後順序。比如T1開始提交,因為T1只包含自身,我們將它放到隊列中時不需要回滾。T2 提交時,T2和T1之間沒有序,但T1和T3之間以及T2和T3之間都分別存在一個序,因為此時存在y數據項,所以只有T1、T3、T2 這樣的序才能保證可串列化,否則T必須進行回滾。

file

最後為保證協調器間能進行協調,我們還需要引入混合邏輯時鐘,來保證因果序。

file

實驗評價

我們以下圖中的實驗為例,來說明可串列化、嚴格可串列化和順序可串列化之間的關係。如果在區域網情況下,在正確性方面,嚴格可串列化跟可串列化性能基本一致。但在廣域網情況下,嚴格可串列化、順序可串列化和可串列化之間的性能差異較大,所以導致在廣域網上很難實現嚴格可串列化。

file

如圖所示,BDTA演算法比現有的演算法如MAT、SUNDIAL等快了將近 1.8 倍,主要原因是BDTA中保序,但如果用前面的方法實現併發控制,就會造成大量事務的回滾。

file

總結與討論

本文提出了提出了面向分散式資料庫的多級可串列化模型,將併發系統中的一致性要求結合到可串列化中,實現了多級可串列化原型系統,保證了去中心化的事務處理機制,並設計了雙向動態時間戳調整演算法(BDTA),可以在統一系統架構下支持多個可串列化級別。

該技術已應用於騰訊雲資料庫TDSQL中,確保TDSQL無任何數據異常,且具備高性能的可擴展性,解決了分散式資料庫在金融級場景應用的最核心技術挑戰,使得國產分散式資料庫實現在金融核心系統場景的可用。基於此,TDSQL是當前國內唯一進入國有大型銀行核心系統正式投產的國產分散式資料庫。


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

-Advertisement-
Play Games
更多相關文章
  • 今天看了段DNF視頻,有發現到血條變化效果是這樣的: 這裡為了突出Boss受到的傷害之大,也就是玩家的傷害之高,以至於Boss的血條變化會出現殘影效果。 那麼,就簡單使用協程來實現了一下這種效果: 實現思路也蠻簡單的:就是在Canvas下創建兩個Slider,分別是Slider和Slider01,先 ...
  • 一:背景 1.講故事 今天給大家帶來一個入門級的 CPU 爆高案例,前段時間有位朋友找到我,說他的程式間歇性的 CPU 爆高,不知道是啥情況,讓我幫忙看下,既然找到我,那就用 WinDbg 看一下。 二:WinDbg 分析 1. CPU 真的爆高嗎 其實我一直都在強調,要相信數據,口說無憑,一定要親 ...
  • 一、前言 本文章彙總c#中常見的鎖,基本都列出了該鎖在微軟官網的文章,一些不常用的鎖也可以參考微軟文章左側的列表,方便溫習回顧。 二、鎖的分類 2.1、用戶模式鎖 1、volatile 關鍵字 volatile 並沒有實現真正的線程同步,操作級別停留在變數級別並非原子級別,對於單系統處理器中,變數存 ...
  • 前言 拋開死鎖不談,只聊性能問題,儘管鎖總能粗暴的滿足同步需求,但一旦存在競爭關係,意味著一定會有線程被阻塞,競爭越激烈,被阻塞的線程越多,上下文切換次數越多,調度成本越大,顯然在高併發的場景下會損害性能。在高併發高性能且要求線程安全的述求下,無鎖構造(非阻塞構造)閃亮登場。 參考文檔: C# - ...
  • 在 Windows 環境下如果採用 IIS 作為 網站伺服器時,常規的網站綁定 HTTPS 需要一個一個站點手動選擇對應的證書綁定,而且證書過期之後更換證書時也是需要一個個重新綁定操作,無法便捷的做到像 Nginx 或者 Apache 等程式一樣,直接在配置文件中指定所需要使用的證書文件的路徑,像 ...
  • //源文件 void RccPhyConfig() { uint16_t retry = 0; RCC->APB1ENR|=1<<28; //電源介面時鐘使能 PWR->CR1|=3<<14; //高性能模式,時鐘可到 180Mhz PWR->CR1|=1<<16; //使能過驅動,頻率可到 216 ...
  • Babelfish是在PostgreSQL的基礎之上實現了類似Microsoft SQL Server部分功能。為了實現這個目標,PostgreSQL核心內部的幾個部分必須被修改。PostgreSQL 沒有提供這種開箱即用的功能,因此必須提供附加組件才能實現這一點。 Babelfish... ...
  • 摘要:數據加密作為有效防止未授權訪問和防護數據泄露的技術,在各種信息系統中廣泛使用。作為信息系統的核心,GaussDB(DWS)數倉也提供數據加密功能,包括透明加密和使用SQL函數加密。 本文分享自華為雲社區《看GaussDB(DWS)如何使用SQL加密函數實現數據列加解密》,作者:Hello EI ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...