fresh-tech-lab / fenix-study-group

A study group for tracking our progress
MIT License
10 stars 0 forks source link

第三章:交易處理 學習要點 #6

Open emily40830 opened 11 months ago

adrian-lin-1-0-0 commented 11 months ago

事務處理

手段

結果

Consistency

Local Transaction

ARIES(Algorithms for Recovery and Isolation Exploiting Semantics)

實現原子性和持久性

Crash Recovery (Failure Recovery /Transaction Recovery)

Commit Logging

  1. Commit Record
  2. End Record

Shadow Paging

  1. 複製副本
  2. 修改副本
  3. 修改指針指向副本

Commit Logging vs Write-Ahead Logging

Commit Logging

Write-Ahead Logging

Undo Log

  1. Analysis
  2. Redo
  3. Undo

image

實現隔離性

Isolation level

Global Transaction

事務提交

2PC(2 Phase Commit)

前提 必須假設網路在提交階段的短時間內是可靠的,即提交階段不會遺失訊息。同時也假設網路通訊在整個過程中都不會出現誤差,也就是可以遺失訊息,但不會傳遞錯誤的訊息,XA 的設計目標並不是解決諸如拜占庭將軍一類的問題。兩段式提交中投票階段失敗了可以補救(回滾),而提交階段失敗了無法補救(不再改變提交或回滾的結果,只能等崩潰的節點重新恢復),因而此階段耗時應盡可能短,這也是為了盡量控製網路風險的考量。 必須假設因為網路分區、機器崩潰或其他原因而導致失聯的節點最終能夠恢復,不會永久地處於失聯狀態。由於在準備階段已經寫入了完整的重做日誌,所以當失聯機器一旦恢復,就能夠從日誌中找出已準備妥當但並未提交的事務數據,並向協調者查詢該事務的狀態,確定下一步應該進行提交還是回滾操作。

  • 準備階段
  • 提交階段

image

缺點

3PC(3 Phase Commit)

image

Share Transaction

image

Distributed Transaction

CAP x ACID

image

可靠事件隊列

image

TCC (Try-Confirm-Cancel)

image

SAGA

補充

emily40830 commented 11 months ago

這週細節有夠多,WAL 那段可能還需要額外的內容,覺得光書中的內容還少了一些上下文跟 context @@ Ch3. 交易處理 Transaction(TX)

HuaYuan-Tseng commented 11 months ago

筆記 Link: Link 這週真滴猛烈 0.0

shihgangliu commented 11 months ago
linxinemily commented 11 months ago

吃瓜 Link

helloworldsmart commented 11 months ago

吃瓜參戰 Link

kehao-chen commented 11 months ago

學習要點

吃 🍉 為主,隨筆撰寫

本週改用 Heptabase,本週閱讀範圍很容易會花時間去研究延伸內容,筆記整理不多,且戰且走。

tuhacrt commented 11 months ago

事務處理 (Transaction)

目的: 一致性 C (consistency): 數據狀態完全一致。 手段:

  1. 原子性 A (Atomic): 單項業務處理只有成功或失敗,沒有中間態。
  2. 隔離性 I (Isolation): 不同業務處理間互不影響。
  3. 持久性 D (Durability): 提交的數據穩定持久化不丟失。

    本地事務

    泛指: 不需要經由全局事務管理器協調的事務。

    原子性和持久性

    由於在單項業務中進行操作可能會有各種不同的狀況(服務崩潰),會用以下兩種方式來保證。

  4. Commit Logging
    • 提交成功時產生 commit record
    • 修改成功時產生 end record
  5. Shadow Paging - 實現簡單,但併發能力有限。
    • 複製原數據
    • 修改副本
    • 將指針移至副本 Commit Logging 會導致在 commit record 之後,不允許任何其他操作修改數據,導致性能下滑。

      ARIES

      ARIES 提出了“Write-Ahead Logging”的日志改进方案 Write-Ahead Logging 依照事務提交的時間點分為兩種情況

  6. FORCE: 事務提交後,需要同時完成寫入
  7. STEAL: 事務提交前,允許提前寫入。 為了允許這兩種操作 Write-Ahead Logging 新增了 Undo Log 來提前記錄哪個部分會被修改。

隔離性

鎖分為三種:

  1. Write Lock(X-Lock): 數據被上 X-Lock 不可被寫,也不可被上讀鎖
  2. Read Lock(S-Lock): 數據被上 R-Lock 不可被寫,也不可被上寫鎖,只有一個事務有讀鎖則可升級為寫鎖
  3. Range Lock: 對於一個範圍實施排他鎖,不可被寫(含新增和刪除) 隔離性可以分為四個層級:
  4. 可串行化(Serializable): 要用時全部鎖起來
  5. 可重複讀(Repeatable Read): 不加上範圍鎖 => 可能導致 幻讀問題(Phantom Read)
  6. 讀已提交(Read Committed): 讀鎖在查詢完成後馬上釋放 => 可能導致 不可重複讀問題(Non-Repeatable Read)
  7. 讀未提交(Read Uncommitted): 只加寫鎖 => 可能導致 髒讀問題(Dirty Read)
outshaker commented 11 months ago

事務處理

內部一致性 => 單一數據源,採用 AID 古典解法。 外部一致性 => 多個數據源,問題變復雜。

拆分為四種情境討論

本地事務 Local Transaction

最基礎的解法,透過數據源本身達成。 實現原理可追溯至 Algorithms for Recovery and Isolation Exploiting Semantics,ARIES

A原子性 D持久性 => 寫入磁碟無法保證原子性,有可能發生崩潰Crash

實現原子性和持久性

崩潰復原 Crash Recovery, Failure Recovery, Transaction Recovery

提交日誌 Commit Logging 影子分頁 Shadow Paging => SQLite v3 的實作。原理更簡單,但性能不太足

Commit Logging 先天弱勢:沒辦法事務提交前修改磁碟內的數據 改進方式:提前寫入 Write-Ahead Logging,在事務提交前,提前寫入變更

Commit Logging => NO-FORCE, NO-STEAL。 Write-Ahead Logging => NO-FORCE, STEAL。搭配 Undo Log,Redo Log

恢復過程

NO-FORCE, STEAL => 性能最高,複雜度最高 FORCE, NO-STEAL => 性能最差,最低複雜度

實現隔離性

Concurrency Control => 隔離和併發是互相牴觸的

Serializable => 最高等級的隔離 Repeatable Read => 次一級,沒有範圍鎖,可能會有幻讀問題 Read Committed => ... Read Uncommitted => ...

多版本併發控制 Multi-Version Concurrency Control,MVCC 無鎖優化方案 => 只針對 讀+寫 方案優化 樂觀併發控制 Optimistic Concurrency Control,OCC

全域事務 Global Transaction

也有外部事務的說法,適用[單一服務,多個數據源]的情境,強一致性

1991 X/Open 提出 XA (XA eXtended Architecture) 的處理事務架構

XA 將事務提交拆分成為兩階段過程

  1. 準備階段
  2. 提交階段

還需要其他前提:網路是可靠的。

缺點:單點問題、性能問題、一致性風險

為了改善問題,於是提出三段式提交

改善了單點問題和回滾時的性能問題

共用事務 Share Transaction

數據源是指提供數據的邏輯設備,不必與物理設備一一對應

一種理論可行的方案是直接讓各個服務共用資料庫連接 ProxySQL

分散事務

CAP 定理說明了 CAP 三者之中僅能達成兩項。現今的分散式系統大多選擇放棄C一致性達成A可用性和P分區容忍性,而對於一致性的需求變成了接受弱一致性/最終一致性

最終一致性的說法出自於 BASE 理論 (Basically Available, Soft State, Eventually Consistent)

TCC 事務

全名 Try-Confirm-Cancel,類似 2PC,但導入既有專案還是需要一定的成本,而且也有現實狀況無法執行的困難 (下文提到 try 階段無法完成的狀況)

SAGA 事務

把大事務拆解成一系列子事務完成,在失敗時採用兩種恢復策略。

Carisa-Li commented 11 months ago

學習要點

事務處理

目標:維持一致性(Consistency)

CAP定理

類型:

crash無法避免,在考慮crash的情況下保證原子性及持久性

常用方法:

ARIES理論(Algorithms for Recovery and Isolation Exploiting Semantics)

隔離性

方法:

等級:

分布式事務的一致性 多服務多資料源

alxtz commented 10 months ago

link: https://app.heptabase.com/w/98f3311b812edc1184a454213ec35e583c543a3b35fb510d04dea723c9b6831c


Summary:Transaction,本質上是從想在分散式系統上,實作出各式一致性需求而發展出的模型

image

Summary:ACID/ARIES 是基於 RDBMS 在單一硬體上設計所發展出來的理論與實現,深度影響了後世對於 transaction 和一致性的理解

image

Summary:描述了 DB journaling 最經典的實作之一,WAL

image

當要處理多硬體(分散式系統時),ACID 及「可以有真正時間次序」的諸多框架會變得不用夠,需要開始了解弱一致性以及 quorum 類的設計

image

Summary:筆者試著用「不同的鎖法」來介紹 ANSI SQL isolation 及 phenomenon,值得一提的是各資料庫實現 isolation level 的實作與哲學都有諸多差異,使用上也經常會被工具搞的混亂(serializable vs. FOR UPDATE vs. atomic check and set vs. MVCC)

建議試著用不同資源來交叉理解 phenomenon 及 MVCC,才比較能達成理解

image

Note:後續的筆記整理不完

Summary:在後續的幾章節,「distributed transaction」的定義由於作者的劃分變得有些模糊;以下簡單描述我的理解

想解決分散式系統的一致性問題,可以把哲學主要劃分為兩類

  1. 試著在分散式系統上能達成 RDBMS 同等級的(強)一致性,以此基礎 2PC (XA), Paxos, Raft, TCC 類實作都屬於此。專屬名詞為維基上所定義的 Distributed Transaction/Distributed Consensus
  2. 試著定義出更細致的一致性變體

前者是 XA 組織、上個 decade 許多研究的方向,但後來還是發覺 distributed consensus 終究是效能差的,導致爾後的 NoSQL/NewSQL 都往 2. 方向努力 distributed consensus 還是有他實用的價值,包含用來設計第三方服務間的交互、節點數量可控時。但後來就較少被當成分散式系統一致性的最佳解

image