Azure Cosmos DBを試してみた


背景的なこと

最近私の興味で、データの蓄積や活用について調べています。
データの蓄積と言えばデータベースですが、超ざっくり分類すると

  • RDB (Relaytional Database)
  • NoSQL (Not Only SQL)

に分かれるようです。
歴史が古く世の中のシェアで言えば圧倒的にRDBですが、それ以外の比較的新しいものがNoSQLという感じ(適当)。


NoSQLについて

NoSQLと言っても、またさらに色々種類はあります。

  • キーバリュー型
  • ワイドカラム型
  • ドキュメント型
  • グラフ型

それぞれ代表的なDBを当てはめるとこんな感じ。※Redisは少し異なるという見方あり

種類説明代表例
キーバリュー1つのキーに対して1つの値をとるRedis
ワイドカラム1つのキーに対して複数の列をとるCassandra
ドキュメントJSON形式のデータを格納できるMongoDB
グラフノード・エッジ・プロパティで関係性を表すNeo4j

各DBの特徴について詳細は割愛しますが…
これらはビッグデータにおけるRDBでは不得意なスケールアウトや、テーブル定義が困難な多様なデータの扱いなどに適しています。
今回はドキュメント型のDBを構成して、簡単にデータを参照するところまでやってみたいと思います。


Azure Cosmos DBでやってみた

さて私が触っていくのは、AzureのCosmos DBです。
PaaSなので基盤側の構成はほぼ何もいらないため、お試しで使うには手軽で良いと思いチョイスしました。

1. Cosmos DBアカウントの作成

Cosmos DBでは前述のすべての型(データモデル)に対応していますが、どの型で構成するかを決めます。
具体的には最初に「アカウント」を作成するのですが、この際にどの型のAPIを利用するかを選択します。

Azure Portalにログインし、[すべてのサービス] > [データベース] から"Azure Cosmos DB"を選びます。
今回は"コア (SQL)"でアカウントを作成していきます。そう、私でも少し知っているSQLが使えます。


作成の際に指定したパラメーターは下記の通り。
  • サブスクリプション
  • リソースグループ
  • 場所
  • アカウント名
  • 容量モード
  • ネットワーク接続
  • バックアップポリシー

"容量モード"については、"プロビジョニングされたスループット"と"サーバーレス"があるのですが、
無償利用枠を適用している関係で前者にしています。
両者の違いについて、詳しくは下記をご覧ください。

プロビジョニングされたスループットとサーバーレスのどちらかを選択する方法

"ネットワーク接続"については"パブリックエンドポイント"で設定、FW機能でAzure Portalと特定のIPアドレスからのみにアクセスを限定しています。

2. データベースの作成

次にデータベースを作成します。
ここでは下記のパラメーターを指定します。

  • データベースID(名)
  • データベーススループット
  • コンテナID(名)
  • インデックス
  • パーティションキー

"データベーススループット"は検証用途なので"手動"・"400RU/s"にしています。
"コンテナ"の概念ですが、RDBでいうテーブルみたいなものと解釈してもらえればよいです。


データベースとコンテナが一つ作成されました。
ちなみにコンテナは一つのデータベース配下に複数作成できます。

3. データの格納(アイテム作成)

続いてデータを格納していきます。
ドキュメント型なのでJSONフォーマットになります。
少量のサンプルデータなのでAzure Portalの [データ エクスプローラー] から、
先程作成したコンテナに"アイテム"を作成し、そちらに書き込みます。
作成するアイテムは3つ、データの内容はそれぞれ下記の通りです。


{
  "employee_id": 101,
  "fullname": "中川一郎",
  "hire_date": "2007-06-01",
  "skill_sets": {
    "os": ["WindowsServer", "RHEL", "CentOS", "Solaris", "ESXi", "ONTAP"],
    "application": ["ActiveDirectory", "SCCM", "MSSQL", "PostgreSQL", "Apache", "Bind"],
    "programming": ["Powershell", "VBS", "Bash", "Python"]
  }
}

{
  "employee_id": 102,
  "fullname": "鈴鹿まさる",
  "hire_date": "2009-04-01",
  "skill_sets": {
    "os": ["RHEL", "CentOS", "IOS", "Junos", "ESXi"],
    "application": ["Syslog", "MySQL", "Nginx", "Zabbix", "Docker"],
    "programming": ["Bash", "Python"]
  }
}

{
  "employee_id": 103,
  "fullname": "山形里美",
  "hire_date": "2009-04-01",
  "skill_sets": {
    "os": ["Windows", "CentOS"],
    "application":  ["MSSQL", "IIS", "Access", "Git"],
    "programming":  ["VBA", ".NET", "C#"]
  }
}
  

アイテムが作成できました。

4. データの参照

さて、ここまででひと通り準備ができましたのでデータを参照していきます。
折角なのでPostmanを使ってRESTでリクエストを投げてみたいと思います。
Postmanのセットアップや使い方については割愛しますが、下記を参考にさせていただきました。
Azure CosmosDB APIをたたいてみた
(メモ: Headersにて"x-ms-version"は"2018-12-31"、"x-ms-documentdb-query-enablecrosspartition"の有効化が必要)

ということでリクエストで肝心な箇所、BodyにSQLのクエリを埋め込みます。
内容(下記)は、"skill_sets" : "os"のキーに"WindowsServer"の値を持つIDと名前を検索するものです。


    SELECT
        e.employee_id,e.fullname,e.skill_sets.os
    FROM
        engineer e
    WHERE
        ARRAY_CONTAINS(e.skill_sets.os, "WindowsServer")

ではリクエストを送信します。


無事に応答が返り(画像下段)、期待通りの結果が得られました。


まとめ

NoSQLとはなんぞや、とCosmos DBを利用して触ってみましたが、
データベースとして自由度が高く、とても扱いやすい印象でした。
また試していないですが、JSONファイルをアイテムとしてそのままアップロードもできるようです。
今後はSynaps Analyticsといった分析系サービスへの連携も試してみたい思います。

それではこの辺で。

コメント

このブログの人気の投稿

ProxmoxでLet's Encryptを使用した証明書セットアップをやってみた

AIと共に「考える」エンジニアに!

ルーティングって何で必要で、何してるの?を React Routerで理解する