はじめに
masamoriです。
MSのBuildが終わり、色んなサービスのアップデートが発表されましたね。
サクッとキャッチアップしたい方は、お馴染み「ブチザッキ」を見ましょう。
Cosmos DBに関しては、vector searchがきましたね。
今までAzureでLLMを使用したRAGを構築するには、ベクトル検索にAzure AI Searchの使用が必須でした。これからはAzure AI Searchを使用しなくても、Cosomos DB単体でベクトル検索のアーキテクト構築が可能になりそうです。
まだ自分で構築してないんで、この辺はワークショップとか待ちますかね。
構築の前段階で、CosmosDBについて理解を深めることが個人的には先かなと思ってます。
ある程度知識を入れておかないと、ワークショップ行っても写経になっちゃうんで損です。
というより、Cosmos DBについて全然分かってないので、今日もコツコツとドキュメント読みます。
前回は分散リレーショナルについて書きました。
今日はNoSQLのドキュメントを見てみましょう。
NoSQL
Azure Cosmos DB for NoSQLのドキュメントはこちら.
概要・クイックスタート・チュートリアル・サンプルは飛ばします。この辺はドキュメント通りにやれば組めるはず。
Cosmos DBの仕組み
Cosmos DBがどのようにデータを格納しているのか表現している図があります。
.
階層としては、DB Account > Databases > Container となっています。さらに、Containerの下にitems項目があり、NoSQLを使用する場合ここにデータが格納されます。まずはこれが基本。で、Containerは使用するAPIによってtableになったりgraphになったりするわけですね。それに伴って、itemの構造も変わってくると。
さて、ドキュメントにこのような文章があります。
データは、"パーティション" と呼ばれる 1 つ以上のサーバーに格納されます。 パーティションを増やすには、スループットを向上させます。あるいは、ストレージを増加すると、パーティションは自動的に増加します。 このリレーションシップにより、事実上無制限のスループットとストレージがコンテナーに提供されます。
コンテナーを作成するときに、パーティション キーを指定する必要があります。 パーティション キーは、Azure Cosmos DB がパーティション間でデータを効率的に分散するのに役立つ、項目から選択するプロパティです。 Azure Cosmos DB は、このプロパティの値を使用して、書き込み、更新、削除が行われる適切なパーティションへのデータのルーティングを行います。 また、パーティション キーは、データを効率的に取得するため、クエリの WHERE 句でも使用できます。
パーティションって何?
パーティション
普通に考えると、「仕切り」のようなイメージですね。Cosmos DBのパーティションには「物理パーティション」と「論理パーティション」の二つがあります。上の文言のパーティションとは物理パーティションの説明に近いのかなと思います。このパーティションの設定に、検索の効率が依存します。ただし、物理パーティションに関しては以下の注意書きがドキュメントに載っています。
物理パーティションはシステムの内部実装であり、完全に Azure Cosmos DB によって管理されます。 物理パーティションは制御できないため、ソリューションを開発するときは物理パーティションには重点を置かないでください。 代わりに、パーティション キーに重点を置いてください。 論理パーティション間でスループットの消費が均等に分散されるパーティション キーを選択すると、物理パーティション間でのスループットが確実に均等に消費されます。
物理パーティションについては、開発者は気にする必要はないと。まぁ、PaaSですしね。専ら論理パーティションの設計に集中すれば良さそうです。というわけで、論理パーティションについて調べましょう。 ちなみに、物理パーティションに関するドキュメントはこちら.
論理パーティション
NoSQLの場合、ログなどのデータをガンガン溜め込むというイメージがあります。セッションデータとかね。この時って、パーティションキーは設定するのかなぁ。。
Cosmos DBではパーティションキーなるものを設定できます。これは物理サーバー内の部屋割りみたいなもんだと思います。
例えば、3階建てぐらいのでかい倉庫が存在するとして、それを1つ丸々部屋として使うか、それとも外側に階段を作って、各階に部屋を4つぐらい作るか。この倉庫に当たるものが物理パーティションで、部屋にあたるものが論理パーティションという理解を僕はしています。この倉庫に何かを収納するとします。一つの部屋しか作らなかった時、収納をどこにしようか考える必要はありません。でも、後でそれを使用したいとき、倉庫の中を探すのは大変です。だって、一部屋が広いから。それに対して、各階に部屋を作って、それぞれの部屋に収納する種類のインデックスをつけてあげます。例えば、101号室は家電、102号室はペット用品、103号室はキッチン用品などなど。そうすると、後から収納したものを探したいときに便利です。キッチン用品取ってきてー、って上司から言われたとして、103号室に行けばいいわけです。まぁ、こういう至極当たり前の作りに真っ向から反抗している倉庫の作りを考えたのがAmazonなんですけどね。
とにかく、パーティションキーはこの部屋番号にあたり、そのパーティションキーの中に入っているもの全てが同一のパーティションキーの下で管理されます。当たり前ですね。そして、パーティションキー配下のデータにはパーティションキーの中で一意のインデックスが割り振られます。
ちなみに、論理パーティションの作成数に制限はありません。物理パーティションが許す限り作れます。ただし、一つのパーティションには20GBという制約があります。また、論理パーティションをどの物理パーティションに配置するかは考えなくていいです。これもCosmos DBの内部でよしなにやってくれます。PaaS最高。
終わりに.
今回はここまでにします。次回は実際に論理パーティションを作成してみて、クエリ叩いたりして動作確認したいと思います。なお、物理パーティションについてはまたまたお馴染み「シバやん雑記」で詳しく扱っています。