Percolator 中的分佈式事務



Percolator 對外提供兩個主要的功能, 一個是分佈式事務, 另外一個是 observers, 這裏簡單介紹一下 Percolator 中分佈式事務的實現方法. 以下內容都出自對 google 論文 Large-scale Incremental Processing Using Distributed Transactions and Notifications 的學習. 這裏介紹的內容只是論文中的一個小部分, 涉及實現分佈式事務的核心思想, 目的是幫助大家理解原文.

在一個分佈式系統中, 實現對事務的支持是一件蠻有挑戰的事情. 分佈式系統的巨大併發量,  高錯誤容忍性, 物理上的分散, 都爲事務的實現埋下重重障礙.  Percolator 實現在 bigtable 的基石上, 充分利用了 bigtable 的特性, 巧妙的實現了對事務的支持.  

在實現分佈式事務的時候, Percolator 使用了兩個基本的服務, 一個提供精確時間用來產生timestamp, 另外一個提供一種簡單的分佈式鎖, 用來檢查一個進程是否還活着. 這兩個服務這裏不做介紹了.  我們集中精力來看 Percolator 是如何充分利用 bigtable 的單行原子性以及多版本這兩個特性來實現自己的分佈式事務的. 簡單來說, 就是把多列, 多表的事務的提交和回滾變成一個個單行事務. 我們看論文中的具體例子.
這個例子是從Bob的賬戶中轉7美金到joe的賬戶. 這是一個涉及到兩個 row 的事務.
下面的表示中, 冒號前面的部分是一個版本號, 可以通過時間服務來解決其取值問題, lock 這個列用來放鎖的情況. write 這個列放最終的數據寫入情況.
下面的敘述中請大家注意, 單行的操作是有原子性的( bigtable 的保證).

key     bal:data            bal:lock             bal:write
Bob     6:                  6:                   6: data @ 5
        5: $10              5:                   5:
        
Joe     6:                  6:                   6: data @ 5
        5: $2               5:                   5:
1 這個是初始狀態, bob 賬戶有10美金, joe 有2個美金.   write 列中的 6:data @ 5 表示 當前的數據是 version 爲 5 的(感謝 bigtable 的多版本支持)

Bob     7:$3                7: I am primary      7:
        6:                  6:                   6: data @ 5
        5: $10              5:                   5:
        
Joe     6:                  6:                   6: data @ 5
        5: $2               5:                   5:
2 事務的第一個階段, bob的賬戶變成3美金了. 注意 lock 列被加鎖, 並且標明自己是 primary. 沒個事務中, 只有一個primary, 也正是這個primary的存在, 使得我們能夠用行原子性來實現分佈式事務.

Bob     7: $3               7: I am primary      7:
        6:                  6:                   6: data @ 5
        5: $10              5:                   5:
        
Joe     7: $9               7: [email protected]   7:
        6:                  6:                   6: data @ 5
        5: $2               5:                   5:
3 現在給joe加上7美金, 所以joe是10美元了, 注意 joe 這一行的 lock 是指向 primary 的一個指針.

Bob     8:                  8:                   8: data@7
        7: $3               7:                   7:
        6:                  6:                   6: data @ 5
        5: $10              5:                   5:
        
Joe     7: $9               7: primary @ Bob.bal 7:
        6:                  6:                   6:data @ 5
        5: $2               5:                   5:
4 事務提交的第一階段, 提交 primary, 移除lock 列的內容 在 write 列寫入最新數據的 version 

Bob     8:                  8:                   8: data @ 7
        7: $3               7:                   7:
        6:                  6:                   6: data @ 5
        5: $10              5:                   5:
        
Joe     8:                  8:                   8: data@7
        7: $9               7:                   7:
        6:                  6:                   6: data @ 5
        5:$2                5:                   5:
5 事務提交的第二階段, 提交除 primary 之外其它部分. 提交的方式也是移除 lock, 同時在 write 列寫入新數據的 version

從這個講述我們看到是怎麼把兩行的事務用單行原子性搞定的了. 事務是否提交完全取決於 primary. 如果 primary 提交了, 則lock列被清空, write列標識了正確的版本號. 反之就是未提交. 這種方式可以用來處理多列, 多表, 的事務, 而且可以併發執行的事務數量幾乎是無限的. 因爲沒有任何全局鎖.
這個分佈式協議下, 如果出現了一個線程執行了事務的一部分crash掉, 或者出現衝突時如何解決, 大家可以自己推演一下或者去讀原論文, 這裏不再詳述.

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
閱讀(530) | 評論(0) | 轉發(0) |
給主人留下些什麼吧!~~
評論熱議
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章