♠️

クラウド時代のデータベースを理解するために①

2024/05/28に公開

最近、分散データベースとかNewSQLとかサーバレスなデータベースとか色々聞きますよね。
でも、専門ではない人たちにとって、「何が違うの?」「自分たちに必要なDBはどれなの?」という点が分かりづらいと思います。

私も良く聞かれます。

  • AuroraはNewSQLですか?
  • NewSQLってサーバレスなんですか?
  • スケールできないDBとか聞きますけど、リードレプリカ増やせますよね?

などなど。この辺に基本的なところから答えられるように、順を追って解説していきましょう。

「コンピュートとストレージは別であれ」

と神が言うと、コンピュートとストレージは分離された。

と言うのは冗談ですが、まずはここからスタートしましょう。
クラウド以前のデータベースを使っていた人にはお馴染みのように、それまでデータベースは大きな1つの箱でした。

過去に私は下図でデータベース(厳密にはRDBMS)のコンポーネントを解説していますが、クラウド以前のデータベースでは、SQLを処理する部分(パーサーやオプティマイザ、エグゼキューター)と、データを効率的かつ安全に管理するストレージエンジンは、同じサーバ内に配置されていました。


(https://speakerdeck.com/tzkoba/cloud-nativeshi-dai-falsedetabesu?slide=7)

「別にそれでもいいじゃない」と思う人もいるかも知れません。では、この「DBが1つの大きな箱」では何が問題になるのでしょうか。

これです。サーバの監視をしていると、CPUやメモリ、ディスク容量など様々なリソース不足がでてきますが、「DBが1つの大きな箱」状態ではCPU(=コンピュート)が足りなくてもディスク(=ストレージ)が足りなくても、できることはDBサーバのスケールアップだけです。

「CPU利用率が80%を超えたので、CPUだけ増やしたいんです!」と言うのが難しく、結果として無駄なコストが掛かっていたと言うことですね。

クラウドが当たり前になってからの方々には、実はここのコンピュートとストレージの分離と言うのが伝わりづらいのかも知れません。

もちろん、↑は極端な言い方です。
オンプレミスの頃は、サーバのソケットが空いていればそこに新しいCPUを挿せましたし、そもそもサーバと別筐体の(お高い)ストレージを使って、容量が不足したらストレージの中で拡張できたよという話はあります。
ただ、上のコンポーネント図をもう一度見てみてください。
サーバとストレージが物理的に分かれていたとしても、データベースのコンポーネントは基本的に1つのサーバに配置されていました。
当然例外はあり、Oracle RACやASMなどを持ち出す方もいるかも知れません。が、その話は長くなるので、別の機会に、、、

そしてAuroraへ

もちろん、クラウド以降のデータベースが全てコンピュートとストレージが分離されているのかと言うと、そんなことはありません。

多くの人が思い浮かべるのが、下図右側のAmazon Auroraでしょう。


https://www.slideshare.net/slideshow/cloud-native-database-cndt2023-nttdata/264525812 より抜粋)

図にあるように、Auroraでは "賢い" ストレージにコンピュートを生やすことで、読み取り性能の向上が見込めます(最近ではLimitless DBにより書き込み性能の向上も可能になりました)。

容量が不足すればストレージも自動的に拡張しますし、コンピュートとストレージの分離の良い所をきれいに実装した構成です。

サーバレス・データベース

このコンピュートとストレージの分離から派生する、データベース提供形態の新しい形が「サーバーレス」です。

サーバレスなデータベースが構成可能なものとして、

などがありますが、いずれもコンピュートとストレージの分離を前提として、「コンピュート部分がオンデマンドで自動的に拡張され、管理が容易」になるサービスです。勘違いしてはいけない点として、ストレージに保持しているデータ分のコストは継続的に発生します。

この辺りはアプリケーション実行環境としてのサーバレスと考え方が違ってきますので注意しましょう。

また、別の話としてサーバーレスのメリットは良く低コストと考えられがちですが、これもデータベースでは必ずしも真実ではありません。

サーバーレス・データベースには、「急激な負荷の上昇にどれだけ迅速に対応できるのか?」という課題があります。先ほど言ったように、コンピュート部分は自動的に拡張されるのですが、それが負荷増に間に合わないとリソース不足や、最悪ではDBハングアップのような結果を招きます。

また、コンピュート部分の拡張に必要なリソースとして、最低限xxぐらいのCPU/メモリを準備しておく必要があったり、負荷が少ない(または全く無い)時間帯でもコスト削減ができなかったというケースも良くあります。

では、サーバーレスのメリットは何かというと「予測不可能性への対応」です。サービスをリリースするけど、需要予測からどれぐらい上振れするか分からないなどのケースで使うべきだと言えます。

開発環境での利用という例も一部見ますが、データベースにおいてはそれもサーバレスでコスト削減ができるとは個人的には考えていません。


ここまでで「コンピュートとストレージの分離が大事なんだな」「分離してるとサーバレスってやつもできるんだな」と理解したことだと思います。

ただ、世の中のコンピュートとストレージを分離したデータベースの全てがサーバレスになれるか、と言うとそうではないのです。

次の記事では、その辺りを別の概念も示しながら見ていくことにします。

Discussion