OthloBlog - オスロブログ -

名古屋のIT系学生コミュニティOthloTechのブログです。

Amazon Auroraがなぜ高速か解説する

f:id:Juju_62q:20181015221046p:plain

おはこんばんちは!@ジュジュです!
結構長いこと書かなかったなぁということでお久しぶりです。今回はいつもよりも少しテクニカルな記事を書きたいなと思います!

僕はインフラエンジニアを目指しているのでクラウドネイティブやパブリッククラウド系の勉強をすることが多いのですが、パブリッククラウドの謎技術ってたくさんありますよね。GCPのLive Migrationであったりとか、AzureのDurable Funtionsであったりとか。何回説明を読んでも「で、これはなにがどうなってんの?」みたいな気持ちになるわけです。今回は個人的にはAWSの謎技術である「Amazon Aurora」について調べてみたのでまとめたいと思います。

なお、主なデータソースはAmazon Aurora: Design Considerations for High Throughput Cloud-Native Relational Databases で、理解しにくかった部分については書籍や公式ドキュメント等で補完しています。個人的な意見や解釈が間違っている部分がある可能性がありますので予めご了承ください。

対象読者

  • データベースの構築や運用の基礎知識がある。
  • AWSの基本的な知識がある。
  • マネージドサービスの中身が知りたい。

記事の内容

  • Amazon Auroraがどう動いているのかをまとめています。
  • Amazon Auroraがなぜ早いのかを解説します。

なお記事内でAuroraと記述した場合Amazon Auroraを指します。

Amazon Auroraとは?

Amazon AuroraはAWSが提供するマネージドなSQLデータベースです。MySQL 5.6,5.7およびPostgreSQL 9.6.8と互換性があります。MySQLの約5倍、PostgreSQLの3倍の性能を持ちます。その一方で高い可用性と信頼性を持ちます。さらにソフトウェアのライセンス料はほぼ無料です。設定によってはアップデート作業やパッチ適用、バックアップをAWS側で管理して行ってくれるため利用者が意識して行うべきことが非常に減ります。バックアップはAWSのストレージサービスであるS3に保存することが可能で99.999999999%の可用性で守られます。Aurora自身のSLAも99.95%とかなり高い数値となっています。

詳しくは公式を見るといいところが列挙されています

aws.amazon.com

ここまで聞いてOSSとの互換性も担保しているしかなり強力なサービスであることがわかると思います。なんなら"Auroraというデータストアが優秀だから"という理由でAWSを選択する会社も存在するくらいです。今回はAuroraがなぜこのような優秀な特性を持つのかを紐解いていきたいと思います。

Auroraの基本的なアーキテクチャ

f:id:Juju_62q:20181015221051p:plain

公式サイトからアーキテクチャの図を引っ張ってきました。一般的に利用されるデータベースと比べるとストレージとDBMSが完全に切り離されているという部分で特徴的ですよね。Auroraにはクオーラムと呼ばれるストレージシステムが採用されておりデフォルトの利用では3つのAZ(Availability Zone)にまたがって合計6つ展開されます。また、書き込みが許されるのはMasterのDBだけでそれ以外のDBは読み込み専用という扱いになります。このあたりは一般的なDBの垂直分割がわかる方ならイメージしやすいかと思います。

Auroraのストレージシステム

信頼性、可用性、一貫性を保つクオーラムの仕組み

クオーラムの解説をする前にAWSのリージョンとAZ(Availability Zone)について軽く触れておこうと思います。AWSのリージョンとは大体イメージの通りでどの地域に存在するかを示しています。日本で言えば東京と大阪のクローズドリージョンが存在します。これに対してAZは同一の地域、同一の建物に存在することを示します。つまり同一リージョンに配置する場合でもAZさえ別のものを利用すれば火事や電源障害などの影響を回避することができます。下記の図を見るとイメージしやすいかと思います。なお、AWSのSLAの規約にはAZ障害は含まれません。したがって利用はマルチAZが前提となります。AZ間の通信のレイテンシは2ms程度らしいです。

f:id:Juju_62q:20181015222803p:plain

さて、クオーラムはデフォルトでは3つのAZにまたがって合計6つ展開されます。データの書き込みはクオーラムのうち4つが「書き込んでいいよ!」といった際に行われます。データの読み込みはクオーラムのうち3つが「読んでいいよ!」と言った際に行われます。この手法を取ることで得られるメリットには下記のようなものがあります。

  • AZ障害が発生しても正しくデータの読み書きが可能
  • 明らかに動作の遅いストレージが存在した場合にそれを一時的に無視できる(※1)
  • ストレージに何らかの異常が発生した場合に削除し、再作成するのが容易(※2)
  • 複数のクオーラムで一貫したデータが波及する

※1...一時的に動作しなかったノードへも変更は波及されます。
※2...障害は自動的に検知され、10Gbpsの通信路により10GB程度の容量であれば10秒程度で再作成がなされます。

また、ストレージは10GBごとに細切れになっており単一ストレージの障害は全体に波及しないほか1つの故障であれば10秒程度で復旧します。

スケールアウト時の高速さを担保する仕組み

従来のDBMSではDBMSとストレージが一体であるために垂直分割を行う場合Masterノードで受け取った変更を差分のバイナリとしてRead Replicaノードに転送する必要があります。AuroraではDBMSとストレージが完全に切り離されているためにMasterとRead Replicaが同一のストレージを読むことが可能です。したがって従来のDBMSで行っていた変更を転送するという手順は存在しません。これによりAuroraではRead Replicaの台数を増やすとMySQLやPostgresと比較したときにダイレクトに性能が向上します。

Auroraのログ機構

Auroraはログ機構でも特徴的な特性を持っています。MySQLを例に取ってあげると以下のようなログのやデータの転送がなされます。図は論文から抜粋しました。

f:id:Juju_62q:20181016010820p:plain

これを見るとLOG, BINLOG, DATA, DOUBLE-WRITE, FRM-FILESと5種類のログが転送されていることが見て取れます。更に、外部記憶を冗長化していないとしてもMasterの外部記憶に書き込み、Read Replicaへの転送、Read Replicaの外部記憶に書き込みと3回のIOが発生します。これはRead Replicaの数が増えると増加していきます。AuroraではストレージとDBMSが切り離されているという部分に関しては前述のとおりですがログの数もかなり削減しています。具体的には5種類のデータを送信していたMySQLと比べるとRedoログしか送りません。

Redoログとはデータベースの差分を指し示すログでデータとRedoログに基づいてデータの中身を変更していきます。これはストレージが十分に信頼できるゆえに取れる選択で、下記のようなアーキテクチャになります。

f:id:Juju_62q:20181016012014p:plain

かなりデータ転送が減っているのが見て取れますね。DBMSにRedoログを送信しているのはオンメモリキャッシュの変更のためです。AuroraのアーキテクチャではMySQLと比べてIOが1/7まで削減されます。

さらに、データベース内でインクリメントされながら一貫して発行されるLog Sequence Numberを利用してロックや復旧の時間が短くなるように工夫されています。ログは基本的に追記型で行うことでデータを読んでいる途中でデータが変更されることを防ぐためのロックを掛ける必要がなくなります。復旧の際にはLog Sequence Numberに基づいて適用することで高速に本来のデータに戻すことが可能です。結果としてストレージには断片化が発生しますがこれについてはストレージレイヤで工夫して解消しているそうです。

まとめ

Amazon Auroraでは一貫して、"不要なロックを排除する"、"不要な通信を削除する"というアプローチを取り高速化を図っています。結果としてスケールアップの際のスループットの上昇率やコネクション増加時の処理性能はMySQLを圧倒します。MySQLとの比較実験の結果に関しては論文の6章に記述がなされているので数字が見たい方やもっと細かく見たい方は確認してみるといいと思います!

終わりに

今回は普段から利用しているツールの中身を追ってみました。中身を少しでも知るとそれを運用する上での注意点やすべきことが見えてくるなと実感しました。最近はOSSや論文の公開がどんどん増えていてITエンジニアとして知識を蓄える場にはあまり困りません。みなさんも一度使っているツールの中身を確認してみてはいかがでしょうか?それではみなさん、快適なハックライフを!