在知乎引发众多分布式数据库大佬争相回答的问题
原問題:如何理解數據庫的內部一致性和外部一致性?
?
前言
提問者應該是看完了 Google Spanner 的論文,對其中的外部一致性這個詞不太了解,所以提出了這個問題。之前看 Spanner 的時候,我也不是很理解外部一致性的具體含義,只是當時并沒有鉆這個 "牛角尖"。最近突然想把這個問題弄清楚,所以整理了下面幾位的回答。第一位作者的回答點明了 ACID?的?C?和?CAP?的?C?是不一樣的。這里我想說的是,學習計算機的同學應該在不同的課程或書籍中都聽過或看到過一致性這個詞,但是它們涉及的領域及其含義卻是完全不同的。包括分布式領域中的分布式事務的一致性和?Paxos 協議解決的一致性,這兩者也不是一回事。在理解基礎概念的區別后,再看第二位和第三位的回答便可對這個問題有清晰的認識。
?
?
作者鳴嵩的回答
ACID?的?C?和?CAP?的?C?是不一樣的。
數據庫教科書里提煉的,ACID?的?C?指的是從業務層面定義約束,例如銀行轉賬場景,轉入和轉出金額要平衡,又或者外鍵指向的行必須存在,這個?C?一方面依賴數據庫的保證,例如原子性,也依賴于業務特性和業務層代碼實現。
CAP?的?C?是現代分布式系統中大家經常談到的一致性,其內涵和外延比較豐富。例如,ACID?中的?I,在分布式系統中如何保證并發?Query?的隔離級別?Isolation,可以認為是一種一致性;多副本間達到一致狀態機如?Paxos?和?Raft,也是一種一致性。
?
?
作者郁白的回答
最初在數據庫文章中見到的?"外部一致性",是?Google?提出的,它是為了解釋在分布式事務中遇到的問題而提出的。這里的一致性描述的是非?lock base 的事務引擎下,多個事務之間,數據如何相互可見的性質。
多個并發事務讀寫的數據(或數據范圍),它們能夠被數據庫感知到沖突(讀寫之間也算沖突),因此它們在時間線上的順序由數據庫確定,這樣的事務間一致性問題可以被認為是內部一致性問題,Ansi Sql Isolation?定義的隔離級別就是定義內部一致性的。
而先后執行(執行區間不重疊)的多個事務,它們的在時間線上的順序由用戶確定,數據庫無法感知到他們之間的關系,它們之間的一致性問題可以被認為是外部一致性問題。
外部一致性問題在?lock base?或?mvcc?實現的單機數據庫中并不存在,而在分布式事務中比較常見的不滿足外部一致性的情況是?"寫后讀",即提交成功后不能立即能夠被讀到;還有一種更復雜的情況,可以稱之為 "半寫后讀",比如客戶端依次執行以下事務:
T1: write A; T2: write B; T3: read A and B;如果沒有全局時鐘,那么就可能出現?T3?讀取到最新的?B,但是沒能讀取到最新的?A(又或者是能讀到最新的 A,卻讀不到最新的 B)。所以?"內部"?和?"外部"?最重要的區別是可見順序由數據庫(內部)確定,還是由用戶(外部)確定。
?
?
作者歡歌的回答
對外部一致性的認知,主要來自于?Spanner?的?paper。寫下自己讀?paper?過程中的理解吧。個人認為,外部一致性描述的不是并發問題,而是在物理時間上先后發生的事務間的關系。外部一致性的目標是:假設事務?T1?執行完成后,T2?才啟動,保證讓?T2?看到?T1?的結果。
?
這個目標看起來比較好實現,因為?T2?開始時,T1?已經執行完成了。那為什么外部一致性成為?Spanner?的主要問題?主要來自兩個方面:
(1)?T1?和?T2?的時間戳可能來自位于不同?region?的?server(server?一般是某個?Paxos Group 的 Leader);
(2)?不同?region?間的?server?之間,時間沒法嚴格同步,即存在誤差。(雖然?Spanner 用了高大上的硬件以及配套算法來同步時鐘,仍然不能絕對保證跨?region?的服務器的時鐘嚴格同步。因為跨了延遲達到?100ms?的廣域網。)
?
舉個例子來討論吧: 用戶?A?給帳戶?X?存款 10 萬(對應事務T1),發生在中國;用戶?B 查詢帳戶?X?的余額(對應事務?T2),發生在美國。我們把服務器的誤差稍微放大點,比如10 s。
(1)?存款事務?T1?執行時,獲取的提交時間戳為?t1;
(2)?T1?執行完成后,A?打電話給?B,說錢已經存上了;
(3)?B?去查詢(事務T2),T2?獲取的時間戳可能是?t2?- 5s; 由于?t2-5s < t1,按照時間戳比較,根本查詢不到?T1?的結果(按照物理時間,T1?在?T2?啟動前已經完成。二者不是并發的,但執行結果違背了物理時間上事務發生的順序,即違背了外部一致性)。
?
?
原問題鏈接:https://www.zhihu.com/question/56073588
總結
以上是生活随笔為你收集整理的在知乎引发众多分布式数据库大佬争相回答的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云原生数据库:POLARDB
- 下一篇: RDMA 知识概述