はじめに
- 自己紹介はありません
- 話す内容=個人の見解です
- 基本的に作業時点で確認した情報です(2017/6 ~ 9)
- 詳細は Qiita にまとめています
- https://qiita.com/hmatsu47
- https://hmatsu47.hatenablog.com/aurora
今日話す内容
- 移行前後の環境
- データ移行
- 性能問題
- その他の制約(Failover 処理/バグ/未サポート機能)
移行前の環境
- VMware vSphere
- ストレージアプライアンス(10G-iSCSI)
- MySQL 5.5 × 2(メインは 1 台)
- データは 1TiB 未満(DB/ファイル)
- DR:BD や MySQL 準同期レプリケーション等は使わず
- Webサーバ数台(Java 8/Tomcat 8)
- Web ~ DB 間 Connection Pooling あり(Commons DBCP2)
移行後の環境
- Web サーバは EC2 へ(東京 AZ-a と AZ-c に分散配置)
- Aurora は db.r3.2xlarge がメイン(途中で db.r4 へ)
- ファイルは S3 へ
データ移行 (1/3)
- DMS は使わず MySQL レプリケーションで複製
- DMS の制約の問題があった
- 治安の悪いデータ(0000-00-00 00:00:00)が複製できない
- キャラクタセット:UTF8MB4 がサポートされない
データ移行 (2/3)
- Aurora クラスタの FQDN が長すぎる
- レプリケーションマスターの指定で 60 文字制限に引っかかる
- 対応策:Aurora クラスタ名を短めに
- タイムゾーン不一致問題(オンプレ側設定もれ)
- タイムゾーン「SYSTEM」が指す時刻:JST(オンプレ)/UTC(Aurora)
- 対応策:オンプレ側で明示的に JST(Asia/Tokyo)を設定
データ移行 (3/3)
- レプリケーション先で LAST_INSERT_ID が 0 になるバグ(後述)
- 対応策:バイナリログ形式を MIXED → ROW に
性能問題 (1/3)
- Connection Pooling の性能問題が発生
- ピーク時クエリ数を捌けない
- Failover で詰まる
- AZ 内のネットワークレイテンシの影響
- オンプレ比 1.5 ~ 2 倍のレイテンシ(当時)
- その後ネットワークの増強で幾分改善
- さらに NITRO 世代ではオンプレに近いレベルまで軽減されている
性能問題 (2/3)
- AZ 間のネットワークレイテンシの影響
- ms オーダーなので、DB データ書き込み時に必要な数の ACK が返るまでの時間がどうしても長くなる
- 改善策 1:Java GC 時間の調整
- 改善策 2:高速な Connection Pooling に入れ替え:DBCP2 → HikariCP
性能問題 (3/3)
- シーケンシャルな処理の性能問題
- 夜間バッチ処理など
- レイテンシの影響を大きく受ける
- 改善策:データの読み込み対象の絞り込みを徹底
- (最近は非同期先読み(AKP)やパラレルクエリなどで改善)
その他の制約/Failover 処理
- Aurora Failover で Writer 向けの Connection が Reader に接続してしまう
- 通常は MariaDB Connector/J で Failover 対応する
- MySQL Connector/J と挙動が違うので断念
- Connecion Validation 用のストアドを作成して対応
- Reader に接続したらエラー→ Connection Pooling 側で再接続するように
その他の制約/Fixされないバグ
- MySQL 5.6.10/MySQL 5.7.12 より後に Fix されたバグのうち AWS が対処せず残したもの
- 例:レプリケーションフィルタが使用されていると LAST_INSERT_ID が不正にレプリケートされる (バグ #69861)
- バージョン 1.17 で Fix (2018/3/13)
その他の制約/Auroraでサポートされない機能
- MySQL 5.6.10/MySQL 5.7.12 より後に実装された機能の大半
- 例 1:RANDOM_BYTES()/MySQL 5.6.17 でサポート
- 例 2:MySQL 8.0 で実装された JSON 関数のバックポート/MySQL 5.7.22 でサポート
まとめ
- Aurora 固有の問題というより AWS 環境(複数 AZ による冗長化)にフィットさせるのに苦労した(レイテンシ問題)
- Aurora 固有の問題は、MySQL で Fix or 追加実装された機能の取り込みが追い付いていない点への対処がメインだった