網(wǎng)站關鍵詞優(yōu)化到首頁難度專業(yè)軟文發(fā)稿平臺
Epoxy 利用 Postgres 事務數(shù)據(jù)庫作為主數(shù)據(jù)庫/協(xié)調數(shù)據(jù)庫,并擴展多版本并發(fā)控制 (MVCC) 以實現(xiàn)跨數(shù)據(jù)存儲隔離。它通過樂觀并發(fā)控制 (OCC) 和兩階段提交 (2PC) 協(xié)議提供隔離性以及原子性和持久性。
環(huán)氧樹脂被用作五種不同數(shù)據(jù)存儲的接口層:Postgres, MySQL, Elasticsearch, MongoDB, 和Google Cloud Storage (GCS).
Epoxy 是開源的,網(wǎng)址為??https://github.com/DBOS-project/apiary。
Epoxy 的動機是為面對兩種日益流行的趨勢提供交易保證,這使得實現(xiàn)這一目標變得更加困難。**異構數(shù)據(jù):**除了數(shù)據(jù)庫記錄之外,應用程序還存儲和訪問大型媒體 blob。 ?**微服務:**許多系統(tǒng)由多個服務組成,每個服務管理自己的數(shù)據(jù)。
酒店預訂應用程序:客房供應服務將數(shù)據(jù)存儲在 Postgres 中??蛻纛A訂服務將數(shù)據(jù)存儲在 MongoDB 中。工作負載包括 80%:搜索可用房間,在 Postgres 中執(zhí)行讀取,在 MongoDB 中執(zhí)行地理空間搜索;20%:預訂房間,在 Postgres 中執(zhí)行讀取和更新,在 MongoDB 中執(zhí)行插入。如果沒有 Epoxy,這些操作將無法以原子和隔離的方式執(zhí)行,從而導致異常。
電子商務服務:購物車和目錄存儲在 Postgres 中,目錄復制到 Elasticsearch 以進行快速搜索。工作負載包括 90%:搜索和添加項目(Elasticsearch 搜索和 Postgres 讀取、插入、更新),8%:結賬(Postgres 讀取、刪除、兩次插入,用于購物車到訂單的轉換),1%:目錄插入(Postgres 和 Elasticsearch),1%:目錄更新(Postgres 和 Elasticsearch)。如果沒有 Epoxy,并發(fā)搜索和添加以及目錄更新可能會導致購物車添加錯誤。
Epoxy 協(xié)議方法
Epoxy 的想法是提供螺栓式事務支持,利用 Postgres 作為協(xié)調器/主數(shù)據(jù)庫,并通過添加填充層將額外的數(shù)據(jù)存儲加入到此設置中。(請注意,協(xié)調器和主數(shù)據(jù)庫略有不同。協(xié)調器是主數(shù)據(jù)庫之上的墊片。)
解決這個問題的現(xiàn)狀如何?如果您沒有 Epoxy 來解決這個問題,您將自己編寫自定義粘合代碼。您將采用以工作流為中心的解決方案,并在粘合代碼中嵌入/強制執(zhí)行業(yè)務應用程序邏輯。
某種程度上(以定制的方式),您可以將 OLTP 事務擴展到應用程序中。但這是定制的,并且更難重用,并且處理原子性和隔離性的表面積很大,因為你會在你的代碼庫中涂抹它。
作為一個更可重用、抽象化的解決方案,您可以考慮使用分布式事務協(xié)議(如X/Open XA ),基于兩階段提交,以便跨數(shù)據(jù)存儲執(zhí)行事務。然而,X/Open XA 缺乏事務隔離,僅提供原子性。Epoxy 通過提供快照隔離超越了 X/Open XA,使其成為更強大的解決方案。
此外,X/Open XA 方法要求數(shù)據(jù)存儲實現(xiàn)兩階段提交的參與者協(xié)議,從而造成與 MongoDB、CockroachDB 和 Redis 的兼容性問題。此外,在像S3/GCS這樣的非事務性數(shù)據(jù)存儲中,實現(xiàn)X/Open XA的“準備”步驟是不可行的。
Epoxy 協(xié)議:設置
在了解 Epoxy 如何提供跨數(shù)據(jù)存儲的事務保證之前,我們先回顧一下 Epoxy 對主數(shù)據(jù)庫(用作協(xié)調器)和輔助數(shù)據(jù)存儲的要求。主數(shù)據(jù)庫必須提供至少具有快照隔離的 ACID 事務。這是使用 Epoxy 中的 Postgres 實現(xiàn)的。二級存儲必須確保:
-
單對象寫入操作是可線性化且持久的。
-
每條記錄都有一個唯一可識別的密鑰。
-
[可選地提高性能]記錄可以包含元數(shù)據(jù),并且可以根據(jù)該元數(shù)據(jù)有效地過濾數(shù)據(jù)存儲中的查詢。
Epoxy 使用四種數(shù)據(jù)存儲來實現(xiàn):Elasticsearch、MongoDB、GCS、MySQL,滿足這些輔助存儲要求。
Epoxy 成為訪問輔助存儲表的獨占模式:使用該存儲的一個應用程序采用 Epoxy,強制訪問該表進行操作的所有應用程序都采用 Epoxy。
每個 Epoxy 事務都鏈接到一個快照,代表其可見的所有過去事務的集合。快照表示使用兩個事務 ID xmin 和 xmax,以及最近提交的事務列表 rc_txns。創(chuàng)建快照時:
- xmin 是最小的活動事務 ID。
- xmax 被指定為大于已提交的最大事務 ID 的值。
- rc_txns 表示 ID 大于 xmin 的已提交事務的集合。
- 如果 (x < xmin) \/ (x \in rc_txns),則 ID 為 x 的事務位于快照中。
Epoxy 輔助存儲墊片通過元數(shù)據(jù)增強記錄版本,以促進事務讀取操作。記錄版本對事務的可見性取決于事務快照中是否存在 beginTxn 以及事務快照中是否存在 endTxn。
- 記錄版本用兩個值標記:beginTxn 和 endTxn。
- beginTxn 表示創(chuàng)建記錄版本的事務的 ID。
- endTxn 是用新版本取代它或刪除記錄的事務的 ID。
Epoxy協(xié)議:OCC
Epoxy 采用兩階段提交 (2PC) 協(xié)議。輔助存儲首先在其數(shù)據(jù)庫內進行準備,然后主存儲結束事務提交(或中止)。
輔助存儲S在執(zhí)行事務T時,在寫入之前獲取記錄鍵上的排他鎖(如果鎖定失敗,則T被中止)。因此,每個輔助存儲墊片都為其記錄包含一個鎖管理器,為每個記錄維護一個獨占寫鎖。此鎖可防止對先前記錄版本的 endTxn 字段進行并發(fā)修改。
完成 T 后,S 通過獲取獨占(S 本地)驗證鎖來驗證它。然后,S 檢查 T 寫入的密鑰是否也由不在 T 快照中的已提交事務寫入。如果驗證成功,S 臨時將 T 標記為已提交,釋放鎖,并投票提交。
僅當所有輔助存儲都成功驗證時,事務才會提交;否則,它將中止并回滾。通過在主數(shù)據(jù)庫上執(zhí)行提交操作來提交事務。主數(shù)據(jù)庫上的原子提交可確保事務對所有數(shù)據(jù)存儲上的未來事務可見(出現(xiàn)在其快照中)。輔助存儲在獲悉提交后釋放寫鎖(或者如果決定中止,也用于完成回滾)。
如果事務驗證失敗或在任何數(shù)據(jù)存儲中遇到任何錯誤,它將啟動中止。為了防止無限期掛起客戶端故障,如果與客戶端的連接超時,協(xié)調器也會中止事務。中止過程刪除新添加的記錄版本,并恢復記錄 endTxn 字段論文列出了以下正確性不變量:
- SI1:T 始終從 T 啟動時有效的已提交信息的快照中讀取數(shù)據(jù)。
- SI2:僅當在提交時快照之外沒有已提交的事務修改了打算由 T 寫入的數(shù)據(jù)時,T 才能提交。
- AC1:達成決策的所有流程都會達成相同的決策。
- AC2:流程一旦做出決定,就無法逆轉。
- AC3&4:只有當所有進程都投票“是”時,才會做出提交決策。在沒有失敗且一致投贊成票的情況下,決定提交。
- AC5:在任何具有容忍故障(崩潰故障)的執(zhí)行中,如果所有故障都被修復并且在足夠長的時間內沒有新的故障發(fā)生,則所有進程最終都會做出決定。
如果主數(shù)據(jù)庫/協(xié)調數(shù)據(jù)庫發(fā)生故障,輔助存儲將無法接受任何寫入/更新,直到主數(shù)據(jù)庫/協(xié)調數(shù)據(jù)庫恢復并恢復數(shù)據(jù)為止。但它們可以提供讀取服務。主/協(xié)調器故障意味著輔助存儲中活動事務的中止和回滾。在發(fā)生次要或主要故障時,目標是讓它們備份,并恢復輔助存儲以反映已提交的事務,從而建立崩潰一致的狀態(tài)。
局限性和開銷
Epoxy 需要單個協(xié)調器/主節(jié)點。對于多個主選,事情會變得復雜/復雜,并且跨主選所需的分布式事務效率低下。在云中,可以使用 AWS RDS/Aurora 擴展單個 Postgres 協(xié)調器。對于地理分布,可以通過分布式 SQL 產(chǎn)品提供虛擬/單個協(xié)調器。
Epoxy 需要對輔助存儲表進行獨占訪問。如果客戶端在不使用 Epoxy 的情況下進行寫入,則缺少版本信息會使寫入對讀取不可見。同樣,不使用 Epoxy 進行讀取可能會暴露同一記錄的沖突版本。輔助存儲表上的一個應用程序采用 Epoxy 需要該表上的所有其他應用程序執(zhí)行相同的操作。
更高的開銷來自垃圾收集。由于 Epoxy 的 MVCC 方法是通過寫入創(chuàng)建新記錄版本而不是更新現(xiàn)有記錄,因此清理舊版本至關重要。僅當記錄版本不再對任何事務可見時(由所有活動事務的快照中的 endTxn 指示),記錄版本才會被刪除。因此,事務協(xié)調器應該定期執(zhí)行垃圾收集。垃圾收集器掃描所有活動事務以識別最小的 xmin,代表最舊的活動事務。然后,它指示輔助存儲墊片刪除 endTxn 小于此最小活動 xmin 的記錄版本。
https://www.jdon.com/69782.html