密着 24時! MySQL 5.1 から Aurora への移行100日間 〜 Backlog 編

Photo via Visual huntPhoto via Visual hunt

Backlog の一部のスペースにて Amazon Aurora へと移行しました。ここでは、その経緯と実際に実施した作業を簡単にご紹介させていただきます。

移行の経緯

昨年末データベース障害が発生しユーザー様には多大なご迷惑をお掛けしてしまいました。
Backlog には Terraform をどう使っているかを紹介したブログ にあるように複数の運用環境があります。
その各々の環境の構築時期によって EC2 上で自前運用していた MySQL もあれば、RDS for MySQL もある、といった統一されていない状況でした。また EC2 上ではまだ MySQL 5.1 も稼働していました。
移行を検討するにあたり、優先したのは障害時の復旧が素早く出来ることと、少しでも運用の管理コストを下げることでした。Backlog のサーバは 100 台以上で運用されており管理コストが上がってきてます。
そういった経緯もあり EC2 上で自前運用するアンマネージドなものからマネージドサービスである RDS for MySQL へ移行することとし検証を開始しました。
最初は RDS for MySQL に切り替えることを 検証をしていたのですが、簡単に RDS for MySQL から Amazon Aurora に移行できます。アプリケーションが動くかのテストを実施し、問題なく動くことを確認したので Amazon Aurora に移行することになりました。

Amazon Aurora に決めた理由としては、アベイラビリティ(可用性)とスケーラビリティ(拡張性)です。 また、先行して移行したヌーラボアカウントで安定稼働していること。 それに、新しい Backlog 環境では Amazon RDS for MySQL 5.6 での稼働実績があり移行の後押しとなりました。

また公式で互換性があることが記載されています。( Amazon Aurora データベースエンジンは InnoDB ストレージエンジンを使用することで MySQL 5.6 と強い互換性を持っています。 )

主観ではありますが運用の視点で見た場合に Amazon Aurora にして何が一番嬉しいかというとスケーラビリティ(拡張性)でした。 Amazon Aurora ストレージは 10 GB 単位で最大 64 TB まで、データベースのパフォーマンスに影響を与えずに拡張されます。
Backlog は複数の運用環境があり、ユーザー数をコントロール可能です。 64 TB 以上データが増えないようにすることが可能でディスク拡張のためのメンテナンスを実施しなくてよくなります。RDS for MySQL のディスク拡張を行った際には待機を行っておりましたが、いつ完了するか、いつ切り替わるかのコントロールが実施できず、夜実施し、朝終了することもありました。回数は少ないとはいえこういったメンテナンスから開放されるのは嬉しいものです。

ユーザー様視点でみるとマネージドなサービスを利用することになってデータベースが原因となるメンテナンス時間が減ることになります。

移行手順の検討

ここでは EC2 上の MySQL 5.1 から Amazon Aurora に移行する手順を検討します。
重要視したのは通常のメンテナンス時間でデータを確実に移行することでした。
MySQL バージョン間のレプリケーション互換性を参考に段階的に MySQL のバージョンアップを行いレプリケーションのチェーンをさせてデータベースを切り替えていくことにしました。

データ容量は 5TB ほどで一気に Amazon Aurora に移行するのではなく大きく3ステップ、さらにそれをブレークダウンして実質は 14 ステップに分解し少しずつアップデートしていきました。

大きくは以下の 3 つのステップになります。

  • MySQL 5.1 から MySQL 5.6 へのアップグレード
  • MySQL 5.6 から RDS for MySQL 5.6 への切り替え
  • RDS for MySQL 5.6 から Amazon Aurora への切り替え

それぞれの手順を詳しく見ていきます。移行前は下図の状態でした。

手順 0

移行の手順

手順 1 MySQL 5.5 のスレーブを作成してレプリケーションを開始する。

手順 1

新規スレーブを MySQL 5.1 で立て、mysql_upgrade を行い MySQL 5.5 にアップグレードしています。 データのスナップショットは、すでに稼働しているスレーブから xtrabackup を使用して移行しています。

手順 2 MySQL 5.6 のスレーブを作成してレプリケーションを開始する。

手順 2

さらにスレーブを MySQL 5.5 で立てて、mysql_upgrade にて MySQL 5.6 にアップグレードしています。 データのスナップショットは手順 2 で作成したスレーブから xtrabackup を使用して移行しています。

手順 3 MySQL 5.6 をマスターに切り替えてアプリケーションを稼働させる。

手順 3

メンテナンス時間を設けて MySQL 5.6 をマスターとしてアプリケーションを稼働させました。

手順 4 Amazon RDS for MySQL 5.6 を立てて、移行用に MySQL 5.6 のスレーブを作成する。

手順 4

アプリケーションに影響が出ないよう新しいスレーブを立てて、Amazon RDS for MySQL 5.6 を立てます。

手順 5 MySQL 5.6 のスレーブのレプリケーションを停止し、テーブル単位で mysqldump を実施する。

手順 5

手順 4 で作成したスレーブのレプリケーションを停止し、テーブル単位でバックアップをとっていきました。テーブル単位でバックアップをとった理由としては、テーブル数が多いこととテーブル単位でデータ量が違うため書出しが終わったものを把握しやすいような粒度にしました。
実は何度もフルバックアップを取りリストアを試していました、ですが毎回件数があわず原因を追いづらい状況でした。そういった経緯もありどれだけレプリケーションが遅延しても追いつくまで待つこととし、レプリケーションを止めてテーブル単位で確実に移行を行っていった経緯があります。

話は脱線しますが移行の過程で AWS Database Migration Service でデータを移行することを検討していました。テスト環境での移行はうまくいっており、簡単な操作でデータがレプリケーションされることを確認しています。ですが移行を試した時期がプレビューリリース時期というのもあり、本番データを移行しようとした時に上手く行かず、今回紹介させて頂いた方式でデータの移行を実施しております。AWS Database Migration Service が GAになったときにはすでに移行完了していたので次移行する機会があった場合には使用したいと思っています。そのときにはまたレポートさせて頂きます。

手順 6 Amazon RDS for MySQL 5.6 を起動し mysqldump で取得したデータをリストアする

手順 6

手順 5 で作成したダンプを、テーブル単位でリストアしていきます。

手順 7 MySQL 5.6 をマスター、Amazon RDS for MySQL 5.6 をスレーブとしたレプリケーションを構成する。

手順 7

リストア完了後にレプリケーションを開始します。

手順 8 MySQL 5.6 のスレーブのレプリケーションを開始する。

手順 8

レプリケーションを開始し、現在アプリケーションサーバが接続しているマスターと同期を開始します。
5TB ほどのデータ量でしたが、マスターと同期するまでに約 1 週間かかりました。 SQLでの移行でなく、何かしらデータディレクトリのコピーで移行できる仕組があるともっと時間を短縮して移行できそうです。

手順 9 Amazon RDS for MySQL 5.6 をマスターに切り替えてアプリケーションを稼働させる。

手順 9

メンテナンス時間を設けて Amazon RDS for MySQL 5.6 をマスターとしてアプリケーションを稼働させます。

手順 10 Amazon RDS for MySQL 5.6 のリードレプリカを作成してレプリケーションを止め、バイナリログが削除されるのを防ぐ。

手順 10

Amazon RDS for MySQL 5.6 管理下のリードレプリカを作成し、レプリケーションを止めておくとマスターがバイナリログを削除せずに保持し続けます。

手順 10 以降はヌーラボアカウントと同様の移行方式をとっているためそちらもご確認下さい。

手順 11 Amazon RDS for MySQL 5.6 のリードレプリカのスナップショットを作成する。

手順 11

レプリケーションを停止したリードレプリカからスナップショットを取得します。

手順 12 Amazon RDS for MySQL 5.6 のリードレプリカのスナップショットからAuroraインスタンスを立ち上げる。

手順 12

スナップショットから Migrate Database を実施し Amazon Aurora インスタンスを作成します。その際にWriter ノードと Reader ノードを立ちあげてクラスターを構成しておきます。

手順 13 Amazon RDS for MySQL 5.6 をマスター、Amazon Aurora をスレーブとしたレプリケーションを構成する。

手順 13

Migrate Database 完了後に手順 10 で確認したバイナリログの位置を合わせレプリケーションを開始します。

手順 14 Amazon Aurora をマスターに切り替えてアプリケーションを稼働させる。

手順 14

メンテナンス時間を設けて Amazon Aurora をマスターとしてアプリケーションを稼働させます。

データベースの移行はここで完了しました。
運用を開始して1ヶ月以上経過しましたが大きなトラブルもなく、スムーズに移行できております。

最後に

年末の障害は重く受け止めており慎重に慎重を重ね Amazon Aurora への移行を実施しました。
また移行を決めてから完了するまでにメンテナンスが多くなったことをお詫び致します。

AWS のサービスは大変素晴らしく、進化も速いです。
ヌーラボではずっと AWS を使用しておりますが 運用上追従できていない箇所があり日々改善を加えていっているのが現状です。停止を伴わないメンテナンスが実施できるよう今後も改善を加えていきます。


現在役割としての Ops は私一人です。
ボットでプルリクエストのレビュアーをきめているのですがいつもレビュアーが私になるので大変寂しい思いをしており不具合なんじゃないかなと思っています。
一緒にレビューを行ってくれるエンジニアも募集していますのでぜひご応募下さい。

より良いチームワークを生み出す

チームの創造力を高めるコラボレーションツール

製品をみる