Google Percolator 分布式事務模型

最近對 TiDB 特別感興趣麸祷,稍微研究了一下他們應用到的 Percolator 事務模型。

BigTable

BigTable 是一個分布式, 多維, 映射表褒搔。本質上說阶牍,BigTable 是一個鍵值(key-value)映射。主要有三個維度星瘾,分別是行走孽、列、時間戳琳状。

BigTable 存儲映射為:(row:string, column:string, time:int64)→string

從存儲的映射時間戳維度不難看出磕瓷,BigTable 是支持可以多版本控制(MVCC)的。

BigTable支持單行的事務念逞,可以保證一行多列的 ACID 特性困食。明顯單行事務對于一個現(xiàn)代化系統(tǒng)來說略顯不足,Percolator 借助 BigTable 實現(xiàn)了多行的分布式事務翎承。

Percolator事務流程

Percolator事務分為兩個階段:預寫(Pre-write)和提交(Commit)硕盹,本質上相當于一個加強的2PC。

需要應用 Percolator 事務的 BigTable 的表中叨咖,都需要加入下面兩個列族:

  • L列: 也就是 Lock 列瘩例,需要記錄該行數(shù)據(jù)的鎖信息
  • W列:也就是 Write 列,需要記錄該行數(shù)據(jù) Last Committed 的數(shù)據(jù)版本甸各,用來做版本控制垛贤。

為什么說列族呢?首先 BigTable 一行中每一個列是允許存儲多個時間版本的數(shù)據(jù)趣倾,方便實現(xiàn)例如:讀已提交聘惦、讀未提交、可重復度儒恋、序列化等事務隔離級別部凑。

預寫(Pre-write)

這里引用 Percolator 原文的一個例子露乏,我們需要將 Bob 的賬戶中的 7 元轉給 Joe 的賬戶中。

初始狀態(tài)

首先我們看 bal:write 列涂邀,此時 Bob 和 Joe 最新的一個時間戳版本 6 都指向各自的 data@5瘟仿,說明在 6 這個時間戳版本中: Bob 的賬戶余額有 10 元,Joe 的賬戶余額有 5 元比勉。那么持有大于時間戳 6 的事務進行讀未提交的時候劳较,可以讀到時間戳版本為 5 的 bal:data。

初始狀態(tài)

Pre-Write

在 Percolator 里面浩聋,首先需要把在同一個事務里面多個 Key 隨機選出一個 Primary Key 和多個 Secondary Key观蜗。所在數(shù)據(jù)行分別稱為 Primary Row 和 Secondary Row。

首先進行的是 Primary Row 的 Pre-Write 操作:

  1. TSO 拿到當前時間戳 start_ts = 7
  2. 檢查 <Bob bal:write> 列衣洁,如果有大于 7 的數(shù)據(jù)版本則提交失敗墓捻,有則說明其他事務已經(jīng)寫入數(shù)據(jù)(寫沖突),沒有則繼續(xù)處理
  3. 檢查 <Bob bal:lock> 列坊夫,如果有小于 7 的數(shù)據(jù)版本鎖則提交失敗砖第,有則說明其他事務已經(jīng)占用數(shù)據(jù),沒有則加鎖繼續(xù)處理
  4. 設置 <Bob bal:data 7>3

此時已經(jīng)完成了 Primary RowPre-Write 操作环凿。2~4 步驟需要在同一個 bigtable 事務里面進行原子操作梧兼。

可能會有疑問為什么在此時已經(jīng)把數(shù)據(jù)列 <Bob bal:data 7> 寫上了?其實由于 <Bob bal:write> 列最新的數(shù)據(jù)還未寫入智听,在其他事務看來羽杰,這屬于未提交內(nèi)容,其他事務可以根據(jù)事務隔離級別有選擇讀取 <Bob bal:data> 的時間戳版本數(shù)據(jù)到推。

Primary Row Pre-Write

那么針對多個 Secondary Row 的 Pre-Write 也與 Primary Row 類似考赛,只是鎖的記錄需要指向 Primary Row 的鎖。這樣子實現(xiàn)了去中心化的鎖管理莉测,把Secondary Lock 與 Primary Lock 關聯(lián)了起來欲虚。

Secondary Row 的 Pre-Write 操作:

  1. 拿到 Primary Row 的 Pre-Write 中獲得的時間戳 start_ts = 7
  2. 檢查 <Joe bal:write> 列悔雹,如果有大于 7 的數(shù)據(jù)版本則提交失敗,有則說明其他事務已經(jīng)寫入數(shù)據(jù)(寫沖突)欣喧,沒有則繼續(xù)處理腌零。
  3. 檢查 <Joe bal:lock> 列,如果有小于 7 的數(shù)據(jù)版本鎖則提交失敗唆阿,有則說明其他事務已經(jīng)占用數(shù)據(jù)益涧,沒有則加鎖繼續(xù)處理。
  4. 設置 <Joebal:data 7>9驯鳖。

多個 key 也是類似闲询,在實際應用場景中久免,可以異步對多個 key 加鎖,加快速度扭弧。

Secondary Row Pre-Write

自此預寫(Pre-write)過程已經(jīng)完成了阎姥!

提交(Commit)

目前為止已經(jīng)把想要修改到的數(shù)據(jù)已經(jīng)加好鎖了,接下來需要進行 Commit 操作鸽捻。

首先進行的是 Primary Row 的 Commit 操作:

  1. TSO 拿到當前時間戳 commit_ts = 8呼巴。
  2. 檢查 <Bob bal:lock> 列,看鎖是否存在御蒲,不存在則可能已經(jīng)被清除了衣赶,取消事務;存在則繼續(xù)厚满。
  3. commit_ts 為版本號府瞄,指向 bal:write 列的 start_ts 對應數(shù)據(jù)版本。也就是把 <Bob bal:write 8> 設置為 data@7碘箍。此步驟完成后遵馆,寫入的數(shù)據(jù)版本已經(jīng)生效,也就是對讀已提交事務可見了敲街。
  4. 刪除鎖信息团搞,讓其可寫。

1~3步驟需要在一個 bigtable 事務里面進行原子操作多艇。

Primary Row Commit

Secondary Row 的 Commit 操作與 Primary Row 的類似逻恐。

Secondary Row Commit

隨便聊點

事務隔離級別

與傳統(tǒng)數(shù)據(jù)庫事務隔離級別(讀已提交、讀未提交峻黍、可重復度复隆、可序列化)相比,Percolator 提供了快照隔離級別姆涩。

優(yōu)點:

  • 保證事務中的讀操作讀到對應數(shù)據(jù)版本挽拂,避免產(chǎn)生不可重復讀的問題。
  • 保證多事務中的寫操作不會更新到同一條記錄骨饿。

缺點也比較明顯:

  • 寫傾斜(Write)問題亏栈。
  • 樂觀事務會產(chǎn)生寫熱點問題。

鎖管理

Percolator 拋棄中心鎖管理宏赘,把鎖信息分散數(shù)據(jù)當中绒北。通過區(qū)分 Primary 和 Secondary,巧妙的設置了一個標志察署,后續(xù)的異常處理都可以通過這個標簽來進行闷游。

鎖有可能有以下異常:

  1. Prewrite 中斷,還進行 primary lock 或者寫 secondary lock 到一半系統(tǒng)崩潰。
  2. Commit 中斷脐往,未進行 primary commit 或者 primary commit 到一半系統(tǒng)崩潰休吠。

此時就需要用到鎖清理,鎖清理不需要另外開任務去管理和回收业簿。只需要在讀操作的時候遇到鎖的時候特殊處理即可瘤礁。減輕了鎖維護的成本,也簡化了整個鎖的管理模型辖源。

那是怎么處理的呢蔚携?

每個事務開啟的時候都會從 TSO 獲取事務開始時間 start_ts ,通過判斷某一行數(shù)據(jù)的 lock 列是否在 (0, start_ts] 范圍內(nèi)為兩種情況:

  1. 不在克饶;說明此鎖可讀:首先讀取 write 列小于 start_ts 的最大的數(shù)據(jù)酝蜒,然后去讀 data 列。
  2. 在矾湃;說明此鎖不可讀亡脑,此時如果按照鎖可讀情況處理的話,可能會產(chǎn)生讀未提交的問題邀跃。

在鎖不可讀的情況下霉咨,也不可能無休止等待,在一定的延遲后拍屑,會進行以下操作:

  1. 遇到 primary lock 還在途戒,可以進行鎖清除。
  2. 遇到 secondary lock 還在僵驰,檢查 primary lock喷斋。
    1. primary lock 還在,事務 commit 失敗蒜茴,回滾事務
    2. primary lock 不在星爪,事務 commit 已經(jīng)成功了,進行事務前滾(沒錯粉私,就是前滾)顽腾。

Percolator 缺點

  1. 由于依賴 TSO,會發(fā)現(xiàn)網(wǎng)絡交互比較多诺核;TiDB 團隊針對退出了 Async Commit抄肖,可以減少網(wǎng)絡交互。
  2. 樂觀鎖存在熱點讀寫回滾風暴問題窖杀;TiDB 團隊針對此推出了悲觀事務模型漓摩。
  3. 依賴讀清理鎖,會有寫沖突問題陈瘦。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子痊项,更是在濱河造成了極大的恐慌锅风,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞍泉,死亡現(xiàn)場離奇詭異皱埠,居然都是意外死亡,警方通過查閱死者的電腦和手機咖驮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門边器,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人托修,你說我怎么就攤上這事忘巧。” “怎么了睦刃?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵砚嘴,是天一觀的道長。 經(jīng)常有香客問我涩拙,道長际长,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任兴泥,我火速辦了婚禮工育,結果婚禮上,老公的妹妹穿的比我還像新娘搓彻。我一直安慰自己如绸,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布好唯。 她就那樣靜靜地躺著竭沫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骑篙。 梳的紋絲不亂的頭發(fā)上蜕提,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音靶端,去河邊找鬼谎势。 笑死,一個胖子當著我的面吹牛杨名,可吹牛的內(nèi)容都是我干的脏榆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼台谍,長吁一口氣:“原來是場噩夢啊……” “哼须喂!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤坞生,失蹤者是張志新(化名)和其女友劉穎仔役,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體是己,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡又兵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卒废。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沛厨。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摔认,靈堂內(nèi)的尸體忽然破棺而出逆皮,到底是詐尸還是另有隱情,我是刑警寧澤级野,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布页屠,位于F島的核電站,受9級特大地震影響蓖柔,放射性物質發(fā)生泄漏辰企。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一况鸣、第九天 我趴在偏房一處隱蔽的房頂上張望牢贸。 院中可真熱鬧,春花似錦镐捧、人聲如沸潜索。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竹习。三九已至,卻和暖如春列牺,著一層夾襖步出監(jiān)牢的瞬間整陌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工瞎领, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人九默。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓震放,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驼修。 傳聞我的和親對象是個殘疾皇子殿遂,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 前言 前段時間忙雙11忙到廢寢忘食诈铛,這期間又被各種奇奇怪怪的小病折騰了半個多月,整個人狀態(tài)不是很好墨礁,博客也連續(xù)吃灰...
    LittleMagic閱讀 2,965評論 7 9
  • 在進入正題之前癌瘾,先來思考下跨節(jié)點的數(shù)據(jù)如何實現(xiàn)同進退(ACID),如果對分布式事務本身有一定了解可跳過這里饵溅。如圖:...
    Eshin_Ye閱讀 2,665評論 0 1
  • --- Percolator 事務隔離級別SI Percolator提供跨表、跨行的分布式事務妇萄,隔離級別為快照隔離...
    CodeLess閱讀 964評論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月蜕企,有人笑有人哭,有人歡樂有人憂愁冠句,有人驚喜有人失落轻掩,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,535評論 28 53
  • 人工智能是什么?什么是人工智能懦底?人工智能是未來發(fā)展的必然趨勢嗎唇牧?以后人工智能技術真的能達到電影里機器人的智能水平嗎...
    ZLLZ閱讀 3,776評論 0 5