MySQL DDL方案測試及選型.

性能測試

1、測試背景

一、機器配置和版本mysql

機器配置(下面測試qps數據都是以本機器配置爲準)

型號:Dell s3710
磁盤:SSD 3T
CPU:32
內存:128G

MySQL版本:5.7.22
gh-ost版本:1.0.46
pt-osc版本:3.0.12

二、數據準備和業務模擬sql

----插入1000萬條數據,表大小約2G--
sysbench   --mysql-user=darren --mysql-password=darren --mysql-host=10.126.126.164 --mysql-port=3306 --test=tests/db/oltp.lua \
           --oltp_tables_count=1 --oltp-table-size=10000000 --rand-init=on prepare

----64個併發線程模擬SQL----
sysbench   --mysql-user=darren --mysql-password=darren  --mysql-host=10.126.126.164 --mysql-port=3306 --test=tests/db/oltp.lua \
           --oltp-reconnect-mode=transaction --oltp_tables_count=1 --oltp-table-size=10000000 --num-threads=64 --oltp-read-only=off \
           --report-interval=10 --rand-type=uniform --max-time=6000 --max-requests=0  run

2、性能測試

一、測試工具命令併發

-----------------------------------------gh-ost-------------------------------------------
    time gh-ost \
       --max-load=Threads_running=70 \
       --critical-load=Threads_running=80 \
       --chunk-size=1000  \
       --dml-batch-size=100 \
       --initially-drop-old-table \
       --initially-drop-ghost-table \
       --initially-drop-socket-file \
       --ok-to-drop-table \
       --host="10.126.126.164" \
       --port=3306 \
       --user="darren" \
       --password="darren" \
       --assume-rbr \
       --allow-on-master \
       --assume-master-host=10.126.126.164:3306 \
       --database="sbtest" \
       --table="sbtest1" \
       --alter="drop primary key" \   
       --panic-flag-file=/tmp/ghost.panic.flag \
       --serve-socket-file=/tmp/ghost.sock \
       --verbose \
       --execute

-----------------------------------------pt-osc-------------------------------------------
time pt-online-schema-change \
    --user=darren \
    --password=darren \
    --port=3306 \
    --host=10.126.126.164 \
    --alter "engine=innodb" \
    D=sbtest,t=sbtest1 \
    --max-load="Threads_running=70"  \
    --critical-load="Threads_running=80" \
    --execute

二、單表高負載測試(64個併發線程,寫入QPS:26927)app

DDL類型 執行前QPS(r/w) pt-osc執行時間 pt-osc執行時QPS(r/w) gh-ost執行時間 gh-ost執行時QPS(r/w) online執行時間 online執行時QPS(r/w)
添加普通索引 (94254/26927) 8m32.448s (73123/22011) 沒法完成,一直在追日誌 (91363/24880) 1 min 5.76 (0.00/0.00)
刪除普通索引 (93112/26543) 7m59.124s (74021/21280) 沒法完成,一直在追日誌 (91363/24880) 0.03s (92902/26043)
修改普通索引名 (92993/26887) 8m27.328s (75089/23321) 沒法完成,一直在追日誌 (90291/23879) 0.00s (92110/26876)
添加主鍵索引 (89991/26012) 18m53.515s (73021/19872) 沒法完成,一直在追日誌 - 1 min 5.44 s (79282/20838)
刪除主鍵索引 (89809/25667) 不支持 - 不支持 - 1 min 48.03s (0/0)
添加列 (92484/26312) 8m12.238s (73521/21953) 沒法完成,一直在追日誌 (90362/25821) 4 min 16.05 (0.00/0.00)
刪除列 (92001/26933) 8m15.085s (78430/22397) 沒法完成,一直在追日誌 (91138/26041) 5 min 20.69 s (0.00/0.00)
修改列類型 (91990/26989) 8m49.021s (73421/21859) 沒法完成,一直在追日誌 (93238/26123) 2 min 2.76 (0.00/0.00)
修改列名 (92901/27045) 8m03.559s (73552/22001) 沒法完成,一直在追日誌 (92998/25899) 0.01s (92808/27001)
修改列默認值 (93328/26312) 8m19.230s (74001/22339) 沒法完成,一直在追日誌 (92298/25005) 0.01s (91990/26909)
修改列註釋 (93029/27049) 7m50.689s (73504/21992) 沒法完成,一直在追日誌 (91900/25698) 0.01s (92989/27022)
修改自增值 (92314/26978) 8m08.329s (72990/22334) 沒法完成,一直在追日誌 (92398/26821) 0.00s (91990/26876)
優化表 (93253/26312) 8m50s.120s (73523/22323) 沒法完成,一直在追日誌 (91092/27090) 2 min 21s (0.10/0.00)

三、單表正常負載測試(4個併發線程如下,寫入QPS5000如下)socket

DDL類型 執行前QPS(r/w) pt-osc執行時間 pt-osc執行時QPS(r/w) gh-ost執行時間 gh-ost執行時QPS(r/w) online執行時間 online執行時QPS(r/w)
添加普通索引 (19341/5525) 3m46.584s (14474/4134) 23m37.340s (17224/4920) 25.89s (18713/5346)
刪除普通索引 (19311/5606) 2m53.548s (14089/4033) 16m45.551s (17335/4953) 0.01s (19050/5439)
修改普通索引名 (19299/5510) 4m2.699s (14321/4103) 17m39.098s (17098/4934) 0.00s (19298/5409)
添加主鍵索引 (18993/6087) 16m29.108s (10089/3321) 沒法完成,一直在追日誌 - 1 min 5.44 s (16202/3089)
刪除主鍵索引 (19993/5887) 不支持 - 不支持 - 1m52s (0/0)
添加列 (19248/5540) 3m0.202s (13441/3840) 24m14.164s (17359/4960) 2m40.44 (18606/5316)
刪除列 (19200/5472) 4m1.786s (13208/3888) 23m2.302s (17116/4890) 1m29.71 sec (18026/5389)
修改列類型 (19199/5618) 4m0.872s (13212/3901) 22m3.992s (17818/5090) 2 m49.54s (0.00/0.00)
修改列名 (19150/5472) 3m49.122s (13200/3890) 23m0.387s (17959/5130) 0.01 s (19101/5411)
修改列默認值 (19332/5014) 2m51.322s (13902/3860) 24m3.712s (17789/4987) 0.01s (19211/5493)
修改列註釋 (19302/5388) 4m1.302s (13443/3844) 23m3.902s (17289/4887) 0.00s (19201/5421)
修改自增值 (19231/5339) 3m3.112s (13903/3904) 21m3.002s (17399/4917) 0.00s (19008/5239)
優化表 (19372/5533) 2m47.955s (13230/3780) 17m41.545s (17255/4929) 1m37.13 (18977/5421)

【注】工具

通過測試:當寫入QPS5000以上,gh-ost沒法完成任務,其緣由是apply binlog是單線程,能夠理解爲slave,當原表寫入量巨大時(QPS=5000以上),
一直在應用日誌,而gh-ost設計是binlog應用優先級高於row copy,因此咱們看到row copy進度一直沒變,這樣若是原表一直壓力這麼大,那麼gh-ost DDL將沒法完成。
通過在s3710機器上測試若是原表寫入的QPS大於5000將大機率出現此狀況,小於5000的話沒問題。

Copy: 0/9705089 0.0%; Applied: 183480; Backlog: 1000/1000; Time: 1m24s(total), 1m24s(copy); streamer: tjtx-126-164.001588:441763689; 
Copy: 0/9705089 0.0%; Applied: 185490; Backlog: 1000/1000; Time: 1m25s(total), 1m25s(copy); streamer: tjtx-126-164.001588:442986068; 
Copy: 0/9705089 0.0%; Applied: 207590; Backlog: 1000/1000; Time: 1m30s(total), 1m30s(copy); streamer: tjtx-126-164.001588:455843331;

3、各個工具優缺點對比

4、建議的DDL方案

一、MySQL5.5版本DDL方案性能

MySQL5.5版本online ddl功能不完善,建議所有使用PT-OSC工具進行

二、MySQL5.6和5.7版本DDL方案測試

三、MySQL8.0版本DDL方案優化

相關文章
相關標籤/搜索