先日(02/22)にMDSのクラッシュ・リカバリを無効化できるオプション機能がリリースされました
MySQL におけるクラッシュ・リカバリは、予期せぬシャットダウン時に障害発生直前にコミットされている時点まで回復させる処理で、詳細はこちらのドキュメントをご確認いただければと思います
特に、下記のノートの様に重要なことが記載されていたりしますので、一度はご確認いただければと思います
ノート
クラッシュ・リカバリが無効になっているときにスタンドアロンDBシステムのいずれかのコンポーネントで障害が発生すると、DB SystemはFAILED状態になり、リカバリ不能になります。クラッシュ回復を無効にする前に、完全な手動バックアップを実行することを強くお勧めします。マルチアベイラビリティ・ドメイン・リージョンの高可用性DBシステムは、高い障害耐性ですが、特定の状況では回復不能になることもあります。
そのようなクラッシュ・リカバリ機能ですが、初期データ投入時などの大量にデータを投入する際に、書き込み処理のパフォーマンスが改善されることが、無効化することの目的の一つでは無いでしょうか
そこで、本記事ではクラッシュ・リカバリを無効化することで、どれだけパフォーマンスに差が出るのかなどを検証してみたいと思います
環境
- データ登録用ホスト
- 1 OCPU
- 16GB Memory
- Oracle Linux 7.9
- MDS
- MySQL.VM.Standard.E3.1.8GB
- HA構成
クラッシュ・リカバリの設定
クラッシュ・リカバリはインスタンス作成時に指定することも、インスタンス作成後に任意のタイミングで変更することも可能です(オンラインで変更可能です)
ただし、クラッシュ・リカバリを無効化する際には、自動バックアップを事前に無効化しておく必要がありますので注意が必要です
-
MDS作成時
-
MDS作成後
パフォーマンス検証
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysqlslap \ --no-defaults \ --login-path=mds \ --auto-generate-sql \ --engine=innodb \ --auto-generate-sql-guid-primary \ --number-int-cols=5 \ --number-char-cols=10 \ --iterations=10 \ --concurrency=50 \ --auto-generate-sql-write-number=100000 \ --number-of-queries=1000 \ --auto-generate-sql-load-type=write |
mysqlslap コマンドを使用し、50 のクライアント、100,000行のデータ登録を10回実施するテストを計3回実施
結果
– | クラッシュ・リカバリ有効 | クラッシュ・リカバリ無効 |
---|---|---|
1回目 | 0:37:06 | 0:16:33 |
2回目 | 0:38:29 | 0:16:43 |
3回目 | 0:39:04 | 0:16:47 |
クラッシュ・リカバリを無効化した場合、約半分の時間で登録出来ていることが判ります
まとめ
先に書きました様な、初期データ登録時などの大量にデータを登録する際に、一時的にクラッシュ・リカバリ機能を無効化することで、データ登録時間を大幅に削減する可能性があるのでは無いでしょうか
ただし、無効化する際に下記メッセージが表示され、注意を促されます
クラッシュ・リカバリを無効化すると、バックアップの作成およびDBシステムの停止または再起動ができなくなります。これらのアクションを実行するには、キャッシュ・リカバリを有効化する必要があります。キャッシュ・リカバリの無効化は、バッチロード処理またはDBシステムのテストでのみ推奨されます。
バックアップが取得出来ないことは大きなリスクとなりますので、大量データロードなどの一時利用やテスト環境としての利用など、リスクを理解した上でご利用いただければと思います