Open emily40830 opened 1 year ago
這週細節有夠多,WAL 那段可能還需要額外的內容,覺得光書中的內容還少了一些上下文跟 context @@ Ch3. 交易處理 Transaction(TX)
筆記 Link: Link 這週真滴猛烈 0.0
吃瓜 Link
吃瓜參戰 Link
目的: 一致性 C (consistency): 數據狀態完全一致。 手段:
泛指: 不需要經由全局事務管理器協調的事務。
由於在單項業務中進行操作可能會有各種不同的狀況(服務崩潰),會用以下兩種方式來保證。
ARIES 提出了“Write-Ahead Logging”的日志改进方案 Write-Ahead Logging 依照事務提交的時間點分為兩種情況
鎖分為三種:
內部一致性 => 單一數據源,採用 AID 古典解法。 外部一致性 => 多個數據源,問題變復雜。
拆分為四種情境討論
最基礎的解法,透過數據源本身達成。 實現原理可追溯至 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
也有外部事務的說法,適用[單一服務,多個數據源]的情境,強一致性
1991 X/Open 提出 XA (XA eXtended Architecture) 的處理事務架構
XA 將事務提交拆分成為兩階段過程
還需要其他前提:網路是可靠的。
缺點:單點問題、性能問題、一致性風險
為了改善問題,於是提出三段式提交
改善了單點問題和回滾時的性能問題
數據源是指提供數據的邏輯設備,不必與物理設備一一對應
一種理論可行的方案是直接讓各個服務共用資料庫連接 ProxySQL
CAP 定理說明了 CAP 三者之中僅能達成兩項。現今的分散式系統大多選擇放棄C一致性達成A可用性和P分區容忍性,而對於一致性的需求變成了接受弱一致性/最終一致性。
最終一致性的說法出自於 BASE 理論 (Basically Available, Soft State, Eventually Consistent)
全名 Try-Confirm-Cancel,類似 2PC,但導入既有專案還是需要一定的成本,而且也有現實狀況無法執行的困難 (下文提到 try 階段無法完成的狀況)
把大事務拆解成一系列子事務完成,在失敗時採用兩種恢復策略。
事務處理
目標:維持一致性(Consistency)
CAP定理
類型:
crash無法避免,在考慮crash的情況下保證原子性及持久性
常用方法:
ARIES理論(Algorithms for Recovery and Isolation Exploiting Semantics)
隔離性
方法:
等級:
分布式事務的一致性 多服務多資料源
link: https://app.heptabase.com/w/98f3311b812edc1184a454213ec35e583c543a3b35fb510d04dea723c9b6831c
Summary:Transaction,本質上是從想在分散式系統上,實作出各式一致性需求而發展出的模型
Summary:ACID/ARIES 是基於 RDBMS 在單一硬體上設計所發展出來的理論與實現,深度影響了後世對於 transaction 和一致性的理解
Summary:描述了 DB journaling 最經典的實作之一,WAL
當要處理多硬體(分散式系統時),ACID 及「可以有真正時間次序」的諸多框架會變得不用夠,需要開始了解弱一致性以及 quorum 類的設計
Summary:筆者試著用「不同的鎖法」來介紹 ANSI SQL isolation 及 phenomenon,值得一提的是各資料庫實現 isolation level 的實作與哲學都有諸多差異,使用上也經常會被工具搞的混亂(serializable vs. FOR UPDATE vs. atomic check and set vs. MVCC)
建議試著用不同資源來交叉理解 phenomenon 及 MVCC,才比較能達成理解
Note:後續的筆記整理不完
Summary:在後續的幾章節,「distributed transaction」的定義由於作者的劃分變得有些模糊;以下簡單描述我的理解
想解決分散式系統的一致性問題,可以把哲學主要劃分為兩類
- 試著在分散式系統上能達成 RDBMS 同等級的(強)一致性,以此基礎 2PC (XA), Paxos, Raft, TCC 類實作都屬於此。專屬名詞為維基上所定義的 Distributed Transaction/Distributed Consensus
- 試著定義出更細致的一致性變體
前者是 XA 組織、上個 decade 許多研究的方向,但後來還是發覺 distributed consensus 終究是效能差的,導致爾後的 NoSQL/NewSQL 都往 2. 方向努力 distributed consensus 還是有他實用的價值,包含用來設計第三方服務間的交互、節點數量可控時。但後來就較少被當成分散式系統一致性的最佳解
事務處理
手段
結果
Consistency
Local Transaction
ARIES(Algorithms for Recovery and Isolation Exploiting Semantics)
實現原子性和持久性
Crash Recovery (Failure Recovery /Transaction Recovery)
Commit Logging
Shadow Paging
Commit Logging vs Write-Ahead Logging
Commit Logging
Write-Ahead Logging
Undo Log
實現隔離性
Isolation level
Global Transaction
事務提交
2PC(2 Phase Commit)
缺點
3PC(3 Phase Commit)
Share Transaction
Distributed Transaction
CAP x ACID
可靠事件隊列
TCC (Try-Confirm-Cancel)
SAGA
補充