事務管理概述
事務(Transaction)提供一種機制,它将一個執行過程涉及的所有操作都納入一個不可分割的執行單元。組成事務的所有操作隻有在所有操作均能正常執行的情況下方能提交,隻要其中任一操作執行失敗,都将導緻整個事務的回滾。事務擁有ACID特性,後面我們會對事務的ACID特性做進一步說明。
本地事務和分布式事務
本地事務是在同一個進程實例中調用不同的資源形成事務,緊密依賴底層資源管理器(例如數據庫連接),事務處理局限在當前事務資源内。此種事務處理方式不存在對其他應用進程或實例的依賴。一般來說,本地事務隻涉及一個Connection的Commit。本地事務用JDBC事務可以實現,依賴數據庫機制就可以保證事務的ACID特性。下圖是模拟購物系統的兩個模塊組成的本地事務的案例。
項目早期,在系統規模及用戶體量不大的時候,兩個模塊打包在同一個系統中,通過本地事務就可以保證訂單表(Order Table)和賬務表(Account Table)的數據一緻性,然而随着系統容量的增加,基于規模、擴展性、性能、共享等因素,需要将兩個模塊拆分成獨立的微服務,這時兩個模塊如果需要數據的同步,就面臨數據不一緻的問題。
而使用分布式事務是早期解決非本地事務的一個主要手段。分布式事務指事務的參與者、支持事務的服務器、資源服務器及事務管理器分别位于不同的分布式系統的不同節點上。而分布式事務的實現方式有很多種,最具有代表性的是由Oracle Tuxedo系統提出的XA分布式事務協議。XA協議包括兩階段提交(2PC)和三階段提交(3PC)兩種。下圖反映了跨越多個服務的一個分布式事務場景。
微服務獨立數據庫模式
微服務分布式架構傾向于為每一個獨立的服務使用各自獨立的數據庫,因為如果不同微服務采用共享存儲的方案,那麼這兩種服務就在數據層面産生了一種“有狀态”的數據依賴關系,兩個服務之間就産生耦合關系,在共享存儲的情況下很難做到系統的獨立性和自治性,對後期業務的擴展、可用性等方面都會産生重大影響,所以合理的方式就是各自使用獨立的數據存儲。使用消息傳遞或者分布式事務方式保證服務之間的數據一緻性,而2PC就是比較傳統和典型的數據一緻性方案。
ACID理論關系數據庫天生可以解決具有複雜事務場景的問題,關系數據庫完全滿足ACID特性。ACID的具體含義如下。
● 原子性(Atomicity):事務作為一個整體被執行,包含在其中的數據庫操作要麼全部被執行,要麼全部都不執行。
● 一緻性(Consistency):事務應确保數據庫的狀态從一個一緻狀态轉變為另一個一緻狀态。一緻狀态指數據庫中的數據應滿足完整性約束。除此之外,一緻性還有另外一層語義,就是事務的中間狀态不能被觀察到(這層語義也有說應該屬于原子性)。
● 隔離性(Isolation):多個事務并發執行時,一個事務的執行不應影響其他事務的執行,如同隻有這一個操作在被數據庫執行一樣。
● 持久性(Durability):已被提交的事務對數據庫的修改應該永久保存在數據庫中。在事務結束時,此操作将不可逆轉。
具有ACID特性的數據庫支持強一緻性。強一緻性表示數據庫本身不會出現不一緻的情況,每個事務都是原子的,或者成功或者失敗,事務間是隔離的,互相完全不影響,而且最終狀态是持久落盤的。因此,數據庫會從一個明确的狀态到另一個明确的狀态,中間的臨時狀态是不會出現的,如果出現也會被及時自動修複,因此是強一緻的。
我們的本地事務由資源管理器進行管理:事務的ACID特性是通過InnoDB日志和鎖來保證的。InnoDB是MySQL的一個存儲引擎,大部分人對MySQL都比較熟悉,這裡簡單介紹一下數據庫事務實現的一些基本原理。在本地事務中,服務和資源在事務的包裹下可以看作是一體的。
● InnoDB隔離性實現:通過數據庫鎖的機制實現。
● InnoDB原子性和一緻性實現:通過UndoLog來實現事務的原子性。在操作任何數據之前,首先将數據備份到一個地方(這個存儲數據備份的地方稱為UndoLog),然後進行數據的修改。如果出現了錯誤或者用戶執行了ROLLBACK語句,則系統可以利用UndoLog中的備份将數據恢複到事務開始之前的狀态。
● InnoDB持久性實現:通過RedoLog(重做日志)來實現,RedoLog記錄的是新數據的備份。在事務提交前,隻要将RedoLog持久化即可,不需要将數據持久化。當系統崩潰時,雖然數據沒有持久化,但是RedoLog已經持久化。系統可以根據RedoLog的内容,将所有數據恢複到最新的狀态。
嚴格的ACID事務對隔離性的要求很高,在事務執行中必須将所有的資源鎖定。對于長事務來說,整個事務期間對數據的獨占,将嚴重影響系統的并發性能。因此,在高并發場景中,對ACID的部分特性進行放松,從而提高性能,這便産生了CAP理論和BASE理論。
一緻性理論一緻性就是數據保持一緻,在分布式系統中,可以理解為多個節點中數據的值是一緻的。而一緻性又可以分為強一緻性和弱一緻性。
最終一緻性本質上也是弱一緻性的一種特殊形式。分布式事務的目的是保障跨數據庫的數據一緻性,而跨數據庫的事務操作是不可控的,網絡及個别節點宕機都會造成數據的不一緻。單機事務的ACID特性不适用于分布式網絡條件下的事務控制,CAP理論告訴我們,數據的一緻性和服務可用性、分區容忍無法同時滿足;而BASE理論強調,在分布式系統下的數據一緻性應該放棄瞬時态的一緻性來換取服務的可用性和數據的最終一緻性。數據一緻性模型可以分為下面三類:
● 強一緻性:是程度最高的一緻性要求,也是最難實現的。以關系數據庫中更新操作為案例,系統中的某個數據被成功更新後,後續任何對該數據的讀取操作都是更新後的值。
● 弱一緻性:系統中的某個數據被更新後,後續對該數據的讀取操作可能得到更新後的值,也可能是更改前的值。但經過“不一緻時間窗口”這段時間後,後續對該數據的讀取都是更新後的值。
● 最終一緻性:在某一時刻用戶或者進程查詢到的數據可能都不同,但是最終成功更新的數據都會被所有用戶或者進程查詢到。簡單理解為,在一段時間後,數據會最終達到一緻狀态。這個狀态是弱一緻性的特殊形式,存儲系統保證在沒有新的更新的條件下,最終所有訪問的都是最後更新的值。
CAP理論分布式事務一直是業界的難題,難在CAP定理,即一個分布式系統最多隻能同時滿足一緻性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance)這三項中的兩項。
● C:表示一緻性,所有數據變動都是同步的,數據一緻更新。
● A:表示可用性,指在任何故障模型下,服務都會在有限的時間内處理響應。
● P:表示分區容忍、分區容錯性和可靠性。
在分布式系統中,網絡無法100%可靠,分區其實是一個必然,如果我們選擇了CA而放棄了P,那麼當發生分區現象時,為了保證一緻性,必須拒絕請求,但是A又不允許,所以分布式系統理論上不可能選擇CA架構,隻能選擇CP或者AP架構。由于關系數據庫是單節點的,因此不具有分區容錯性,但是具有一緻性和可用性。而分布式的服務化系統都需要滿足分區容錯性,那麼我們必須在一緻性和可用性中進行權衡,具體表現在服務化系統處理的異常請求在某一個時間段内可能是不完全的,但是經過自動的或者手工的補償後,達到了最終一緻性。
BASE理論BASE理論解決了CAP理論提出的分布式系統一緻性和可用性不能兼得的問題,BASE在英文中有“堿”的意思,而ACID有“酸”的意思,所以基于這兩個英文提出了酸堿平衡理論。簡單來說,就是需要在不同的場景下,分别使用ACID或者BASE來解決分布式系統中數據的一緻性問題。
BASE理論與ACID截然不同,BASE理論滿足CAP理論,通過犧牲強一緻性,獲得可用性,一般應用在服務化系統的應用層或者大數據處理系統,通過達到最終一緻性來盡量滿足業務的絕大部分需求。BASE理論包含三個元素。
● BA:Basically Available,基本可用。
● S:Soft State,柔性狀态,狀态可以有一段時間不同步。
● E:Eventually Consistent,最終一緻性,最終數據是一緻的,而不是時時保持強一緻性。
BASE理論的柔性狀态是實現BASE理論的方法,基本可用和最終一緻性是目标。按照BASE理論實現的系統,由于不保證強一緻性,系統在處理請求的過程中,可以存在短暫的不一緻性。在短暫的不一緻性窗口,請求處理處于臨時狀态中,系統在進行每步操作時,記錄每一個臨時狀态;當系統出現故障時,可以從這些中間狀态繼續未完成的請求處理或者退回到原始狀态,最後達到一緻狀态。
BASE理論解決了CAP理論中沒有網絡延遲的問題,在BASE理論中用柔性狀态和最終一緻性保證了延遲後的一緻性。
柔性事務的理念則是通過業務邏輯将互斥鎖操作從資源層面上移至業務層面。通過放寬對強一緻性的要求,來換取系統吞吐量的提升。另外提供自動的異常恢複機制,在發生異常後也能确保事務的最終一緻性。
本文給大家講解的内容是微服務數據架構,事務管理理論更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!