技術分享 | MTS並行增量應用

原創做者: 愛可生開源社區git


MySQL 的複製延遲在早期版本一直存在,MySQL 5.6.3 版本後開始支持並行複製,並在 5.7進一步完善可用並行複製功能,官方將該功能稱爲 enhanced multi-threaded slave(簡稱 MTS),今後複製延遲問題獲得很大的改善。github

 

功能背景

DTLE([愛可生數據傳輸組件])項目組在 2018年9月4日提出內部功能性需求(issue #211)實現支持 MTS 並行回放功能。json

https://github.com/actiontech/dtle多線程

1.MTS (MySQL 5.7) 原理三less

1)首要問題:哪些 TX 能夠並行回放?(無衝突!!!)性能

  • 同一 group_commit 的 TX 能夠並行回放,由於這些 TX 都進入了 prepare 階段,事務之間無衝突。

2)如何記錄同一 group_commit ?優化

  • 每一個 TX 都有 sequence number,同一個 binlog file 中 SeqNum 單調遞增spa

  • group_commit 時記錄上一次 (group_) commit 的 TX 的 sequence number, 稱爲 LastCommit (LC)線程

3)如何並行回放?3d

  • LC 相同的 TX 能夠並行回放

  • LC 更大的 TX 需等待前一組 TX 所有執行完

(MySQL 8.0 引入 WriteSet 並行回放,另議)

想了解更多關於 MTS 的內容可翻閱社區文章

社區投稿 | MySQL 主從複製延時常見場景及分析改善

圖解MySQL | [原理解析] MySQL組提交(group commit)

2.MySQL 5.7 如何開啓 MTS 

設置組提交相關參數參數,以前的版本這兩個參數不存在。

1. -- group_commit 等待時間. 大則並行度提升, 但可能形成空等致使響應變慢
2. set global binlog_group_commit_sync_delay=10000; -- 10ms
3. -- group_commit 當即提交TX數量: 即便等待時間未達到, 積壓的TX達到此數量則馬上提交
4. set global binlog_group_commit_sync_no_delay_count=32; -- less or equal to thread number

3. DTLE 配置支持 MTS  job

事先配置 一個 DTLE 的 job.json 文件,須要將 ParallelWorkers 參數設置爲爲並行的線程數

1. {
2. "Type": "Dest",
3. "NodeName": "udup1",
4. "Driver": "MySQL",
5. "Config": {
6. "Gtid": "",
7. "ApproveHeterogeneous":true,
8. "ReplChanBufferSize": 600,
9. "ParallelWorkers": 16,
10. "ConnectionConfig": {
11. "Host":"127.0.0.1",
12. "Port": 3308,
13. "User": "root",
14. "Password": "password"
15. }
16. }
17. }

注意:MTS僅影響增量複製

4.生成 MTS 

1. 純 INSERT(可用於性能 benchmark, 無益於正確性檢測)。生成器:

https://github.com/actiontech/dtle/files/3372365/main.go.zip

2. 經過 sysbench 等多線程寫入(增+刪+改)。

5.觀察 MTS Binlog

dtle/helper/mtswatcher/mtswatcher.go

1. cd dtle
2. make mtswatcher
3. # auto get newest gtid
4. ./dist/mtswatcher -host 127.0.0.1 -port 3308 -user root -password password
5. # or assign an (executed) gtid
6. ./dist/mtswatcher -host 127.0.0.1 -port 3308 -user root -password password -gtid "f2a4aa16-c8e6-11e7-9ff0-e19f7778f563:1-860460"

輸出:屬於同一 LC 的 TX 數量

1. lc: 4065 nTxOfThisLc: 16 totalTx: 4077
2. lc: 4081 nTxOfThisLc: 16 totalTx: 4093
3. lc: 4097 nTxOfThisLc: 6 totalTx: 4099
4. lc: 4103 nTxOfThisLc: 1 totalTx: 4100
5. lc: 4104 nTxOfThisLc: 16 totalTx: 4116
6. lc: 4120 nTxOfThisLc: 16 totalTx: 4132

6.版本注

  • 5.7 -> 5.6

∘依舊可並行回放

  • 5.6 -> 5.*

∘若是 seq 爲 0,則將其視爲 5.6 binlogEntry 並按順序重播。

7.簡單測

使用如上生成器生成 64000 rows(MySQL 並行度 64)

1. -- 目標端
2. set global binlog_group_commit_sync_delay = 10000; -- 10000us = 10ms
3. set global binlog_group_commit_sync_no_delay_count = 16;
  • 回放所有64000行,"ParallelWorkers": 16,花費時間:1m21s

  • 在上述時間(1m21s)內,使用MTS代碼進行單線程回放能夠回放9815 行

  • 在上述時間內,使用老版代碼回放,能夠回放8942 行

MTS回放速度是單線程的6倍左右!!!

8.

DTLE 不只關注數據傳輸的效率,也可優化數據回放效率,可以很好的支持 MySQL 的MTS功能實現數據的並行回放。在回放過程當中,在源端的 MySQL 中提早設置好恰當的 MTS 的參數,再根據 DTLE 的配置,便可利用 MySQL 5.7 的 MTS 機制增長回放速度。

相關文章
相關標籤/搜索