分布式事務相比本地事務有很多額外的情況産生互動異常:
- 分布式中某個機器當機
- 網絡異常
- 釋出的消息丢失
- 發送的消息不保證接受順序(消息在傳遞與傳輸過程中産生不确定延遲)
- 資料錯誤
- 不可靠的TCP連接配接
- 某個節點的存儲資料丢失等
本地事務一般通過先寫日志(redo), 後寫資料庫的方式避免一些異常發生,或者根據日志復原資料.
本地資料庫的ACID原則
本地資料庫有ACID原則:原子性,一緻性,隔離性,持久性。
1. 原子性:某個事務的所有操作要麼全都完成,要麼全都不完成,不存在中間的停滞操作
2. 一緻性:一個事務如果是多個并發,系統也必須如同 串行一樣操作。事務必須始終保持系統處于一緻的狀态
3. 隔離性:如果有兩個事務在同一時間内執行相同的功能,那麼對于每個事務,應該認為此時隻有一個事務正在執行,在必要的時候對多個事務必須進行序列化。
4. 持久性:事務完成以後確定完成的狀态以及結果可以持久化的儲存在資料庫之中,不會復原。
分布式資料庫的CAP原則
對于分布式資料庫擇優CAP原則:一緻性,可用性,分區容錯性
- 一緻性:在分布式系統中的所有資料備份,在同一時刻是同樣的值
- 可用性:在叢集的某個結點故障之後,整體叢集是否還能相應用戶端的讀寫請求
- 分區容錯性:系統如果不能再一定時限内打成一緻性,則隻能在一緻性和可用上作出選擇。
對于這個cap理論,表明在分布式存儲體系中,CAP最多隻能實作其中兩點。由于網絡傳輸的延遲與丢包現象客觀存在,是以其實分區容錯性是必須要實作的,是以各個不同的分布式資料庫實際上是cp對或者是ap對。我們隻能在一緻性和可用性上進行權衡。
分布式資料庫由CAP原則擴充而來的BASE理論
由于分布式的特點,我們往往會追求高可用,那麼如何去實作高可用的資料庫,BASE理論是對CAP理論的一個擴充:
- 基本可用:指分布式系統在出現不可預知的故障的時候,允許損失部分性能——但不是完全不可通路。(可以接受的通路延遲,或者跳轉到降級頁面(秒殺))
- 軟狀态:與硬狀态相對,允許系統中的資料存在中間狀态,并認為該中間狀态不影響系統的整體可用性。(例如分布式的各個副本之間的同步過程就是軟狀态)
-
最終一緻性:強調在系統中的所有副本,在經過一段時間後,最終能夠達到一個一緻性的狀态,而不需要實時保證資料的強一緻性。
這套理論的核心思想是:我們無法做到強一緻性,但是我們可以根據自身的業務特點選擇合适的方式,使得整個業務最終處于一緻性狀态。
在實際工程中,最終一緻性主要有五個變種:
- 因果一緻性:如果程序A在完成了某項操作通知了程序B,那麼程序B之後再對該資料項進行通路後都應該能擷取到A更新的最新值,之後的操作也應該基于A的最新值。如果程序C沒有收到程序A的通知,那麼它在對同一資料進行通路或操作沒有該限制
- 讀己之所寫:程序A在更新一個資料項之後,他自己總是能夠通路到更新過得最新值,而不會看到舊值。對于單個資料的擷取者而言獲得的資料一定不會比上一次舊
- 會話一緻性:其将系統資料的通路框定在了一個會話中,保證了會話内所有事務保持“讀己之所寫”的一緻性,可以保證用戶端在會話内的一緻性
- 單調讀一緻性:指如果一個程序通路了某個資料項的某個值之後,該程序的後續對該資料項的通路都不應比這個值舊
- 單調寫一緻性:一個系統需要能夠保證來自同一個程序的寫操作被順序的執行。
在實際實作過程中,可以将其中的幾個變種任意的組合起來。在現代關系型資料庫中,都采用了最終一緻性模型。現代關系型資料庫大多都會采用同步或者異步的方式進行備份。同步方式是指強一緻性,當一個事務完成了主備庫均完成了事務資料達到了一緻。異步方式是主庫完成了事務,備庫在一段時間内對主庫進行同步,而這個過程往往存在延遲,這取決于 事務日志的傳輸時間長短。
那麼,如果由于某些原因日志無法傳達或過晚到達了備庫,那麼備庫的擷取到的資料就是舊的,而出現了不一緻的情況。後續可以通過多次重試等方式使其達到一緻性。
小結
BASE理論面向的是大型高可用分布式資料庫,與傳統事務的ACID的強一緻性不同的是,提出犧牲一部分一緻性而獲得高可用性。