GoogleCloudのストレージサービスの違い

## はじめに
GoogleCloudには様々なストレージサービスがありますが
それぞれの特徴や理解して用途や要件に応じて使い分ける必要があります。
そこで以下の５つのストレージサービスについてまとめました。
- Cloud Storage
- Cloud SQL
- Cloud Spanner
- Firestore
- Cloud Bigtable

## Cloud Storage
### 特徴
- 開発者とIT組織に耐久性と可用性に優れた オブジェクトストレージを提供するサービス
- どんな容量のデータでも格納して必要に応じて何度でも取り出せる
- フルマネージドのスケーラブルなサービスで用途は多様
- Cloud Storageのストレージオブジェクトは不変で、編集されるのではなく変更のたびに新しいバージョンが作成される
- 管理者は 新バージョンで古いものを完全に上書きするか、バケット内でバージョン管理を有効にして
変更を追跡できるようにするか選べる
- バージョン管理を有効にすると Google Storageは詳細な変更履歴、つまりバケット内のすべてのオブジェクトの上書きや削除の履歴を残す
- バージョン管理が無効であると古いバージョンが常に新しいバージョンで上書きされる
- Cloud StorageはGoogle Cloudのプロダクトやサービスと統合されているので、データをサービスに移す方法は他にもいつくもあり、
たとえばBigQueryやCloud SQLとの間でテーブルをインポート/エクスポートできる
- App EngineログやFirestoreバックアップ、App Engineアプリで使われる画像などのオブジェクトも格納できる
- インスタンスの起動スクリプトやCompute Engineイメージ、Compute Engineアプリのオブジェクトも格納できる
- 大きな画像や動画など10MB以上の不変BLOBを格納する必要がある場合に適している

#### 用途によって費用を抑えるための4つのストレージクラス
##### Standard Storage
利用頻度の高い、いわゆるホットデータに最適
##### Nearline Storage
月に１回程度しかアクセスしない 利用頻度の低いデータの保存に最適。
たとえばデータのバックアップ ロングテールのマルチメディアコンテンツ データのアーカイブなど。
##### Coldline Storage
利用頻度の低いデータを低コストで保存できる。
Nearline Storageと違い、Coldline Storageは90日に１回程度の利用頻度に向いている。
##### Archive Storage
最も低コストのオプションでデータのアーカイブ、オンラインバックアップ、障害復旧に最適。
年に１回アクセスするかどうかというデータに向いている。
データへのアクセスと処理にかかるコストが比較的高く365日の最低保管期間があるため。

## Cloud SQL
### 特徴
- フルマネージド リレーショナルデータベースで MySQL、PostgreSQL SQL Serverなどを利用できる
- パッチや更新の適用やバックアップの管理、レプリケーションの構成などから解放されるので優れたアプリの開発に専念できる。
- Cloud SQLのプライマリインスタンス、外部プライマリインスタンス、外部MySQLインスタンスなどからの自動レプリケーションをサポートしている
- マネージドバックアップ対応なのでバックアップデータは安全に保管され、復元が必要なときにアクセスできる
- 他のGoogle Cloudサービスや外部サービスからも アクセスできる
- JavaのConnector/Jや PythonのMySQLdbなどの 標準的なドライバーを使って App Engineと連携できる
- Compute Engineインスタンスから Cloud SQLインスタンスにアクセスしたり Cloud SQLインスタンスを VMと同じゾーン内に構成したりできる
- オンライントランザクション処理にSQLの完全サポートが必要な場合に適している
- ウェブフレームワークや既存アプリでの認証情報や顧客の注文情報などの格納に最適

## Cloud Spanner
### 特徴
- フルマネージドのリレーショナルデータベースサービス
- 水平スケーリング可能
- 強整合性
- SQL対応

##### 次のような要件のある用途に向いている
- テーブル結合とセカンダリインデックスを使う
- SQL
- RDB管理システム
- 組み込みの高可用性
- 高度なグローバル整合性
- ２テラバイトを超えるデータベース
- 膨大な数の１秒あたりの入力/出力処理（１秒あたり数万回以上の 読み取りと書き込みがある場合）
- オンライントランザクション処理にSQLの完全サポートが必要な場合
- リードレプリカだけでなく、水平スケーリングが必要でCloud SQLが要件に合わない場合
- ２TBを超える大規模データベースアプリケーション

## Firestore
### 特徴
- 柔軟性が高く、水平スケーリング可能なNoSQLクラウドデータベース
- モバイル、ウェブ、サーバー開発に適している
- データはドキュメントに保存されコレクションに整理される
- FirestoreのNoSQLクエリを使って個別に特定のドキュメントを取得したり、クエリに一致するコレクション内の全ドキュメントを取得したりできる
- 既定でインデックス化されるので、クエリのパフォーマンスはデータセットではなく 結果セットのサイズに比例する
- データ同期を使って接続デバイスのデータを更新する
- アプリが使用するデータがキャッシュされるので、デバイスがオフラインでもデータの読み取りと書き込み、リッスン クエリができる
- デバイスがオンラインに戻るとローカルでの変更がFirestoreに同期される
- 大規模スケーリングと予測可能性に加え、リアルタイム/オフラインのクエリが必要な場合に最適
- モバイル/ウェブアプリでのデータの格納、同期、クエリに最適

## Cloud Bigtable
### 特徴
- ビッグデータ用のNoSQLデータベースサービス
- 検索、アナリティクス、マップ、Gmailなど、Googleの多くのコアサービスを支えるデータベース
- 膨大なワークロードを一貫して低遅延、高スループットで処理できる
- 運用目的でも分析目的でも威力を発揮し、IoT、ユーザー分析、金融データ分析などに活用できる
- データは各種ストリーミング処理フレームワーク（Dataflow、Spark Streaming、Stormなど）でストリーミングできる
- 読み書きイベントが多発する分析データ、たとえばアドテック、金融、IoTデータに最適

##### Bigtableを選ぶべきケース
- １テラバイトを超える 半構造化/構造化データを扱う場合
- データが高スループットで高速移動 または急速に変化する場合
- NoSQLデータを扱う場合（強いリレーショナルセマンティクスが不要なトランザクション）
- データが時系列または自然意味論的な順序の場合
- ビッグデータを扱っていて、データに非同期バッチまたはリアルタイム同期処理を行う場合
- 機械学習アルゴリズムをデータに適用する場合

## おわりに
GoogleCloudの主なストレージサービスについてまとめましたが、いかがだったでしょうか。
用途によってはこれらのサービスを複数組み合わせることも可能です。
詳しくは公式ドキュメントを参照ください。