勇者だって最初はひのきの棒とナベのふた

技術を中心に発信。時々SFの読書感想も。

CosmosDBのドキュメント読む その2

はじめに

masamoriです。 この記事は前回の続きです。

masamori0083.hatenablog.com

では、早速いってみましょう。
なお、僕はCosmosDBのエキスパートではなく、ただドキュメントを読んで理解したことを書くだけですので、間違っていたりしたら教えてください。スタンスとしては、CosmosDB初心者がドキュメント読んで仕組みを理解する過程を示す、というものです。

分散NoSQL

CosmosDBはただのNoSQLではありません。分散なんです。散らばってるんです。何かが。というわけで、分散NoSQLについてのドキュメント。

learn.microsoft.com

NoSQLとはなんでしょうか?ドキュメントには.

NoSQL データベース とは、コンカレンシー、待機時間、可用性のトレードオフを最小限に抑えるために一貫性を調整することで水平方向のスケーリングを簡略化するように設計されたデータベースを指します。

うーん淡白。水平方向のスケーリング(スケールアウト)に適したDBであると。では、なぜそのニーズが生まれたのでしょうか?
一般的にRDBはスケールアップは得意ですが、スケールアウトは不得意です。RDBはデータの整合性が高い操作が保証されます(厳格なACID)。その一方で、複数のサーバにデータを分割して保存する(シャーディング)をしようとすると、複雑になります。というよりRDBの場合は行列なので、列が増えるということはその分パラメータが増えてしまうことになります。よって、そもそもスケールアウトに適していない構造であると。
一方、KVSのようなNoSQLはデータの持ち方がkey:valueなので、複数のサーバーにデータ分散させやすいんですよね。この辺は直感的に理解できます。ただ、RDBで出来たような複雑なクエリは書けないです。(この辺はCosmosDBは解決しようとしています。).

では、分散とは?

分散データベースとは多くの異なるインスタンスまたは場所にまたがってスケーリングするデータベースを指します。 多くの NoSQL データベースはスケールを考慮して設計されていますが、必ずしもすべてが分散データベースであるとは限りません。 さらに、多くの NoSQL データベースは、ローカル冗長性のために冗長ノードに分散したり、geo冗長性のためにグローバルに分散したりするのに時間と労力を必要とします。 グローバル分散データベースの計画、実装、ネットワークの要件は複雑になる可能性があります。

これは分かりやすい。ただし

多くの NoSQL データベースは、ローカル冗長性のために冗長ノードに分散したり、geo冗長性のためにグローバルに分散したりするのに時間と労力を必要とします。

この部分がどうなんですかね。これは、オープンソースのKVSを使ってDBサーバを自前で構築した時の話なのだと思います。クラウドのマネージドサービスを使わないでデータを分散させようとしたら、そりゃ大変だろうなぁと思います。一方、クラウドベンダーが提供している分散型のNoSQLを使用すれば、その実装は自前でやることはないので確かに楽です。
ちなみに、AWSにはDynamoDBというNoSQLがありまして、「グローバルテーブル」という機能を使えば、データの地理的分散が可能になります。

docs.aws.amazon.com

いずれにせよ、分散NoSQLとは 「データを地理的に分散させて可用性・冗長性を保ちつつ、容易にスケールアウトできるデータベース」. であると言えそうです。

分散リレーショナル!?

続いてこちら.

learn.microsoft.com

一言で言えば、衝撃、ですね。今まで僕が書いたRDBとNoSQLの理解はなんだったんだろう。クラピカのエンペラータイム(ウヴォーギン撃退時)みたい。あとで、このチートは修正されることになります(暗黒大陸編)。
RDBとNoSQLの良いとこ取りをしてやろうじゃないかと。まぁ、自然な発想だと思います。
ただ、あるあるなのが一部のクエリに対応していなかったり、そもそも移行が面倒だったり、仕組みが複雑であると往々にしてそういうことが起こりえます。
これは次回試してみようと思います。

終わりに

今回のブログではここまでにしたいと思います。
次は分散リレーショナルを試して、その次にNoSQLのドキュメントに突入したいと思います。
ありがとうございました。