📂
Azure Blob StorageのBlobの種類を確認
概要
ローカルPCやオンプレサーバのファイルしか触ったことがなく、クラウドやデータベースで用いられる「BLOB」という概念に馴染みがなくちゃんと調べてみようと思いました。そもそもBLOB Storageという言葉を使ってファイルと違うことを意識させるネーミングになっているのはAzureだけで、BLOBを扱っていてもAWSやGoogle Cloudではそうはなっていないんですね。
そもそもBLOBとは
「Binary Large OBject」の略で、その名の通り大量のバイナリデータを格納するためのストレージ単位となるオブジェクトです。頭文字を拾った略称なので全部大文字で書くべきな気がしますがサービス名も公式ドキュメントも表記がブレているのでどっちでもよさそうです(ブログ内で表記ブレがあっても許してもらうための保険です)。
一般的に画像・音声・ビデオ・文書・プログラムなど、サイズが大きく構造化されていないデータを扱います。
ファイルとBLOB、何が違う?
上記からわかるように基本的に扱う対象自体は変わらないと思って問題ないと思います。
用途など色々と違うところはありますが、気になった2点についてまとめます。
-
保存形式
- ファイルは拡張子ごとに人間や特定のプログラムにとって読みやすい形式で保存されており、インタラクティブな操作に適しています。
- BLOBはデータベース管理システムやクラウドストレージサービス等で扱うという性質上、データ転送やバックアップ、可用性などの観点に最適化するためバイナリ化して保存しています。プログラム上でBLOBを読み込んだ場合バイナリ化されているため、中身がただのテキストデータであってもデコードしなければ人間には読めません。
-
管理構造
- ファイルはディレクトリ構造に従って階層的に管理され、パスとファイル名を使ってアクセスします。PCを一度でも触ったことがあれば説明不要かと思います。
- BLOBはフラットな構造で管理されコンテナやバケットといった箱にオブジェクトとして保存され、キーや識別子でアクセスします。
Blobの種類
本題です。
Block BLOB
- 用途: テキストやバイナリデータの保存に最適。画像、ビデオ、文書、バックアップファイルなどの大きなファイルの保存に広く利用されます。通常のファイルをクラウドにアップロードして使う場合はブロックBLOBを使うことが多いと思います。
- 構造: ブロックBLOBは、複数のブロックで構成されています。各ブロックは個別にアップロードされ、識別子を持っています。ブロックBLOBのコンテンツをアップロード、削除、または変更する際には、これらのブロックを操作します。
- 特徴: 単一のブロックBLOBのサイズは最大190.7 TiBです。各ブロックは最大4000 MiBまでのサイズで、Blobのサイズはブロックの数によって制限されます。
Append BLOB
- 用途: ログファイルや監査ファイルなど、データが追加される一方で変更されないシナリオに適しています。
- 構造: 追加BLOBはブロックBLOBと似ていますが、データはBLOBの末尾にのみ追加されます。既存のブロックは変更や削除ができません。
- 特徴: 追加BLOBのサイズも最大190.7 TiBです。書き込み操作は追加のみ許可され、高いスループットを提供します。
Page BLOB
- 用途: ランダムな読み書き操作が必要なデータ、例えば仮想マシンのVHDファイルやデータベースファイルなどに適しています。効率的なアクセスが可能ですが高度な設計が必要なため、Azure VMなどのサービスが内部で使用する以外の通常ユースケースで自前で設計して使うことは少ないと思います。
- 構造: ページBLOBは512バイトのページで構成されます。ページBLOBの任意のページにランダムアクセスが可能で、ページごとに読み書きができます。
- 特徴: ページBLOBのサイズは最大8 TiBです。特定の範囲のデータを効率的に読み書きできるため、高パフォーマンスが要求されるアプリケーションに向いています。
PythonでBLOBの種類を確認する
check_blob_type.py
from azure.storage.blob import BlobServiceClient
connect_string = "<ストレージアカウントの接続文字列>"
container_name = "<コンテナ名>"
blob_name = "<BLOB名>"
blob_service_client = BlobServiceClient.from_connection_string(connect_string)
container_client = blob_service_client.get_container_client(container_name)
blob_client = container_client.get_blob_client(blob_name)
properties = blob_client.get_blob_properties()
print(properties.blob_type)
# 出力
>>> BlobType.BLOCKBLOB # or BlobType.APPENDBLOB, BlobType.PAGEBLOB
参考
おわりに
現状自分ではBlock BLOBしか使う機会がありませんが、必要に迫られれば他の種類のBLOBも扱えるようにユースケースや利点の確認をしました。Azure BLOB Storageと同じくBLOBを扱うAzure Data Lake Storage Gen2についてもまた書こうと思います。
Discussion