虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

AWSのNoSQL DBとPurpose-Builtの考え方について

f:id:toranoana-lab:20211217125407p:plain

虎の穴ラボのかのたんです。Fantiaでエンジニアチームのリーダー的なことをやっています。

アドベントカレンダー20日目はいわみーさんの「PMBOKガイド 第7版に付属する『プロジェクトマネジメント標準』を読んでの感想」でした。

toranoana-lab.hatenablog.com

私は前回の資格試験に続きAWSの記事を書いていますが、サービスの都合で直近の業務ではGCPを使っていることが多いです。

本日はAWSにおけるNoSQLデータベースの紹介をさせていただきます。

NoSQLとは

分類としては「リレーショナルデータベース(RDB)以外のデータベースの総称」であり、一般的に「Not only SQL」という意味で解釈される言葉になります。

Purpose-Built とは

Purpose-Builtとは直訳すると「特別の目的のために建てられた」という意味で、より簡潔な言い方をすると「専用の」という意味になります。

AWSの公式セミナーでもPurpose-Builtの説明をする時には車が例えに使われているので、それに倣って紹介しようと思います。

普通自動車はとても汎用性が高く様々な用途で使えますが、それ1台で全てをカバーできるわけではないです。

  • より速く走りたいならレーシングカー
  • 多くの物を運びたいならトラック
  • 攻撃を受けても大丈夫な堅牢性が欲しければ戦車

などなど、状況により普通自動車以上に目的に見合った車があるように、データベースについても目的に応じて使い分けをするべきだというのがPurpose-Builtの考え方になります。

リレーショナルデータベースは非常に汎用的に様々な場面で用いられるデータベースですが、

  • より早いレスポンスを要求したい
  • より情報改ざんに対する耐性を上げたい
  • より柔軟なデータ型を使用したい

などのケースにおいて、NoSQLデータベースの利用が選択肢に上がってきます。 今から各ケースに応じて、どういったAWSマネージドなデータベースサービスが適しているのかご紹介していこうと思います。

AWSの各フルマネージドデータベースの紹介

aws.amazon.com

こちらのページにAWSのフルマネージドデータベースの一覧が載っていますので、そちらの図を引用させていただきます。

f:id:toranoana-lab:20211215114004p:plain

この図に合わせて各データベースについて紹介させていただければと思います。

Amazon RDS・Amazon Aurora

aws.amazon.com

NoSQLの紹介の前に、まずはリレーショナルデータベースの方をサラッと紹介していこうと思います。

Amazon RDSはAmazon Aurora、PostgreSQL、MySQL、MariaDB、Oracle データベース、SQL Serverの6種類が選べるマネージドなリレーショナルデータベースです。

特徴
  • 高可用性と耐久性
  • マルチAZ配置やクロスリージョンレプリケーションに対応
  • ネットワークセキュリティ面ではVPCやセキュリティグループとの連携が可能

aws.amazon.com

また、Amazon Auroraに関してはMySQL、PostgreSQLと互換性のあるリレーショナルデータベースで、最大でMySQLの5倍、PostgreSQLの3倍のパフォーマンスが出るという紹介がされています。

AWS上でMySQL、PostgreSQLをベースとしたデータベースを立てたいのであれば、Amazon Auroraを前提として考えた方が高パフォーマンスを発揮できると思います。

Redshift

aws.amazon.com

RedShiftはSQLを駆使してデータウェアハウスやデータレイクの構造化、半構造化データを分析するツールになり、ビジネスインテリジェンス(BI)ツールや機械学習との連携に使用します。

(今回はNoSQLがメインになるので詳細は割愛します)

DynamoDB

aws.amazon.com

ここからがNoSQLのデータベースの紹介になります。

DynamoDBはフルマネージド、サーバーレスのkey-valueデータベースです。

特徴
  • key-value形式なので1桁ミリ秒単位でデータが取得でき、非常に高速。
  • getItem(1件取得)、query(事前に設定したPartion Key、Sort Keyに対する絞り込みや並べ替え)、scan(全件取得だが遅い)の3種類が実行可能
  • 分散前提のデータベースで結果整合性の考え方が採用されているため、1ヶ所に書き込んだデータがレプリケーションされる前に読み込もうとすると古いデータが読み込まれる可能性がある。
    • どうしても古いデータが読み込まれることを避けたければ強力な整合性のある読み込みを指定する必要があるが、レイテンシーの増大や500エラーの発生などの弊害が起こりうることに注意。

ユースケースとしては莫大なデータ量に対して高速な読み込みが必要になるケースや、逆に従量課金であることを活かし、データ量が少ない場合に初期のプロビジョニング費用を抑えたいケース等が適しているかと思っています。

料金体系
  • 読み込みキャパシティユニット(RCU)、書き込みキャパシティユニット(WCU)という、一定のデータサイズ×回数に対する課金。
  • キャパシティユニットに関しては完全従量課金のオンデマンドと、ある程度事前に利用量を見越すことで割引させるリザーブドが選択可能(1年・3年)。
  • その他データストレージ、バックアップ、転送量などに料金がかかります。
付随サービス

aws.amazon.com

docs.aws.amazon.com

DynamoDB専用のインメモリキャッシュである「DynamoDB Accelerator(DAX)」やDynamoDB用にデータモデリングやデータの可視化を行うためのGUIツール「NoSQL Workbench」などがあります。

また、DynamoDB用の変更を検出し、トリガーとしてLambda関数の処理を実行させたり、Kinesisデータストリームに変更をストリーミングさせたりもできます。

個人的にはこの変更に対するトリガーを用いたデータドリブンな機能と、AppSyncとDynamoDBを連携することで簡単にGraphQLでCRUDを備えたAPIが作成できる点などに注目しています。

今後積極的に使っていきたいデータベースの筆頭です。

ElastiCache・AmazonMemoryDB for Redis

aws.amazon.com

aws.amazon.com

ElastiCacheはRedisとMemcached、MemoryDBはRedisを使える、key-value型のキャッシュストアになっています。

特徴
  • key-value型なので、読み書きが非常に高速です。
  • ElastiCacheはインメモリキャッシュであるため読み書きともに高速である代わりに障害によりデータが消失する恐れがあります。
    • 復元のためにはバックアップをスケジューリングするなどして取得しておく必要があります。
  • MemoryDBは書き込みに関するレイテンシーはElastiCacheに劣るものの、ElastiCacheと違ってデータが永続化でき、耐久性に優れたサービスになります。

私がNoSQL DBの中で最も馴染み深いのが、このElastiCacheです。

Ruby on Railsのアプリケーションを実装する中で、ログインのセッション情報やキャッシュ情報を一元管理しつつ高速で読み書きできるアーキテクチャが必要となるため、EC2の後ろにRDSとは別にElastiCacheを立てるという構成をよく組んでいました。

Amazon DocumentDB (MongoDB 互換)

aws.amazon.com

Amazon DocumentDBはMongoDB互換のフルマネージドデータベースです。

特徴
  • JSONなどのネスト構造を持ったデータをスキーマの型を気にせず柔軟に保存できます。
  • 保存するだけでなく、データに対し、柔軟にインデックスを組んだりもできます。

様々なデータを保存したい、しかしデータのスキーマを決めすぎず柔軟性を残したい!というという時にオススメの選択肢ではないでしょうか。

Amazon Keyspaces

aws.amazon.com

Amazon KeyspacesはApache Cassandra互換のマネージドデータベースサービスです。

特徴
  • Apache Cassandraは分散を前提としたDBシステムで、ペタバイト級の巨大なデータを扱うためにスケーリングに優れています。
  • Google BigtableのデータモデルとAmazon Dynamoのレプリケーションなどの分散システムデザインを融合させてできた分散データベース。
  • 元々はFacebookが開発し、Apacheの元でオープンソースプロジェクトに。

アーキテクチャとしてはDynamoDBのような分散の仕組みを持ちつつ、データ構造としてkey: valueのvalue部分にさらに表データを持つ、多次元の連想配列のような形を取れるようです。

正直ここで簡単な紹介をするには奥深すぎる内容なので、興味がある方は「Cassandra データモデル」で調べてみてください。

Amazon Neptune

aws.amazon.com

Amazon Neptuneはフルマネージド型のグラフデータベースです。

特徴
  • 多くの異なるエンティティに対する大量の接続や関連に対して、クエリを投げることができる

↑だけだとイメージが付きづらいと思いますが、

  • ユーザーAさん
  • 各日付の通販カート履歴
  • 商品

のような形の異なるエンティティがあった時に、

  • Aさんと◯日に入れたカート履歴には「購入に至った」という関連があり、カートの中にはラーメンと半チャーハンが入っていた
  • Aさんと△日に入れたカート履歴には「期限切れになった」という関連があり、カートの中にはラーメンと餃子が入っていた

のような関連があった場合、Aさんからラーメンに対するパスを辿っていくようなデータが得られるデータベースといった感じです。

f:id:toranoana-lab:20211216142826p:plain

これにより、実は関係がないように見えたノード同士の距離が近いなどの関連が見えるようになります。

かなり概念が難しいDBになりますが、興味がある方はぜひ掘り下げてみてください。

Amazon Timestream

aws.amazon.com

Amazon Timestreamは高速かつスケーラブルなサーバーレス時系列データベースです。

時系列ベースのストリーミングデータに特化しており、たとえばIoTデバイスから大量に送られるデータをAmazon Kinesis等を用いて収集し、保存や分析を行うようなユースケースに使えるようです。

こちらについてはまだ北米とヨーロッパのリージョンにしか展開されていないので、東京リージョンで使える日が来るのを待ちましょう。

Amazon 台帳データベースサービス(QLDB)

aws.amazon.com

QLDB(Amazon Quantum Ledger Database)はフルマネージド型の台帳データベースです。

特徴
  • 内容変更に関しては追加専用のジャーナルファイルを積み上げていく形式であり、変更履歴へのアクセスも容易。
  • 変更履歴を積み上げた結果が現在のDBの状態となる。
  • 変更ごとにチェックサムが生成され、データの改竄が防止できる

変更履歴が連なり、途中のものが抜けたり改竄されたことを検知できるという点ではブロックチェーンに近い技術と言えるかと思います。

台帳などのマスタデータや改竄が許されない取引データなど、高い信頼性が求められるユースケースにて利用する価値がありそうなDBです。

まとめ

今回はAWSのNoSQLと、Purpose-Builtの考え方について紹介しました。 リレーショナルデータベースは非常に汎用的に用いられるアーキテクチャですが、速度・拡張性・耐久性などでより尖った性能を求める場合にはNoSQLを選択肢に入れると、システム構築の幅が広がると思います。

今回はNoSQL DBというカテゴリで紹介いたしましたが、データの保存や検索という観点では以下のような選択肢も考えられます。

  • EC2インスタンスに接続するAmazon EBS
  • ファイルシステムとして利用するAmazon EFSやAmazon FSx
  • データ置き場としてのAmazon S3と、クエリを実行できるAmazon Athena
  • 全文検索などを行うためのAmazon OpenSearch

etc...

こういった選択肢も含め、幅広いマネージドサービスについて知ることにより、最適な構成が組めるようになると、よりAWS・クラウドの構築力が上がると思うので、今後も精進していきたいです。

ここまでお読みくださり、ありがとうございました。

アドベントカレンダー22日目は片岡さんの「決済サービスStripeの超入門実装」です。こちらもよろしくお願いいたします。

toranoana-lab.hatenablog.com

P.S.

採用情報
■募集職種
yumenosora.co.jp

カジュアル面談も随時開催中です
■お申し込みはこちら!
news.toranoana.jp

■ToraLab.fmスタートしました!
メンバーによるPodcastを配信中!
是非スキマ時間に聞いて頂けると嬉しいです。
anchor.fm
■Twitterもフォローしてくださいね!
ツイッターでも随時情報発信をしています
twitter.com