分布式系統概念 | 分布式事務:2PC、3PC、本地消息表

文章目錄

  • 分布式事務
  • 2PC(二階段提交協議)
    • 執行流程
    • 優缺點
  • 3PC(三階段提交協議)
    • 執行流程
    • 優缺點
  • 本地消息表(異步確保)


分布式事務

分布式事務就是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位于分布式系統的不同節點之上。

簡言之,就是一次大的操作由不同的小操作組成,這些小的操作分布在不同的服務器上,且屬于不同的應用,分布式事務需要保證這些小操作要么全部成功,要么全部失敗。 本質上來說,分布式事務就是為了保證不同數據庫的數據一致性。


2PC(二階段提交協議)

在分布式系統中,每一個機器節點雖然都能夠明確地知道自己在進行事務操作過程中的結果是成功或失敗,但是卻無法直接獲取到其他分布式節點的操作結果(即無法同步結果,一致性無法保證)。

為了保證事務處理的 ACID 特性,就需要引入一個稱為協調者的組件來統一調度所有分布式節點的執行邏輯,這些被調度的分布式節點則被稱為參與者。協調者負責調度參與者的行為,基于這個思想,衍生出了二階段提交三階段提交兩種協議。

2PC(Two-Phase Commit): 即二階段提交,是為了使基于分布式系統架構下的所有節點在進行事務處理過程中能夠保持原子性和一致性而設計的一種算法。


執行流程

第一階段的主要內容就是進行投票,來表明是否有繼續執行事務的必要。

階段一:提交事務請求(投票階段)

  • 事務詢問: 協調者向所有參與者發出事務詢問,詢問是否可以執行事務操作,并等待各參與者的響應。
  • 執行事務: 各個參與者節點執行事務操作,并將 undoredo 信息記入事務日志中。
  • 各參與者向協調者反饋事務詢問的響應: 如果參與者成功執行事務,則反饋 YES 響應;否則反饋 NO 響應。
  • 開啟第二階段: 協調者接收到所有參與者的 YES 響應后進入第二階段。

在第二階段中,會根據第一階段參與者的反饋來決定是否能夠提交事務,要么全都成功,要么全都失敗。

階段二:執行事務提交(執行階段)

  • 執行事務提交
    1. 發送提交請求: 協調者向所有參與者發起提交請求。
    2. 事務提交: 參與者在收到提交請求后,會正式執行事務提交操作。
    3. 反饋事務提交結果: 參與者在完成事務提交之后向協調者發送 ACK 消息。
    4. 完成事務: 協調者接收到所有參與者的 ACK 后完成事務。
  • 中斷事務(第一階段協調者未收到所有參與者的 YES 響應)
    1. 發送回滾請求: 協調者向所有參與者發起回滾請求。
    2. 事務回滾: 參與者在收到回滾請求后,利用階段一記錄的 undo 信息來執行事務回滾操作。
    3. 反饋事務回滾結果: 參與者在完成事務回滾之后向協調者發送 ACK 消息。
    4. 中斷事務: 協調者接收到所有參與者的 ACK 后完成事務中斷。

事務提交

在這里插入圖片描述

優缺點

  • 優點
    1. 原理簡單
    2. 實現方便
  • 缺點
    1. 同步阻塞: 在執行過程中,所有參與該事務操作的邏輯都會處于阻塞狀態,也就是說各個參與者在等待其他參與者響應的過程中將無法執行其他操作。
    2. 單點問題: 在上述過程中,協調者起到了核心的調度作用。一旦協調者出現了問題,那么整個提交流程將無法運轉,甚至如果在二階段的提交流程中出現了問題,將導致其他參與者都處于鎖定事務資源的狀態中,無法完成事務。
    3. 數據不一致: 倘若在第二階段的提交過程中,協調者向所有參與者發送提交請求,由于網絡原因導致只有部分參與者收到了提交請求,此時就導致了只有接收到請求的參與者進行了事務提交,而產生數據不一致的問題。
    4. 過于保守: 二階段提交協議沒有設計容錯機制,任意一個節點的失敗都會導致整個事務的失敗。

3PC(三階段提交協議)

3PC(Three-Phase Commit): 即三階段提交,為了解決二階段的缺陷,其將二階段提交協議的提交事務請求過程一分為二,形成了由 CanCommitPreCommitDoCommint 三個階段組成的事務處理協議:
在這里插入圖片描述

執行流程

階段一:CanCommit

  1. 事務詢問
  2. 各參與者向協調者反饋事務詢問的響應

階段二:PreCommit

  • 執行事務預提交

    1. 發送預提交請求
    2. 事務預提交
    3. 各參與者向協調者反饋事務執行的結果
  • 中斷事務

    1. 發送中斷請求
    2. 中斷事務

階段三:DoCommit

  • 執行提交
    1. 發送提交請求
    2. 事務提交
    3. 反饋事務提交結果
    4. 完成事務
  • 中斷事務
    1. 發送中斷請求
    2. 事務回滾
    3. 反饋事務回滾結果
    4. 中斷事務

需要注意的是,在階段三中可能會出現以下兩種問題:

  • 協調者出現問題(單點問題)
  • 協調者和參與者之間的網絡出現故障(網絡擁塞)

無論出現上述那種問題,最終都會導致參與者無法及時的接收到來自協調者的 DoCommit 或是 Abort 請求,針對這種異常情況,參與者都會在等待超時后繼續進行事務提交

優缺點

  • 優點: 相較于二階段提交協議,降低了參與者的阻塞范圍,并且能夠在出現單點故障后繼續達成一致。
  • 缺點: 三階段提交協議在去除阻塞的同時也引入了新的問題,那就是參與者在收到預提交的消息時,如果出現了網絡分區的情況,協調者與參與者無法進行正常的網絡通信,但是參與者依舊會進行事務的提交,從而導致數據的不一致

本地消息表(異步確保)

本地消息表業務數據表處于同一個數據庫中,這樣就能利用本地事務來保證在對這兩個表的操作滿足事務特性,并且使用了消息隊列來保證最終一致性。

  1. 在分布式事務操作的一方完成寫業務數據的操作之后向本地消息表發送一個消息,本地事務能保證這個消息一定會被寫入本地消息表中。
  2. 之后將本地消息表中的消息轉發到消息隊列中,如果轉發成功則將消息從本地消息表中刪除,否則繼續重新轉發。
  3. 在分布式事務操作的另一方從消息隊列中讀取一個消息,并執行消息中的操作。

在這里插入圖片描述

這里的消息隊列不是單純的數據結構,而應該看作由標志操作兩部分共同組成的中間件,用以標識某一操作是否成功,只有當左側的分布式節點確實完成了某項操作,右側的其他節點才有同步這項操作的必要。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443727.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443727.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443727.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構算法 | 單調棧

文章目錄算法概述題目下一個更大的元素 I思路代碼下一個更大元素 II思路代碼132 模式思路代碼接雨水思路算法概述 當題目出現 「找到最近一個比其大的元素」 的字眼時,自然會想到 「單調棧」 。——三葉姐 單調棧以嚴格遞增or遞減的規則將無序的數列進行選擇性排序…

最長下降子序列

文章目錄題目解法DP暴搜思路代碼實現貪心二分思路代碼實現題目 給出一組數據 nums,求出其最長下降子序列(子序列允許不連續)的長度。(類似于lc的最長遞增子序列) 示例: 輸入: 6 // 數組元素個…

Linux 服務器程序規范、服務器日志、用戶、進程間的關系

文章目錄服務器程序規范日志rsyslogd 守護進程syslog函數openlog函數setlogmask函數closelog函數用戶進程間的關系進程組會話系統資源限制改變工作目錄和根目錄服務器程序后臺化服務器程序規范 Linux 服務器程序一般以后臺進程(守護進程[daemon])形式運…

IO模型 :阻塞IO、非阻塞IO、信號驅動IO、異步IO、多路復用IO

文章目錄IO模型阻塞IO非阻塞IO信號驅動IO多路復用IO異步IOIO模型 根據各自的特性不同,IO模型被分為阻塞IO、非阻塞IO、信號驅動IO、異步IO、多路復用IO五類。 最主要的兩個區別就是阻塞與非阻塞,同步與異步。 阻塞與非阻塞 阻塞與非阻塞最主要的區別就…

Tomcat服務器集群與負載均衡實現

一、前言 在單一的服務器上執行WEB應用程序有一些重大的問題,當網站成功建成并開始接受大量請求時,單一服務器終究無法滿足需要處理的負荷量,所以就有點顯得有點力不從心了。另外一個常見的問題是會產生單點故障,如果該服務器壞掉…

Linux服務器 | 事件處理模式:Reactor模式、Proactor模式

文章目錄Reactor模式Proactor模式同步I/O模型模擬Proactor模式兩者的優缺點ReactorProactor同步I/O模型通常用于實現 Reactor 模式,異步I/O模型通常用于實現 Proactor 模式。(不是絕對的,同步I/O也可模擬出 Proactor 模式) React…

Linux服務器 | 服務器模型與三個模塊、兩種并發模式:半同步/半異步、領導者/追隨者

文章目錄兩種服務器模型及三個模塊C/S模型P2P模型I/O處理單元、邏輯單元、存儲單元并發同步與異步半同步/半異步模式變體:半同步/半反應堆模式改進:高效的半同步/半異步模式領導者/追隨者模式組件 :句柄集、線程集、事件處理器工作流程兩種服…

香農信息熵之可憐的小豬

文章目錄題目解析香農熵公式樣例具體分析代碼題目 有 n 桶液體,其其中 正好 有一桶含有毒藥,其裝的都是水。它們從外觀看起來都一樣。為了弄清楚哪只水桶含有毒藥,你可以喂一些豬喝,通過觀察豬是否會死進行判斷,實驗對…

字符串匹配之KMP(KnuthMorrisPratt)算法(圖解)

文章目錄最長相等前后綴next數組概念代碼實現圖解GetNext中的回溯改進代碼實現代碼復雜度分析最長相等前后綴 給出一個字符串 ababa 前綴集合:{a, ab, aba, abab} 后綴集合:{a, ba, aba, baba} 相等前后綴 即上面用同樣顏色標識出來的集合元素&#…

linux下tomcat6.0與jdk安裝詳細步驟

安裝Tomcat6.0和JDK1.6 在linux系統上安裝tomcat和jdk應該說是我學習linux知識的第一課了,之前只 是聽說過,從沒接觸過,但我們公司項目都是部署在linux系統上的,那天上司突 然給我發了幾個文檔,讓我看一下&#xff…

Android入門(一) | Android Studio的配置與使用

文章目錄安裝配置Android Studio使用Android Studio模擬器更改Android SDK的路徑Hello World!安裝配置Android Studio 從這一步開始: 一直點 next 即可,直到存儲路徑的選擇上,可以放到非 C 盤,這里我放到 D 盤了&am…

Android 入門(四) | Intent 實現 Activity 切換

文章目錄Intent顯式 Intent定義兩個 xml 文件android:orientationmatch_parent 和 wrap_contentIntent函數定義兩個 Activity隱式 Intent更多隱式 Intent 的用法用隱式 Intent 打開系統瀏覽器自建 Activity 以響應打開網頁的 Intent向下一個活動傳遞數據返回數據給上一個活動In…

Android入門(二) | 項目目錄及主要文件作用分析

文章目錄項目目錄分析app目錄分析AndroidManifest.xml 分析MainActivity.kt 分析build.gradle 分析最外層目錄下的 build.gradleapp 目錄下的 build.gradle項目目錄分析 我們來看一下 src/main/res 下的一些文件: .gradle 和 .idea :這兩個目錄下放置…

Android入門(三) | Android 的日志工具 Logcat

文章目錄日志工具類 android.util.LogLogcat 中的過濾器日志工具類 android.util.Log Log 從屬日志工具類 android.util.Log ,該類提供了五個方法供我們打印日志: Log.v() :用于打印那些最為瑣碎的、意義最小的日志信息。對應級別 verbose&…

Android 客戶端與服務器交互方式

突然想到一個問題就是Android客戶端與服務器交互有幾種方式,因為在腦袋里想當然的就是webservices和json。要在Android手機客戶端與pc服務器交互,需要滿足下面幾種條件:跨平臺、傳輸數據格式標準、交互方便...。 為了與服務器通訊其實無非就…

Android入門(五) | Activity 的生命周期

文章目錄Activity 的狀態及生命周期實現管理生命周期FirstActivitySecondActivityDialogActivity運行結果舊活動被回收了還能返回嗎?Activity 的狀態及生命周期 Android 的應用程序運用 棧(Back Stack) 的思想來管理 Activity: …

Android入門(六) | Activity 的啟動模式 及 生產環境中關于 Activity 的小技巧

文章目錄Activity 的啟動模式standardsingleTopsingleTasksingleInstance技巧了解當前界面是哪個 Activity隨時隨地退出程序啟動活動的最佳寫法Activity 的啟動模式 standard:默認的啟動方式,每次啟動一個活動都會重新創建singleTop:如果該活…

Android入門(七) | 常用控件

文章目錄TextView 控件:文本信息Button 控件:按鈕EditText 控件:輸入框ImageView 控件:圖片ProgressBar 控件:進度條AlertDialog 控件:提示框ProgressDialog 控件:帶有進度條的提示框TextView 控…

Android入門(八) | 常用的界面布局 及 自定義控件

文章目錄LinearLayout :線性布局android:layout_gravity :控件的對齊方式android:layout_weight:權重RelativeLayout :相對布局相對于父布局進行定位相對于控件進行定位邊緣對齊FrameLayout :幀布局Percent &#xff1…

Android入門(九)| 滾動控件 ListView 與 RecyclerView

文章目錄ListView內置類型的簡單運用定制數據類型提升效率點擊事件RecyclerView布局管理器點擊事件ListView 內置類型的簡單運用 由于手機屏幕空間有限,能夠一次性在屏幕上顯示的內容不多,當我們的程序有大量數據需要顯示的時候就可以借助 ListView 來…