スマートスタイル TECH BLOG

データベース&クラウド技術情報

Spiritを使ってみる(1)

昨年10月に Morgan Tocker氏よりcashapp/spirit についてのブログ記事が公開されました。

Spirit はALTER TABLEのようなSQLによる定義変更中もDMLの実行を妨げずにそれらを実施する方法を提供するツールで、そのような事を Online Schema Change の頭文字から OSC と呼ぶこともあります。

これまでもMySQLでOSCを行う方法としては、有名なものに以下がありました。

Hack MySQL (Efficient MySQL Performanceの著者のブログ)で紹介されていたりと、MySQL界隈でも注目度が高いと思われるSpiritについて検証していきたいと思います。

Spiritの実行

すでに開発者のブログでも詳しい挙動についての解説がされておりますので、これまでのツールとの違いや機能についてご興味があればご一読いただければ幸いです。
※ ちなみに すでにとても詳しく内部的な挙動まで解説されているエンジニアの方もおり期待値の高さが伺えます…非常に参考にさせていただきました。

開発者の Morgan Tocker さんの言うように

Spirit is a reimplementation of the schema change tool gh-ost.

ということなので、基本的な動作は gh-ost と同じとなります。

  1. ALTERを実行するソースDBと(ラグを監視するなら)レプリカに接続
  2. ALTERを実行するテーブル(元テーブル)のコピー(コピーテーブル)を作成し、定義を変更
  3. spiritがレプリカのように振る舞いソースDBに接続、バイナリログを取得し自身のキューに入れる
  4. 3のキューから元テーブルに関するバイナリログイベントを定期的にコピーテーブルへ適用
  5. 4と並列に元テーブルからコピーテーブルへ INSERT .. SELECT でデータをコピーしていく
  6. コピーが完了したら 元テーブルとコピーテーブルを入れ替え、入れ替え後の元テーブルを削除

ではさっそく USAGE.md を見てインストールしていきたいと思います。
go.modより、Golangのバージョンは 1.21 を使用しているようでしたので、合わせて行きたいと思います。

検証用にOracle Cloud Infrastructureに以下の環境を構築しました。

HOSTNAME SHAPE OCPU MEMORY OS MYSQL VERSION INFO
blog-mysql-primary VM.Standard3.Flex 2(=4core) 32 GiB Oracle Linux 9 8.0.36 レプリケーションソースDB
blog-mysql-replica VM.Standard3.Flex 2(=4core) 32 GiB Oracle Linux 9 8.0.36 レプリケーションレプリカDB

まずは適当な環境でSpiritをbuildします

バイナリをアップロードします

検証に使用するダミーデータはTPC Benchmark™H(TPC-H) ユーティリティを使い dbgen -s 10 で生成しました。

今回検証で利用するLINEITEMのDDLは以下になります。

オプションは現時点では非常にシンプルです。

README に従いspiritを実行するユーザを作成します。
以下ではCREATE USER時にパスワードを省略していますが、環境に合わせてパスワードを指定してください。

では試しに実行してみます。
デフォルトでは、 --alter=engine=innodb となっているので InnoDB以外のテーブルに実行した場合は事故りますが InnoDBテーブルであれば特に定義は変更されずにテーブル全体を再構築するという動作になるはずです。

実行中に確認すると、INSERT IGNORE によるデータコピースレッドが複数と、ユーザが spirit になっている Binlog Dump スレッドが存在する事がわかります。

実行ログも割と親切で migration status: という列には、現在の処理行数/%、実行時間が表示されているのでいつ終わるのか見積もりが簡単にできそうです。

データコピーフェーズが完了すると、元テーブルから取得した際のデータのチェックサムと、コピーテーブル上のデータのチェックサムを突合するというのがデフォルトの動作のようですので、データの信頼性もバッチリです。

今回は spirit のインストール~使用までということで行ってみました。

次回はいくつかの実行パターンやベンチマークを試して行きたいと思います。

Let’s Enjoy New Toys!!

Return Top