出典について
この記事はThe Percona Performance Blog内のStephane Combaudon氏によるOnline DDL and Percona XtraDB Cluster 5.6(2015/10/9)を翻訳したものです。
2、3週間前アムステルダムで開催されたPercona Liveで講演を行い(Galera Clusterの簡単なコツ)、その中でスキーマの変更が話題となりました。TOI(Total Order Isolation)、RSU(Rolling Schema Upgrades)、pt-online-schema-changeの短所と長所について議論しました。忘れてしまったものの1つとして、MySQL 5.6から利用可能となったオンラインDDLがありました。オンラインでスキーマ変更をする他の方法はあるでしょうか?
読むのが億劫な人へのまとめ
MySQL 5.6のオンラインDDL機能はPXCで修正されていませんが(訳注: PXCでInnoDBネイティブのオンラインALTER TABLEには手が加えられておらず利用可能なままですが)、GaleraはALTER TABLE
文が動作している最中に書込みの同時実行を許さないため、期待した動作はしません。従ってALTER TABLE
は、TOIを利用している場合、PXC 5.5でそうであったのと全く同様に、全ノード上の全ての書込みをブロックします。
ALTER TABLE
をオンラインで実施したかったら、pt-online-schema-changeがベストでしょう。
TOIでのオンラインDDL
簡単なテストをしました。3ノードのクラスタを準備し、ノード1にテーブルにレコードを挿入する為にsysbenchを動作させ、同時にノード2でALTER TABLE
(インデックス追加)を走らせます。実行中のCom_insert
ステータス変数の値は次の通りです。
# ノード1
| Com_insert | 563 |
| Com_insert | 75 |
| Com_insert | 1532 |
| Com_insert | 10 |
| Com_insert | 4 |
| Com_insert | 0 |
| Com_insert | 0 |
| Com_insert | 0 |
| Com_insert | 11 |
| Com_insert | 135 |
# ノード2
| Com_insert | 12 |
| Com_insert | 575 |
| Com_insert | 307 |
| Com_insert | 1231 |
| Com_insert | 0 |
| Com_insert | 0 |
| Com_insert | 0 |
| Com_insert | 0 |
| Com_insert | 1 |
| Com_insert | 133 |
# ノード3
| Com_insert | 559 |
| Com_insert | 339 |
| Com_insert | 736 |
| Com_insert | 465 |
| Com_insert | 0 |
| Com_insert | 0 |
| Com_insert | 0 |
| Com_insert | 5 |
| Com_insert | 121 |
ALTER TABLE
が動作している際に、全ての書込みが停止していることが明らかに見てとれるでしょう。いったい何が起きたのでしょうか?オンラインDDLのドキュメントをみると、同時に書込むことが可能であるようにもみえます。
理由としては、TOIではGaleraは変更中のテーブルに対してトランザクションを同時に適用することを許していないだけです。
テーブルt1のスキーマ変更の最中にテーブルt2に書込みを行ったら違う結果となるでしょうか?いいえ、なりません。再度の確認となりますが、GaleraはALTER TABLE
文の実行中は全ての書込みをブロックします。
注意として加えておきたいのが、テストの最中に同時書込みがnode1では動作しているものの、他のノードでは動作しないケースが何回かありました。しかし、数秒後にはフロー制御が効き、クラスタへの全ての書込みがブロックされました。この動作を思った通りに再現させられていないので、現時点ではこのとき何が起こっていたかは分かりません。
RSUでのオンラインDDL
RSUでのオンラインDDLはそれほどクリティカルではありません。ALTER TABLE
文は最悪でもスキーマ変更が実行されているノードの書込みをブロックするだけでだからです。そしてこのノードはフロー制御のトリガーを引きません。
潜在的な同時書込みを許す唯一の効用は、レプリケーションが速く追い付くことです。これは負荷の高いクラスタでは重要となりえて、例えば全ノードでワークロードを処理する必要がある場合がこれに該当します。
しかし再度となりますが、ALTER TABLE
は書込みの同時実行をブロックするので、オンラインDDL機能の恩恵を受けることができません。
まとめ
PXC 5.6はオンラインDDL機能の恩恵に与ることはできません。大きなテーブルのスキーマ変更が必要になり、RSUで動作していない場合は、pt-online-schema-changeが最善となるでしょう。