Windows Azure Storage: A Highly Available Cloud Storage Service with Strong Consistency

June 12, 2021

AzureのクラウドストレージサービスWindows Azure Storage(WAS) は、2008年の11月から本番運用されている。 保存できるデータの形式には、単なるファイル(Blob)だけでなく、テーブルのレコードとキューのメッセージがある。 ハードウェアの故障に備えたローカルでのレプリケーションだけでなく、地理的に離れたデータセンタにもレプリケーションを分散し、災害復旧にも備える。

WASは、大きくstroage stampとlocation serviceからなる。 下にstorage stampとlocation serviceのアーキテクチャを図示する。 storage stampはストレージノードを積んだラックからなるクラスタであり、典型的なクラスタは18のノードを積んだ10から20個のラックである。 location serivceは、アカウントのデータがどのstorage stampに保存されているかを管理する。 新しいアカウントを作成するときは、アカウントのIDを含んだURLからstorage stampのVIPを解決するようにDNSを更新する。 high level architecture

storage stampはstream Layer, partition layer, front-endsの3層からなる。 stream Layerは、storage stamp内でファイルを分散、複製するための分散ファイルシステムとみなすことができる。 stream layerは、高可用性を担う層であり、データの種類がオブジェクト、テーブル、キューのいずれであるかを意識せずにデータを保存、提供する。 partition layerは、stream layerと同じノードにあり、stream layerに保存されたデータの種類を解釈できる。また、トランザクションの順序を管理し、データの一貫性を守る。 front-endsはステートレスなサーバからなり、リクエストの認証と認可を担う。 Stream layerはリクエストの処理中に同期的にstorage stamp内部にレプリケーションを作成し、ハードウェアの耐障害性を高める。 Parition layerは、リクエストの処理とは非同期に、storage stamp横断のレプリケーションを作成し、災害復旧に備える。

Stream Layerのstreamは、extentとよばれる大きなデータの順序つきリストを意味する。 extentへの書き込みは追記しかできず、更新はできない。 下に、4つのextentからなるstreamを例示する。 stream 図中のBはblockとよばれる読み込みと追記の最小単位であり、サイズは4MB程度である。extentは連結したblockからなる。 blockのサイズはblockごとに違ってよい。 Extentはレプリケーションの単位であり、デフォルトでは1つのstorage stampの中に3つのレプリカを作る。 extentの大きさは1GBであり、それより大きなデータを保存するときは、データを分割して、複数のextentにデータを保存する。 streamはextentを参照するポインタの順序付きリストであり、既存のstreamを連結することで新しいstreamが作られる。 追記ができるextentはstreamの末尾のものに限られる。

Stream layerはstream manager(SM)とextent node(EN)からなる。 Stream layerのアーキテクチャを以下に図示する。 stream_layer SMは、新しいextentを作り、ENに割りあてる。 割り当てた後も、アクティブなextentやstreamを管理し、どのstreamからも参照されていないextentを回収する。 SMの処理は、クライアントのリクエストの処理とは非同期であり、クリティカルパス上にはない。 一方、ENは複数のディスクをもち、extentの別々のディスクにレプリカを保存する。 ENはextentとblockを管理し、これらがどのstreamに属するかを知ることはない。

Stream layerがレプリケーションで高可用性を支えるのに対し、parititon layerは一貫性を支える。 Partiton layerは下図のようにpartition manager(PM)とpartition server(PS)からなる。 partition_layer Partiton layerはobject table(OT)というデータ構造を構成し、streamに保存された単なるデータを、ユーザからはBlobやテーブル、キューのように見えるようにする。 OTは、ペタバイト級のサイズであるため、OTの連続するレコードの集合であるRangePartitionに分割して管理される。 PMはOTをrange partitionとよばれる単位に分割し、各range partitionが常に1つのアクティブなPSに割り当てられ、range partitionが重複しないことを保証する。 保証にはlock serivceを使い、Paxosによって合意されたPMのリーダが選出される。

論文をこちらからダウンロードできます。 図は論文から引用されています。