基於 Ractor 模型最佳化事務複製回放效能
一、背景
當備庫回放事務時,多個互相不依賴的事務可以併發回放,本方法主要用於解決多個可併發回放的事務的併發回放問題。透過併發的多個掃描執行緒實現併發對事物回放佇列進行掃描,生成多個可以併發回放的事物,並且通知回放執行緒進行併發的回放。
二、資料結構設計
備庫的事物資料按照事物 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Redis 實戰 —— 07. 複製、處理故障、事務及效能優化Redis優化
- SharePlex qview工具 vs OGG logdump工具探究兩個複製工具事務開始 or 事務提交複製?View
- 基於Python的效能最佳化Python
- 聊一聊web前端那些事兒,關於深複製和淺複製Web前端
- Mysql基於GTID的複製模式MySql模式
- Mysql 基於GTID主從複製MySql
- MySQL基於事務的ReplcaitonMySqlAI
- 5-5配置Mysql複製 基於日誌點的複製MySql
- MySQL 8 複製(十)——組複製效能與限制MySql
- MySQL 5.7基於GTID的主從複製MySql
- MySQL 5.7 基於GTID搭建主從複製MySql
- mysql 基於日誌的主從複製MySql
- Spring Boot Redis 叢集效能最佳化(基於 Redisson)Spring BootRedis
- 分散式事務:基於可靠訊息服務分散式
- 基於RocketMQ實現分散式事務MQ分散式
- iOS-效能最佳化的那些事iOS
- 事務隔離(二):基於加鎖方式的事務隔離原理
- 基於畢昇上線基於大模型對應服務大模型
- 構建基於RocketMQ的分散式事務服務MQ分散式
- 對於複製普通物件 深複製和淺複製是否一樣物件
- Apache Kafka零複製最佳化原理ApacheKafka
- OSI七層模型和效能最佳化模型
- MySQL 複製全解析 Part10 基於GTID的MySQL複製的一些限制MySql
- Redis主從複製那點事Redis
- 基於可靠訊息方案的分散式事務(二):Java中的事務分散式Java
- Spring事務的介紹,以及基於註解@Transactional的宣告式事務Spring
- 基於配置檔案的redis的主從複製Redis
- 第16節:基於WRITESET的並行複製方式並行
- 基於 Docker 的 MySQL 主從複製搭建(真正弄懂)DockerMySql
- GRIT:eBay基於微服務的分散式事務協議微服務分散式協議
- 【PG流複製】Postgresql流複製部署過程及效能測試SQL
- MySQL 複製全解析 Part 9 一步步搭建基於GTID的MySQL複製MySql
- MySQL 8 複製效能的增強MySql
- C# 高效能物件複製C#物件
- 【EMNLP 2023】基於大語言模型的複雜任務認知推理演算法CogTree模型演算法
- OceanBase 原始碼解讀(八):事務日誌的提交和回放原始碼
- 基於RocketMq的分散式事務解決方案MQ分散式
- spring基於註解配置實現事務控制Spring