分佈式數據庫MVCC讀寫設計

分佈式數據庫數據表分成多個parition,分佈在不同server上,拓撲是每個server維護不同的版本時間戳,相比單機數據庫,提供MVCC要複雜很多,當然,你如果有spanner的原子鐘,那會簡單很多。

現描述一種可行的實現方案,拋磚引玉。

此方案可以做如下保證:

  • 1.單Partition讀(分分佈式事務讀)可以保重repeated read。

  • 2同一個server上的分佈式事務可以保證repeated read,並且對外保證因果序列;

  • 3.跨partition不能保證因果序,但可保證repeated read

數據模型

  • 1.每個server上多個parition,每個是一個MVCC數據結構,即有多個版本的數據
  • 2 每個server上一個publish_id,表示版本小於此值的數據都可以讀取到
  • 3 每個server上一個trans_id,表示後續寫入的數據的版本都是大於此值

分佈式事務寫

  • 1在兩階段提交的prepare階段,參與者發送prepare ack中攜帶一個版本號,即本地++trans_id的值
  • 2 協調者在收集到的parepare ack中選出時間戳最大的max_ver,發送commit
  • 3 參與者收到此請求後寫commit日誌,同時使用max_ver更新trans_id
  • 4 commit日誌落盤後,修改publish_id,並釋放行鎖

分佈式事務讀

由於跨server的分佈式讀不作任何保證,只討論同一個server的分佈式讀,簡單來說,就是去publish_id作爲版本號,如果目標行上有行鎖,且行鎖相關的版本號是小於publish_id的,則阻塞等待行鎖釋放,否則直接讀取即可。nweet/stackedit

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章