1. 程式人生 > >gh-ost使用手冊

gh-ost使用手冊

set 動態 ech init usr 最大 精確 依賴 線程

gh-ost實戰運用

一、安裝步驟

1、環境

go版本:1.10.3
gh-ost版本:1.0.46

2、安裝go語言

# 安裝go依賴包
yum install bison ed gawk gcc libc6-dev make -y

# 配置go環境變量
vim ~/.bashrc
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=/usr/local/go/src/github.com/github/gh-ost
# 使環境變量生效
source ~/.bashrc

# 解壓go安裝包
安裝包在10.135.2.217:data/online/software/go1.10.3.linux-amd64.tar.gz

tar -zxvf go1.10.3.linux-amd64.tar.gz -C /usr/local/

3、安裝gh-ost

安裝包在:10.135.2.217:data/online/software/gh-ost-binary-linux-20180527215024.tar.gz
tar -zxvf gh-ost-binary-linux-20180527215024.tar.gz -C /usr/local
ln -s /usr/local/gh-ost /usr/bin/gh-ost

二、主庫模式

1、常用命令

gh-ost    --max-load=Threads_running=16    --critical-load=Threads_running=32    --chunk-size=1000     --initially-drop-old-table    --initially-drop-ghost-table    --initially-drop-socket-file    --ok-to-drop-table    --host="10.249.5.39"    --port=3306    --user="dbadmin"    --password="12345"    --assume-rbr    --allow-on-master    --assume-master-host=10.249.5.39:3306    --database="gh_ost"    --table="gh_01"    --alter="add column c4 varchar(50) not null default ‘‘" \   
   --panic-flag-file=/tmp/ghost.panic.flag    --serve-socket-file=/tmp/ghost.sock    --verbose    --execute

2、常用參數解釋

-allow-on-master
      默認是在從庫上應用binlog,如果直接在主庫上執行,必須設置該參數
-max-load string
      string是狀態表達式,當設置多個狀態值,用逗號分隔,如‘Threads_running=100,Threads_connected=500‘,當超過該值,遷移暫停等待
-critical-load string
      與max-load不同的是,當超過該值,遷移直接停止並退出
-chunk-size int
      每次從原表叠代遷移數據的行數(允許值:100-100000) (默認1000)
-initially-drop-ghost-table
      在本次操作前刪除可能存在的ghost表(可能之前留下的),默認如果存在就中斷
-initially-drop-old-table
      在本次操作前刪除old表(可能之前沒有刪除),默認如果存在中斷
-initially-drop-socket-file
      刪除已存在的socket文件
-ok-to-drop-table
      DDL完成後自動刪除old表
-panic-flag-file string
      當指定該參數後,如果創建該文件,gh-ost立刻中斷退出,不會清理產生的臨時表和文件
-exact-rowcount
      精確的統計表數據行數而不是預估,即使不準確只是影響進度的計算,實際copy行數是由最大值和最小值確定,與其無關。
-serve-socket-file string
      socket文件
-assume-rbr
      顯示告訴gh-ost日誌格式是row格式,如果沒有該參數,gh-ost每次都會設置row格式並重啟復制,需要用戶有super權限
-assume-master-host
      顯示告訴gh-ost master地址,如果不提供,gh-ost會根據從庫查到master
-host、-port
      gh-ost默認是作為slave的連接信息,如果使用slave應用日誌,這裏填寫slave的主機信息;如果直接在master上執行,這裏就填寫master信息,並且必須存在allow-on-master參數,否則就報錯退出。

3、輸出日誌分析

GH-OST會輸出一些關鍵詳細信息,讓你了解整個遷移過程。當然,你可以控制輸出級別。

–verbose:常用,有用的輸出,而不是一切。

–debug:輸出所有一切。

開始輸出如下:

2018-08-07 14:17:11 INFO starting gh-ost 1.0.46
2018-08-07 14:17:11 INFO Migrating `darren`.`t4`
2018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306
2018-08-07 14:17:11 INFO User has ALL privileges
2018-08-07 14:17:11 INFO binary logs validated on 10.249.5.39:3306
2018-08-07 14:17:11 INFO Restarting replication on 10.249.5.39:3306 to make sure binlog settings apply to replication thread
2018-08-07 14:17:11 INFO Inspector initiated on shvm-5-39.58os.org:3306, version 5.7.21-log
2018-08-07 14:17:11 INFO Table found. Engine=InnoDB
2018-08-07 14:17:11 INFO Estimated number of rows via EXPLAIN: 58707
2018-08-07 14:17:11 INFO Recursively searching for replication master
2018-08-07 14:17:11 INFO Master found to be shvm-5-39.58os.org:3306
2018-08-07 14:17:11 INFO log_slave_updates validated on 10.249.5.39:3306
2018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306
2018/08/07 14:17:11 binlogsyncer.go:79: [info] create BinlogSyncer with config {99999 mysql 10.249.5.39 3306 dbadmin   false false <nil>}
2018-08-07 14:17:11 INFO Connecting binlog streamer at shvm-5-39.000040:337570954
2018/08/07 14:17:11 binlogsyncer.go:246: [info] begin to sync binlog from position (shvm-5-39.000040, 337570954)
2018/08/07 14:17:11 binlogsyncer.go:139: [info] register slave for master server 10.249.5.39:3306
2018/08/07 14:17:11 binlogsyncer.go:573: [info] rotate to (shvm-5-39.000040, 337570954)
2018-08-07 14:17:11 INFO rotate to next log name: shvm-5-39.000040
2018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306
2018-08-07 14:17:11 INFO connection validated on 10.249.5.39:3306
2018-08-07 14:17:11 INFO will use time_zone=‘SYSTEM‘ on applier
2018-08-07 14:17:11 INFO Examining table structure on applier
2018-08-07 14:17:11 INFO Applier initiated on shvm-5-39.58os.org:3306, version 5.7.21-log
2018-08-07 14:17:11 INFO Dropping table `darren`.`_t4_gho`
2018-08-07 14:17:11 INFO Table dropped
2018-08-07 14:17:11 INFO Dropping table `darren`.`_t4_del`
2018-08-07 14:17:11 INFO Table dropped
2018-08-07 14:17:11 INFO Dropping table `darren`.`_t4_ghc`
2018-08-07 14:17:11 INFO Table dropped
2018-08-07 14:17:11 INFO Creating changelog table `darren`.`_t4_ghc`
2018-08-07 14:17:11 INFO Changelog table created
2018-08-07 14:17:11 INFO Creating ghost table `darren`.`_t4_gho`
2018-08-07 14:17:11 INFO Ghost table created
2018-08-07 14:17:11 INFO Altering ghost table `darren`.`_t4_gho`
2018-08-07 14:17:11 INFO Ghost table altered
2018-08-07 14:17:11 INFO Intercepted changelog state GhostTableMigrated
2018-08-07 14:17:11 INFO Waiting for ghost table to be migrated. Current lag is 0s
2018-08-07 14:17:11 INFO Handled changelog state GhostTableMigrated
2018-08-07 14:17:11 INFO Chosen shared unique key is PRIMARY
2018-08-07 14:17:11 INFO Shared columns are id,name,c1,c2,c4,c5,c6
2018-08-07 14:17:11 INFO Listening on unix socket file: /tmp/ghost.sock
2018-08-07 14:17:11 INFO Migration min values: [1]
2018-08-07 14:17:11 INFO Migration max values: [58597]
2018-08-07 14:17:11 INFO Waiting for first throttle metrics to be collected
2018-08-07 14:17:11 INFO First throttle metrics collected
# Migrating `darren`.`t4`; Ghost table is `darren`.`_t4_gho`
# Migrating shvm-5-39.58os.org:3306; inspecting shvm-5-39.58os.org:3306; executing on shvm-5-39.58os.org
# Migration started at Tue Aug 07 14:17:11 +0800 2018
# chunk-size: 1000; max-lag-millis: 1500ms; dml-batch-size: 10; max-load: Threads_running=25; critical-load: Threads_running=64; nice-ratio: 0.000000
# throttle-additional-flag-file: /tmp/gh-ost.throttle 
# panic-flag-file: /tmp/ghost.panic.flag
# Serving on unix socket: /tmp/ghost.sock

這些信息是GH-OST相對自我解釋,他們大多表示一切順利。你將主要關註遷移並了解其是否順利進行。一旦遷移實際開始,你將看到如下輸出。

Copy: 0/58707 0.0%; Applied: 0; Backlog: 0/1000; Time: 0s(total), 0s(copy); streamer: shvm-5-39.000040:337574146; State: migrating; ETA: N/A
Copy: 0/58707 0.0%; Applied: 0; Backlog: 0/1000; Time: 1s(total), 1s(copy); streamer: shvm-5-39.000040:337581355; State: migrating; ETA: N/A
Copy: 27000/58707 46.0%; Applied: 0; Backlog: 0/1000; Time: 2s(total), 2s(copy); streamer: shvm-5-39.000040:338201054; State: migrating; ETA: 2s
Copy: 58000/58707 98.8%; Applied: 0; Backlog: 0/1000; Time: 3s(total), 3s(copy); streamer: shvm-5-39.000040:338912890; State: migrating; ETA: 0s
2018-08-07 14:17:14 INFO Row copy complete

進度提示

Copy: 27000/58707 46.0%;58707指需要遷移總行數,27000指已經遷移的行數,46%指遷移完成的百分比。
Applied: 0,指在二進制日誌中處理的event數量。在上面的例子中,遷移表沒有流量,因此沒有被處理日誌event。
Backlog: 0/1000,表示我們在讀取二進制日誌方面表現良好,在二進制日誌隊列中沒有任何積壓(Backlog)事件。
Backlog: 7/1000,當復制行時,在二進制日誌中積壓了一些事件,並且需要應用。
Backlog: 1000/1000,表示我們的1000個事件的緩沖區已滿(程序寫死的1000個事件緩沖區,低版本是100個),此時就註意binlog寫入量非常大,gh-ost處理不過來event了,可能需要暫停binlog讀取,需要優先應用緩沖區的事件。
streamer: shvm-5-39.000040:338912890;表示當前已經應用到binlog文件位置

狀態提示

每隔一定時間會打印友好提示:

# Migrating `darren`.`t4`; Ghost table is `darren`.`_t4_gho`
# Migrating shvm-5-39.58os.org:3306; inspecting shvm-5-39.58os.org:3306; executing on shvm-5-39.58os.org
# Migration started at Tue Aug 07 14:17:11 +0800 2018
# chunk-size: 1000; max-lag-millis: 1500ms; dml-batch-size: 10; max-load: Threads_running=25; critical-load: Threads_running=64; nice-ratio: 0.000000
# throttle-additional-flag-file: /tmp/gh-ost.throttle 
# panic-flag-file: /tmp/ghost.panic.flag
# Serving on unix socket: /tmp/ghost.sock

三、從庫模式

1、常用命令

gh-ost    --max-load=Threads_running=16    --critical-load=Threads_running=32    --chunk-size=1000     --initially-drop-old-table    --initially-drop-ghost-table    --initially-drop-socket-file    --ok-to-drop-table    --host="10.249.5.39"    --port=3307    --user="dbadmin"    --password="12345"    --assume-rbr    --allow-on-master    --assume-master-host=10.249.5.39:3306    --database="gh_ost"    --table="gh_01"    --alter="add column c4 varchar(50) not null default ‘‘"    --panic-flag-file=/tmp/ghost.panic.flag    --serve-socket-file=/tmp/ghost.sock    --verbose    --execute

四、測試模式

gh-ost    --test-on-replica    --max-load=Threads_running=16    --critical-load=Threads_running=32    --chunk-size=1000     --initially-drop-old-table    --initially-drop-ghost-table    --initially-drop-socket-file    --host="10.249.5.39"    --port=3307    --user="dbadmin"    --password="12345"    --assume-rbr    --database="gh_ost"    --table="gh_01"    --alter="add column c4 varchar(50) not null default ‘‘"    --panic-flag-file=/tmp/ghost.panic.flag    --serve-socket-file=/tmp/ghost.sock    --verbose    --execute

參數說明

--test-on-replica
      在從庫上執行遷移,但不進行最後的cut-over,並最後會停止復制線程,供測試人員進行數據對比
--migrate-on-replica
      直接在從庫上遷移並cut-over,復制線程不會停止

五、暫停、恢復、終止、延遲切換

gh-ost的--serve-socket-file文件用來監聽請求,比如可以動態調整性能方面參數,也可以進行暫停、恢復gh-ost線程。

#暫停
echo throttle | socat - /tmp/ghost.sock

#恢復
echo no-throttle | socat - /tmp/ghost.sock

#終止
對應panic-flag-file參數文件,當tmp目錄存在該文件立即停止
touch /tmp/ghost.panic.flag

#延遲切換(cut-over階段)
--postpone-cut-over-flag-file=/tmp/ghost.postpone.flag
當設置該參數時cut-over一直延遲切換,直到你刪除該文件才進行切換

#動態調整性能參數
echo chunk-size=100 | socat - /tmp/ghost.sock 

gh-ost使用手冊