最近老闆讓作一個gh-ost和pt-osc 的對比測試,本文將對二者作對比。mysql
一。原理和所用說明git
PT-OSC | GH-OST | |
原理 | 1.建立一個和要執行 alter 操做的表同樣的新的空表結構(是alter以前的結構) |
1.在變動的服務器上 建立 ghost table( _tbname_gho like tbname) 其中有2種經常使用用法: |
使用限制 | 1.原表必需要有主鍵或者惟一索引(不含NULL) |
1.原表必需要有主鍵或者惟一索引(不含NULL) |
重要參數說明 | --max-load,默認threads_running=25,能夠指定多個指標來限速,每一個chunk拷貝完會檢查,超過閥值會暫停複製。若是不指定該參數,工具會檢查當前運行值並增長20% |
--max-load=Threads_running=25 表面若是在執行gh-ost的過程當中出現Threads_running=25則暫停gh-ost的執行 |
優勢 | 1.執行速度快,業界使用比較普遍,較穩定 | 1.讀binlog能夠放在從庫執行,減小主庫的壓力 |
風險點 | 1.須要建立觸發器,對原表有改動 |
1.當系統負載極高時,gh-ost有可能沒法跟上binlog日誌的處理(未測試過該場景) |
運行命令實例 | pt-online-schema-change --user=db_monitor --password=xxx --host=127.0.0.1 --port=xxx --alter "add COLUMN c2 varchar (120) not null default ''" D=sbtest,t=sbtest1 --no-check-replication-filters --alter-foreign-keys-method=auto --recursion-method=none --print --execute | ./gh-ost --assume-master-host=ip:port --master-user=db_monitor --master-password=xxx --user=db_monitor --password=yyy --host=10.xxx --port=port --alter="ADD COLUMN c2 varchar(120)" --database=sbtest --table="sbtest1" -execute --initially-drop-old-table --initially-drop-socket-file --initially-drop-ghost-table |
二,性能測試對比
1. 測試場景
16core CPU,2G buffer pool的測試實例,5.5的MySQL版本異步主從,2kw行記錄,4.8GB 測試表大小
2. 測試結果(不限速),複製延時用zabbix 監控seconds behind master 的值
3. 結果展現
三, 最後說一下GH-OST的 cut over
gh-ost利用了MySQL的一個特性,就是原子性的rename請求,在全部被blocked的請求中,優先級永遠是最高的。
gh-ost基於此設計了該方案:一個鏈接對原表加鎖,另啓一個鏈接嘗試rename操做,此時會被阻塞住,當釋放lock的時候,rename會首先被執行,其餘被阻塞的請求會繼續應用到新表。
參考資料:
https://github.com/github/gh-ost
https://m.aliyun.com/yunqi/articles/62928
http://www.tabdba.com/?p=175