基於 Ractor 模型最佳化事務複製回放效能

KaiwuDB發表於2024-03-01

一、背景

當備庫回放事務時,多個互相不依賴的事務可以併發回放,本方法主要用於解決多個可併發回放的事務的併發回放問題。透過併發的多個掃描執行緒實現併發對事物回放佇列進行掃描,生成多個可以併發回放的事物,並且通知回放執行緒進行併發的回放。

二、資料結構設計

備庫的事物資料按照事物 ID 分段儲存到備庫的事物資料佇列中,參考如下圖 1;根據事物 ID 為 UUID  完全無序的特性,可以對 UUID 進行事物 ID 分段併發掃描。將事物 ID UUID 分段後,交給多個掃描執行緒協程,每個掃描執行緒負責某個 UUID 分割槽進行多個掃描執行緒併發掃描,掃描可回放的事物。

圖片

三、執行緒生命週期

當掃描執行緒發現可回放的事物後,會將事物 ID 加入 txnList 執行 enqueu 操作,加入事物 ID 後,掃描執行緒會執行 notify 操作,喚醒正在睡眠的回放執行緒進行事務回放操作,示意圖參考如下圖 2。

圖片

回放執行緒協程的生命週期如下如圖 3,回放執行緒剛啟動後處於睡眠狀態,當有事務回放時,會被隨機喚醒。被喚醒的回放執行緒協程會執行事務回放任務,並且清理事務的依賴關係。

當發現可回放的事務時,如果發現可回放的事務數等於 1,則由當前協程進行回放減少一次 CPU 切換的開銷;當發現多餘 1 個可回放事務時,回放執行緒協程會將除去第一個的可回放事務,加入 txnList 喚醒其他協程進行事務回放,以實現更好回放的併發效能。

圖片

四、併發切換問題

在採取了併發清理時,因為 CPU 切換的問題,需要處理重複發現的可回放事務,對重複發現相同的事務 ID 進行防禦性冪等處理,如下圖 4。因此,需要對每個可回放事務引入 txnIDSet 進行冪等處理。

圖片

五、如何判斷回放是否結束

因為採取了併發掃描以及併發回放,所以需要在全部可回放事務全部回放結束後,結束回放的流程,在此給出回放結束的定義。

當可回放事務全部回放結束後,認為回放結束。可回放事務分為 3 類,過去發現的可回放事務/現在發現的可回放事務/將來發現的可回放事務。

過去發現的可回放事務都會被加入到 txnList 中,現在發現的可回放事務正在由回放執行緒進行回放,將來發現的可回放事務是由掃描執行緒掃描 UUID 進行發現的。

  • 過去發現的事務回放結束的條件為 txnList 為空;

  • 現在發現的事務回放結束的條件為所有的 workerStatus 總和為 0;

  • 將來發現的事務回放結束的條件為所有的掃描執行緒,GatherAll 掃描可回放事務無法發現。


六、效能調優

根據 CPU 數量,可透過動態調整掃描執行緒和回放執行緒的回放協程數量,以合理分配兩組協程的負載。這樣做可以充分利用多核處理器的效能,並提高系統的吞吐量和響應能力。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70027415/viewspace-3007796/,如需轉載,請註明出處,否則將追究法律責任。

相關文章