2019年4月18日木曜日

gh-ostのinteractive-commandを使う

gh-ost には interactive-command なるものが用意されている。
これは gh-ost起動しちゃった後 、後からオプションを変更したりする機能を提供しているっぽい。

デフォルトではソケットファイルのみオープンする。デフォルトのパスは /tmp/gh-ost.<スキーマ名>.<テーブル名>.sock
パスを変えたかったりTCP経由も受け付けてほしい時は gh-ost --serve-socket-file=/tmp/hogegh-ost --serve-tcp-port=9999 とかで設定できる。
$ gh-ost --database=mysqlslap --table=t1 --alter="ADD KEY (intcol1)" --host=127.0.0.1 --port=21801 --user=msandbox --password=msandbox --execute --serve-socket-file=/tmp/hoge --serve-tcp-port=9999
..
ソケットでもTCPでも nc で1行押し込むのが良いっぽい。
パイプ通さなくてもいいけれど、その場合は1つコマンドを押し込むたびに切断されるので面倒っちゃ面倒。
$ echo "status" | nc -U /tmp/hoge
# Migrating `mysqlslap`.`t1`; Ghost table is `mysqlslap`.`_t1_gho`
# Migrating 163-44-175-117:21800; inspecting 163-44-175-117:21801; executing on 163-44-175-117
# Migration started at Thu Apr 18 13:54:50 +0900 2019
# chunk-size: 1000; max-lag-millis: 1500ms; dml-batch-size: 10; max-load: ; critical-load: ; nice-ratio: 0.000000
# throttle-additional-flag-file: /tmp/gh-ost.throttle
# Serving on unix socket: /tmp/hoge
# Serving on TCP port: 9999
Copy: 0/11761 0.0%; Applied: 0; Backlog: 1000/1000; Time: 20s(total), 16s(copy); streamer: mysql-bin.000002:578358174; State: throttled, lag=2.786607s; ETA: N/A

$ echo "help" | nc localhost 9999
available commands:
status                               # Print a detailed status message
sup                                  # Print a short status message
coordinates                                                                                                      # Print the currently inspected coordinates
chunk-size=<newsize>                 # Set a new chunk-size
dml-batch-size=<newsize>             # Set a new dml-batch-size
nice-ratio=<ratio>                   # Set a new nice-ratio, immediate sleep after each row-copy operation, float (examples: 0 is aggressive, 0.7 adds 70% runtime, 1.0 doubles runtime, 2.0 triples runtime, ...)
critical-load=<load>                 # Set a new set of max-load thresholds
max-lag-millis=<max-lag>             # Set a new replication lag threshold
replication-lag-query=<query>        # Set a new query that determines replication lag (no quotes)
max-load=<load>                      # Set a new set of max-load thresholds
throttle-query=<query>               # Set a new throttle-query (no quotes)
throttle-http=<URL>                  # Set a new throttle URL
throttle-control-replicas=<replicas> # Set a new comma delimited list of throttle control replicas
throttle                             # Force throttling
no-throttle                          # End forced throttling (other throttling may still apply)
unpostpone                           # Bail out a cut-over postpone; proceed to cut-over
panic                                # panic and quit without cleanup
help                                 # This message
- use '?' (question mark) as argument to get info rather than set. e.g. "max-load=?" will just print out current max-load.

$ nc localhost 9999
status
# Migrating `mysqlslap`.`t1`; Ghost table is `mysqlslap`.`_t1_gho`
# Migrating 163-44-175-117:21800; inspecting 163-44-175-117:21801; executing on 163-44-175-117
# Migration started at Thu Apr 18 13:54:50 +0900 2019
# chunk-size: 1000; max-lag-millis: 1500ms; dml-batch-size: 10; max-load: ; critical-load: ; nice-ratio: 0.000000
# throttle-additional-flag-file: /tmp/gh-ost.throttle
# Serving on unix socket: /tmp/hoge
# Serving on TCP port: 9999
Copy: 0/11761 0.0%; Applied: 0; Backlog: 1000/1000; Time: 3m6s(total), 3m3s(copy); streamer: mysql-bin.000002:578358174; State: throttled, lag=7.586699s; ETA: N/A
status

Ncat: Broken pipe.
今のところよく使いそうな気がしているのはこれ。
$ echo "max-lag-millis=500" | nc -U /tmp/hoge ### どのくらいレプリケーション遅延が出た時にSleepするかの閾値を変える。単位はミリ秒
$ echo "throttle" | nc -U /tmp/hoge ### gh-ostをサスペンドする
$ echo "no-throttle" | nc -U /tmp/hoge ### ↑でサスペンドしたのを再開する
--mal-lag-mills によるスロットルと throttle コマンドによるスロットルはどっちも State: throttled で表示されるけど、処理は独立しているっぽい。
max-lag-millis=10State: throttled -> throttle コマンド -> max-lag-millis=10000000State: throttled のまま -> no-throttle コマンドで State: migrating
さあ、次は 本番で試す 実践投入ですね!

0 件のコメント :

コメントを投稿