今回はMySQLのレプリケーション構成からInnoDB Clusterへの移行について考えてみます。
とりあえずは移行元と移行先は同じバージョンで、という前提です。
(mysqldump使ってるから違っても応用は効くはず)
色々試してみましたが、
大まかな手順としてはこんな感じになりそうです。
多分これが一番ダウンタイム少ないと思います。
1.旧環境のMaster/Slaveどちらかからmysqldumpを取る。 # mysqldump -uroot -p --all-databases --single-transaction --routines --events --triggers --hex-blob --master-data=2 2.新環境にMySQLのバイナリをインストールする(データディレクトリはいらない)。 3.新環境のうち1台に初期化したデータディレクトリを作る。 4.rootパスワード変更して更新できるようにしたら、reset masterしてGTID_EXECUTEDを空にする。 ※これがないとダンプファイルをインポートする際、ダンプファイル中のSET GTID_PURGEDが通らずエラーになる。 5.作った初期化データディレクトリにmysqldumpで取ったダンプファイルを流入させる。 # mysql -uroot -p < dump.sql 6.MySQLを停止し、ダンプを流入したデータディレクトリを新環境の残りの2台にコピーする。 7.新環境の3台のMySQLを起動する。 8.InnoDB Cluster構成を構築する。(dba.configureLocalinstance()とかdba.createCluster()とか) ※詳細な手順はこちらの記事で書いています。 アプリケーションサーバにMySQL Routerを入れるのも忘れずに。 9.Primaryになっているサーバから旧環境にレプリケーションを張る。 mysql> CHANGE MASTER TO ...(略)... MASTER_AUTO_POSITION; mysql> START SLAVE; 10.追いつくのを待つ。 11.メンテナンス時間を取って、アプリケーションの接続先を旧環境から新環境(MySQL Router経由)に変更する。 ※この時、旧環境への接続を切ってから、旧環境で実行したクエリが新環境まで伝搬し切っていることは必ず確認する。 12.旧環境を停止する。
ダウンタイムは、11のレプリケーション伝搬待ち+アプリケーション接続先変更作業の時間だけなので、
概ね数分~10分程度で終わるはずです。
手順自体はこんな感じなんですが、
InnoDB Clusterにはいくつか制約があります。
例えばテーブルには明示的なプライマリーキーが必要であるとか、
MyISAMは使えない、
などです。
計画立てて、いざ作業してみたらInnoDB Clusterの要件を満たしていなかった、
(要は8.でコケる)
というと結構つらいので、
事前に要件はチェックしておき、
mysqldumpの–no-dataとかでスキーマ定義だけインポートして
ちゃんとInnoDB Clusterを作れるかチェックしておく、など、
事前の準備がモノを言いそうです。
ちなみに、
InnoDB Cluster構成を作っておいてからmysqldumpでインポート、
という方法を最初考えたのですが、
mysqlデータベースがMyISAMなのでインポートできません。
InnoDB Clusterを作る時のdba.configureLocalInstance()で、こんな設定がmy.cnfに書かれているはずです。
disabled_storage_engines = MyISAM,BLACKHOLE,FEDERATED,CSV,ARCHIVE
他にも、この方法の欠点として、
データをインポートしてからInnoDB Cluster構成を作る、
という順番になっているところが挙げられます。
インスタンス間で3306や13306のポートを閉じていたとか、
SELINUXが動きっぱなしだったとか、
そういうところであたふたしないためにも、
移行前にいったんデータは空でいいのでInnoDB Cluster構成が作れることを試しておくのは
必須と言ってもいいと思います。
今回の手順は、
別サーバにInnoDB Cluster構成を作って移行する、
という想定でしたが、
同じ環境でInnoDB Cluster構成にする、
という場合はおそらくそんなに難しくないはずです。
要は一度止めてInnoDB Clusterにして起動するだけの「はず」です。
事前にCluster構成が組めるかどうかのチェックができない(稼働中だから)、
というのが痛いですね。
この場合でも、どこかにmysqldump –no-dataをインポートして
InnoDB Cluster要件を満たしているか確認するのは必須と考えてよさそうです。
では。