「分散式技術專題」併發系列三:樂觀併發控制之原型系統(分散式驗證)
原型系統 ——分散式驗證
Centiman: Elastic, High Performance Optimistic Concurrency Control by Watermarking 2015
concurrent8
Centiman是一個在雲環境基於NoSQL儲存層+事務處理層(OCC)實現的具備序列化事務隔離級別的KV系統,由KV儲存、事務處理子系統(包括處理結點和驗證結點)、全域性總控結點及客戶端組成。
一個事務的完整生命週期分為如下階段:
讀取階段
1.處理結點維護一個本地的已應用事務提交時間戳(watermark,此時間戳之前的資料更新已寫入kv儲存)及其它節點已應用事務提交時間戳的快取(快取定期非同步更新)
2.每次讀操作讀取最新版本的kv,處理結點會計算最新的watermark時間(取全域性最小),將key、version、watermark記入讀集;寫入操作需將kv快取到處理結點的事務私有記憶體空間並將key記入寫集
驗證階段
1.只讀和讀寫事務都需要走驗證流程(最佳化:處理結點若發現待驗證事務的所有讀時間戳都小於事務第一次讀時的watermark,則直接向客戶端返回提交)
2.處理結點給待驗證事務賦值一個全域性單調遞增的提交時間戳
3.將執行階段記錄的讀集、寫集按照key的某種分片規則分別傳送到對應的驗證結點,同時將事務私有記憶體中的資料非同步寫日誌
4.每個驗證節點維護一個滑動時間視窗,小於滑動時間視窗到來的驗證請求則直接返回驗證失敗;落在滑動視窗內的驗證請求按照事務提交時間戳順序進行處理並持續推進滑動視窗
5.採用BOCC演算法進行驗證,對於事務在某個分片驗證節點讀集中的每個key, 在驗證結點快取的事務寫集中查詢所有在讀key時間戳和待驗證事務提交時間戳之間提交的事務並驗證讀key是否與已提交事務的寫集衝突 (最佳化:如果讀key時間戳小於記錄的watermark時間戳,則衝突檢查區間可以縮小為在watermark時間戳和待驗證事務提交時間戳之間)
6.若衝突,則中止事務;否則,將待提交事務的寫集快取在驗證節點用於後續新事務的驗證並提交事務
7.如果所有相關驗證結點都同意提交事務,則發起驗證的處理結點寫提交日誌並通知客戶端,轉入寫入階段;否則直接通知客戶端事務已中止(可能存在有些驗證結點認為應該提交,有些驗證結點認為應該終止的狀態,雖然事務整體是終止狀態,但部分驗證結點會存在衝突誤判,論文中也是依賴watermark機制儘量減少誤判)
寫入階段
1.處理結點將事務本地記憶體中的更新內容寫入kv儲存(寫入過程不要求保證原子性,允許其它事務讀到部分寫入的新值;透過kv儲存的MVCC機制保證提交時間戳靠後的事務寫入的資料不會被提交時間戳靠前的事務寫入的資料覆蓋)
2.待全部寫入成功後,更新本地watermark並非同步記錄事務已完成日誌
這個系統的實現架構是具有一定代表性的,所有不支援
ACID事務的NoSQL系統都可以參照此原型架構實現序列化事務隔離級別,後續我們要研究的FoundationDB架構也與此類似,當然生產環境的資料庫還會考慮更具體的問題,比如幻讀的處理、效能最佳化等。
至此,本文列舉了
OCC在這一時期在學術及工業界的主要結果,可以看出主要是效能最佳化,擴充套件性提高及生產級系統的實踐。這裡也忽略了一些有代表性的OCC系統,比如Percolator[13]、Silo[17],因為這些系統在併發控制實現中使用了鎖機制並存在寫讀阻塞的情況,雖然可以降低事務中止率,但卻違背了OCC讀寫不阻塞、沒有死鎖的理念。
相比於前世理論研究的玩具,應用場景的缺乏,今生在記憶體及分散式資料庫場景的落地,理論與工業界不斷地效能最佳化等方面屢有建樹,其技術帶來的實際使用價值正越來越多地得到系統架構設計人員的認可,尤其是在跨分割槽、跨資料中心、跨地域分散式事務,實現序列化隔離級別等現今分散式資料庫尚未深入觸碰的領域有著巨大的挖掘潛力。
結語
本文按照時間線簡要回顧了 OCC從誕生、理論研究、原型系統驗證到生產系統落地的發展脈絡,從中可以看出OCC技術從1980年代初發展至今將近40年的時間了,一路走來磕磕絆絆,從不適用於傳統單機資料庫,到在記憶體資料庫中落地生根;從不適用於分散式資料庫,到完美實現在NoSQL分散式資料庫上支援ACID事務,甚至在跨分割槽事務、跨地域分散式系統的研究中也體現出了巨大的優勢,有理由相信OCC技術的樂觀、儘量減少事務同步開銷的理念在未來的雲環境中會有更多的運用。
在梳理
OCC發展歷程的過程中,筆者也逐漸總結出從技術角度應該如何分析實現了OCC的分散式資料庫系統(仍有待完善):
• 讀取階段
– 是否保證讀一致性
– 使用事務私有記憶體還是共享資料記憶體
– 私有記憶體在客戶端還是服務端
– 私有記憶體在服務端是單結點還是多結點
– 私有記憶體是否儲存讀入的資料
– 如何儘早發現衝突
• 驗證階段
– 事務提交時間戳如何分配
– 驗證演算法是BOCC還是FOCC模式
– 驗證和寫入階段是否需要原子完成
– 如何解決幻讀問題
– 如何降低事務中止率
– 如何避免事務餓死
– 如何降低長事務中止率
– 如何最佳化只讀事務
• 寫入階段
– 是否要求原子性
– 使用了什麼樣的原子提交協議,2PC、Paxos還是不需要
身為一名程式設計師,筆者恪守
Linus Torvalds大神說過的話:
talk is cheap, show me the code
把
OCC在生產系統中落地的只有Microsoft的記憶體資料庫Hekaton和Google的分散式KV資料庫Megastore。
以上為分散式技術專題之併發系列三:樂觀併發控制原型系統(分散式驗證), 「分散式技術專題」是國產資料庫 hubble 團隊精心整編,專題會持續更新,歡迎大家保持關注。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026685/viewspace-2935098/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 「分散式技術專題」併發系列三:樂觀併發控制之原型系統分散式原型
- 「分散式技術專題」併發系列三:樂觀併發控制之生產系統分散式
- 「分散式技術專題」併發系列三:樂觀併發控制之理論研究分散式
- 「分散式技術專題」併發系列三:樂觀併發控制之原型系統(動態調整提交時間戳)分散式原型時間戳
- 「分散式技術專題」併發系列一:基於加鎖的併發控制分散式
- 「分散式技術專題」併發系列二:基於時間的併發控制分散式
- 「分散式技術專題」資料切分與合併分散式
- [分散式][高併發]高併發架構分散式架構
- 高併發核心技術 - 冪等性 與 分散式鎖分散式
- 分散式鎖不是控制併發冪等的方式分散式
- 用分散式鎖解決併發問題分散式
- [分散式]高併發案例---庫存超發問題分散式
- 探索併發程式設計(七)——分散式環境中併發問題程式設計分散式
- 分散式系統設計中的併發訪問解決方案 | 得物技術分散式
- 高併發服務端分散式系統設計概要服務端分散式
- [分散式]對高併發流量控制的一點思考分散式
- 分散式鎖解決併發的三種實現方式分散式
- 分散式系統(三)——分散式事務分散式
- 分散式系統設計中的併發訪問解決方案分散式
- [分散式][高併發]限流的四種策略分散式
- 面試集錦(八)分散式與高併發面試分散式
- IPFS分散式儲存挖礦技術系統開發分散式
- 「分散式技術專題」副本機制分散式
- 「分散式技術專題」故障恢復分散式
- [分散式]架構設計原則--高併發分散式架構
- jmeter介面效能測試-高併發分散式部署JMeter分散式
- 【高併發】之分散式全域性唯一 ID分散式
- 分散式系統技術:儲存之資料庫分散式資料庫
- Java併發:樂觀鎖Java
- 分散式系統技術難題--異地多活分散式
- Symtavision — 分散式控制系統時間建模分析和驗證工具分散式
- 分散式儲存技術解讀系列之GFS分散式
- 圖解Janusgraph系列-併發安全:鎖機制(本地鎖+分散式鎖)分析圖解分散式
- 高併發架構系列:分散式鎖的由來、特點及Redis分散式鎖的實現詳解架構分散式Redis
- [分散式][高併發]熔斷策略和最佳實踐分散式
- Java併發:分散式應用限流 Redis + Lua 實踐Java分散式Redis
- Jmeter效能測試:高併發分散式效能測試JMeter分散式
- 分散式叢集與多執行緒高併發分散式執行緒