gh-ost には interactive-command なるものが用意されている。
これは
gh-ost
を 起動しちゃった後 、後からオプションを変更したりする機能を提供しているっぽい。
デフォルトではソケットファイルのみオープンする。デフォルトのパスは
パスを変えたかったりTCP経由も受け付けてほしい時は
/tmp/gh-ost.<スキーマ名>.<テーブル名>.sock
。パスを変えたかったりTCP経由も受け付けてほしい時は
gh-ost --serve-socket-file=/tmp/hoge
や gh-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でも
パイプ通さなくてもいいけれど、その場合は1つコマンドを押し込むたびに切断されるので面倒っちゃ面倒。
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=10
で State: throttled
-> throttle
コマンド -> max-lag-millis=10000000
で State: throttled
のまま -> no-throttle
コマンドで State: migrating
さあ、次は 本番で試す 実践投入ですね!
0 件のコメント :
コメントを投稿