Azureのデータベースサービスまとめ

# はじめに

Azureについて勉強しているのですが、一口にデータベースと言ってもかなりの種類があるし、サービス毎のドキュメントを個別に読んでいてもよく分からないし、どういうときにどれを使えばいいのか判断に困ります。ということで、一旦Azureのデータベース系サービスについてそれぞれの特徴をまとめてみて、概観を把握しようというモチベーションで記事を書いています。~~（本当はDP-200とDP-201のお勉強のためです）~~

データベース系サービスのまとめと銘打っていますが、広く捉えてストレージ系などを含むデータを格納するサービス全般にまで食指を広げてまとめます。「データソース」の調査と言えば正確かもしれません。

勉強を兼ねたサーベイなので、勉強して知見の更新があった場合は随時更新していきます。もし内容に間違いがあった場合は、コメントや編集リクエストなどでご指摘頂ければ幸いです。

# Azureとは

Microsoftが提供するパブリッククラウドサービスです。業界シェア1位のAWSに対して業界シェア2位なんですが、エンジニア界隈での使用率はAWSが圧倒的で、あまり高くないような印象を受けます。しかしよくよく事例を調べてみると大企業を中心に利用が進んでいるようで、あまり表に見えていない（主観）だけで確実に大規模ワークロードを支えるパブリッククラウドの一角を担っていることが分かります。

## データベースサービスの種類[^1]

- Azure CosmosDB
- Azure SQL Database
- Azure SQL Database Managed Instance
- Azure Database for MySQL
- Azure Database for PostgreSQL
- SQL Server on Virtual Machines
- Azure Synapse Analytics
- Azure Cache for Redis
- Azure Database for MariaDB

上記のデータベース系サービス以外にストレージサービスがあります。

- Azure Storage[^2]
    - Azure Blob Storage
        - Azure Data Lake Storage Gen2
    - Azure Files
    - Azure ディスク
    - Azure キュー
    - Azure テーブル(※)

※Azure Storageプラットフォームのサービスと位置付けられていますが、性質上DBと言えそうです。

# サービス毎の特徴

## Azure CosmosDB[^3]

Azureの基本的なデータベースサービスのうち、NoSQL枠です。

グローバル分散、常時接続、スケーラビリティ、可用性あたりが特徴のようで、大規模なデータの取り扱いを様々なAPI越しに取り扱うことが可能になっている、まさにNoSQLといったサービスです。

RU/秒（リクエスト単位毎秒）という要素があり、性能と費用は概ねこの要素によって決まっています。RU/秒を大きくすれば性能は上がる分コストもかさみ、逆に小さくすれば性能は下がるもののコストも下がるというように、調整が効きます。ただし事前にどの程度のRU/秒が必要かは見積もっておく必要があります。正しく展開できれば10ミリ秒未満の応答時間も実現できるようで、大規模なサービスの裏で動くDBとしても十分なポテンシャルを備えています。

RU/秒で事前に性能を決定しておくとなると比較的安定的に負荷が推移する用途に限られ、オンデマンドキャパシティモードを有する競合のAWS DynamoDBに劣ると思っていたのですが、現在はプレビューで性能を動的に変更する「オートパイロットでのプロビジョニングスループットの自動構成」というオプションも用意されているようです。要するに自動で性能調整してお金を払うプランで、DynamoDBを意識している様子が伺えます。

## Azure SQL Database[^4.1]

Azureの基本的なデータベースサービスのうち、RDB枠です。

ドキュメントを読んでも正直理解しきれていません。サービスの提供形態や種類など、恐ろしく複雑なサービスですが、その分あらゆる用途にフィットするサービスと言い換えることもできそうです。

### Azure SQL Server

最大の混乱の種、Azure SQL Serverについて先に記述しておきたいと思います。Microsoft SQL ServerというサーバーにインストールするタイプのRDBMSがありますが、Azure SQL ServerはそれをインストールしたVM __ではなく__ 、SQL Databaseで作成したデータベース（後述する「単一データベース」）が所属する論理的なサーバーという位置づけのようです。実際にリソースを持っているのはAzure SQL Databaseで作られたデータベースの方で、Azure SQL Serverの方は特に明示的にリソースを確保するわけではない（論理サーバー）ようです[^4.2]。データベースがActiveDirectoryの「ユーザー」だとすれば、Azure SQL Serverは「（ユーザー）グループ」のような位置づけといったところでしょうか。

Azure SQL Serverはログイン管理やアクセス制御を担っています。Azure SQL Serverで設定した内容が所属する各データベースにも反映されます。

### 単一データベース

Azure SQL Databaseの最も基本的なスタイルで、1つのデータベースに対して1種類の計算リソースが割り当てられています。

### エラスティックプール

プールという単位で定義された計算リソースを、複数のデータベースで共有するスタイルです。プールとデータベースの所属先であるAzure SQL Serverによって提供される論理サーバーは別物で、ある共通のプールを共有するデータベースがそれぞれ別の論理サーバーに所属することも可能なようです。

## Azure SQL Database Managed Instance[^5]

Azure SQL Database Managed Instanceは名前だけ見ると今度こそMicrosoft SQL ServerをインストールしたIaaSなのかと思いがちですが、これもデータベースを提供するPaaSです。

Azure SQL Databaseでは、単一データベースであればデータベース1つに対して1つの計算リソースが割り当てられ、Azure SQL Serverという論理サーバーにデータベースが所属する形を取っていました。それに対しAzure SQL Database Managed Instanceでは、インスタンスに計算リソースが割り当てられ、その内部にデータベースを作るという形になります。

個別のデータベースからAzure SQL Serverという複数のデータベースを管理するまとまりに計算リソースが移ったような構成となっています。そういう意味ではエラスティックプールに似ているようにも見えますが、こちらはデータベースを管理するまとまり部分と計算リソースとデータベースが全て紐づいており、より強固になっています。全体的に半IaaS半PaaSといった趣で、オンプレミス環境からの移行用途といったところでしょうか。

## Azure Database for MySQL[^6]

フルマネージドなMySQLを提供するサービスです。スケーリングや自動バックアップ等、単に保守を丸投げする以上に色々と「マネージ」してくれる点が売りのサービスのようです。

提供されるMySQLはOSSのコミュニティエディションとなっており、当然RDBの1種ということになります。スケーリングに対応するなど、クラウドらしい機能は揃っています。

課金はクラウドで仮想マシンを立てるようにある程度決まった計算リソースを選択し、それに応じたコストが課金されるようです。

## Azure Database for PostgreSQL[^7.1]

フルマネージドなPostgreSQLを提供するサービスです。Azure Database for MySQLのPostgreSQL版といった趣の「単一サーバー」という提供形態の他、「Hyperscale」という提供形態が用意されています。

HyperscaleはCitusが提供する機能拡張により、数百のノードを備えたクラスタをバックエンドとするデータベースを展開するサービスで、可用性や性能が要請される用途に向きそうです。

その他Azure Arc（Kubernetesクラスターの管理などを提供する、オンプレミス、エッジ、マルチクラウド全体に跨るサービス）[^7.2]にも対応するとあり、他のOSS系マネージドサービスと比べるとかなり優遇されている印象を受けます。

## SQL Server on Virtual Machines[^8]

今度こそ満を持してのMicrosoft SQL Serverを仮想マシンにインストールしたタイプのサービスです。IaaSの一種で、ハードウェア部分以外は全て自己管理が必要です。インストールされているWindowsやSQL Serverへの更新を自動化するサービスなどが付与されています。

## Azure Synapse Analytics[^9]

Azure Synapse Analyticsは、Azure SQL Data Warehouseとして提供されていたビッグデータ向けデータベースサービスを基に、データの整形を担うAzure Data FactoryやHadoopやSparkによる分析を担うAzure HD Insight、対話的に分析を行うJupyter Notebookのようなサービス等が統合されたビッグデータ向けの統合サービスです。

Azureで提供されているデータソースの大半からデータを引っ張ることができ、データに関するあらゆる作業を1つのインターフェース（Studio）で完結させようとしている点が印象的です。

ストレージとコンピューティングノードが分離していることで、性能が必要になった場合にすぐにコンピューティングノードを増やせることも特徴の1つです。

Google CloudのBigQueryと競合する位置づけで、大規模なデータを高速に処理して活用することに重きが置かれているようです。

Azure SQL Databaseとの使い分けですが、超大規模データ（100TBオーバー）を取り扱っているか、それなりに大規模なデータを扱っていてクエリに対して高速な応答が必要な場合にはAzure Synapse Analyticsが向いていそうです。

## Azure Cache for Redis[^10]

フルマネージドなRedisを提供するサービスです。

名前にも表れていますが、Redisの性質上キャッシュとして利用することを想定しているようです。

## Azure Database for MariaDB[^11]

フルマネージドなMariaDBを提供するサービスです。例によって自動バックアップやパッチの自動適用、スケーリング等が提供されます。

## Azure Storage[^12]

後述するそれぞれ特徴的なストレージサービスから構成される、Azureのストレージサービスです。

Azure Storageは明示的でなくともデータベース系サービスのバックアップやデータの実際の保存先として利用されているようです。

### Azure Blob Storage[^12.1]

Azure Blob Storageは、非構造化データの大量に格納することに向く安価なオブジェクトストレージです。

普段手元のコンピューターでデータを取り扱うときはディレクトリの階層構造中にファイルという形でデータを保存しますが、オブジェクトストレージにはディレクトリに相当する多重階層構造が存在せず、データは一意なキー（ファイル名に相当）を与えられたオブジェクトとして保存されます。Azure Blob Storageではこのオブジェクトデータを"BLOB"と称しているようです。

/をつかったキーとBlobを読み込む補助ソフトウェアでディレクトリ構造っぽく取り扱うこともできますが、実際にディレクトリが生じているわけではなく単に/を含む名前のBLOBという扱いとなっています。

"多重"階層構造が存在しないとは言いましたが、"コンテナー"というBLOBを保存するまとまりが存在します。全体感としては、最上位構造であるストレージアカウントの中に任意の数のコンテナーが存在し、各コンテナー内部に任意の数のBLOBが存在するというイメージのようです。

Azure Blob Storageの特徴の1つは極めて高度な可用性です。最も強力な冗長化オプションであるgeo冗長ストレージ（2リージョンにまたがる冗長化）では99.99999999999999%（シックスティーナイン）以上の持続性（可用性とは違う？）が提供されるようです。

画像や映像データを保存したり、ログを格納したり、バックアップを保存したりと用途はかなり幅広く、サービスを運用する上で生じてくる諸々の雑多なデータを保存するならとりあえずAzure Blob Storageということになりそうです。一方クエリを使うことができないので、クエリを使う必要がある場合はAzure Data Lake Storage Gen2の出番となります。

#### Azure Data Lake Storage Gen2[^12.2]

Azure Blob Storageをベースに、ディレクトリ構造（多重階層構造）、セキュリティ等の機能が追加されたビッグデータ分析向きのサービスです。

Hadoop互換のアクセス機能により、Azure HDInsight、Azure Databricks、Azure Synapse Analyticsからのアクセス可能となっているようで、強力な分析基盤との連携機能が強化されています。元がAzure Blob Storageということもあって、ストレージコストもかなり低く、その名の通りデータレイクに向いていると言えそうです。

### Azure Files[^12.3]

Azure FilesはSMBでアクセス可能なディレクトリ構造を持つフルマネージドストレージです。NASのクラウド版といったところでしょうか。実際にNASのような使い方をしている事例[^12.4]も見かけました。

SMBに対応しているので、まずはデータだけクラウドに上げてサーバーはオンプレミス環境を維持するハイブリッド環境から始めて、オンプレミス環境のサーバーをVirtual Machinesに移行する「リフト」までカバーできるようです。

### Azure ディスク[^12.5]

Azure マネージドディスクという記述とAzure ディスクという記述が混在しているようですが、いずれにせよAzure Virtual Machinesで使うフルマネージドな記憶域ボリューム（要するにSSDとかHDD）です。ディスクは仮想化されているので実際に1つのディスクを用意したところで1つの物理的なディスクが割り当てられるというわけではありません。

99.999%の可用性を備えるよう設計されている点が特徴で、オンプレミスのディスク故障率を考えるとまさしくこれぞクラウドといった利点を持つサービスです。

### Azure キュー[^12.6]

Azure キューは、メッセージを格納するためのストレージサービスです。メッセージというのはメール等の人間がやり取りする文章ではなく、システム間でやり取りされる情報を指します。

負荷の平準化や非同期処理を実現するために使うことがあります。マイクロサービスの文脈では比較的よく聞く話かなと思います。

メッセージのサイズは最大64KBで、保存期限は既定では7日ですが設定すればどれだけでも保持することができます。

### Azure テーブル[^12.7]

Azure テーブルは、構造化データを格納するストレージサービスで、その性質上データベースに分類されるものと言えそうです。

最上位構造であるストレージアカウントの内部にテーブルがあり、テーブル内には任意の数のエンティティ（データ）を収めることができます。

クエリ実行も可能で、機能を見る限りは性能をあまり重視していないCosmosDBのような印象を受けます。


[^1]: https://azure.microsoft.com/ja-jp/product-categories/databases/
[^2]: https://docs.microsoft.com/ja-jp/azure/storage/common/storage-introduction?toc=/azure/storage/blobs/toc.json
[^3]: https://docs.microsoft.com/ja-jp/azure/cosmos-db/introduction
[^4.1]: https://docs.microsoft.com/ja-jp/azure/sql-database/
[^4.2]: https://www.atmarkit.co.jp/ait/articles/1904/12/news010.html
[^4.3]: https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-technical-overview
[^5]: https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-managed-instance-quickstart-guide
[^6]: https://docs.microsoft.com/ja-jp/azure/mysql/
[^7.1]: https://docs.microsoft.com/ja-jp/azure/postgresql/
[^7.2]: https://azure.microsoft.com/ja-jp/services/azure-arc/
[^8]: https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/sql/virtual-machines-windows-sql-server-iaas-overview
[^9]: https://docs.microsoft.com/ja-jp/azure/synapse-analytics/sql-data-warehouse/
[^10]: https://azure.microsoft.com/ja-jp/services/cache/#getting-started
[^11]: https://docs.microsoft.com/ja-jp/azure/mariadb/
[^12]: https://azure.microsoft.com/ja-jp/services/storage/
[^12.1]: https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-blobs-overview
[^12.2]: https://docs.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-introduction?toc=/azure/storage/blobs/toc.json
[^12.3]: https://docs.microsoft.com/ja-jp/azure/storage/files/storage-files-introduction
[^12.4]: https://azure-recipe.kc-cloud.jp/2015/08/azure-files-for-windows/
[^12.5]: https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/managed-disks-overview
[^12.6]: https://docs.microsoft.com/ja-jp/azure/storage/queues/storage-queues-introduction
[^12.7]: https://docs.microsoft.com/ja-jp/azure/cosmos-db/table-storage-overview

[^13]: https://docs.microsoft.com/ja-jp/learn/modules/choose-storage-approach-in-azure/5-choose-the-right-azure-service-for-your-data