Swiftを使ってクラウドストレージサービスを構築する

 クラウドインフラストラクチャ構築ソフトウェアであるOpenStackには、クラウドストレージシステムを提供する「Swift」というコンポーネントが含まれている。Swiftを利用することで、自動レプリケーションや分散化といった機能を持つクラウドストレージサービスを構築することが可能だ。本記事ではこのSwiftが持つ機能を紹介するとともに、Swiftによるストレージサービスの構築手順を解説する。

クラウドストレージを自前で構築できる「Swift」

 「クラウド」という言葉は幅広いジャンルで使われているが、この名前を冠したものの1つに「クラウドストレージ」がある。クラウドストレージというのは、その名前が示すとおり、インターネット経由でアクセスできるデータの保存領域を提供するものだ。クラウドストレージでは保存するデータを「オブジェクト」と呼ぶことから、「オブジェクトストレージ(Object Storage)」などと呼ばれることもある。

 クラウドストレージが一般的なオンラインストレージサービスやNAS/SANと異なるのは、HTTPベースのREST方式でデータがやり取りされるという点と、格納したデータは複製されて複数のストレージサーバーに配置され、たとえストレージサーバーの一部が停止したとしてもデータが保護されるという点だ。高価な専用ハードウェアが不要で、一般的なサーバーとストレージの組み合わせだけで大容量かつ安全性の高いストレージサービスを構築できるというメリットもある。

 このようなクラウドストレージでもっとも有名なのが、Amazon.comが提供する「Amazon Web Services」の1つである「Amazon Simple Storage Service(Amazon S3)」だろう。Amazon S3は後続のサービスに大きな影響を与え、Amazon S3互換のAPIを提供しているクラウドストレージサービスは多い。また、Googleの「Google Cloud Storage」やMicrosoftの「Windows Azure」といったサービスも同様のクラウドストレージサービスを提供している。

 このようなクラウドストレージサービスを独自に構築するためのソフトウェアが、今回紹介する「Swift」である。Swiftは現在クラウドインフラストラクチャを構築するためのソフトウェア開発プロジェクト「OpenStack」の一部として開発が進められている。このようなストレージシステムについては安定性が重要であるが、Swiftは既存技術を組み合わせた構造になっており、また米国のホスティングサービス事業者Rackspaceによる商用サービス「Cloud Files」で使われていた技術をベースとしている。大規模なトラブルなどは今のところ報告されておらず、すでに十分実用段階にあるソフトウェアであると言える。

Swiftの構成

 Swiftではストレージや認証、管理といった機能がそれぞれ異なるサービスとして実装されている(表1)。また、これに加えてユーザー認証を行うための認証サービスが必要だ。

表1 Swiftを構成するサービス
サービス名説明
ProxyストレージにアクセスするためのAPIの提供や各サービスの管理を行う
Objectオブジェクトの管理を行う
Containerコンテナの管理を行う
Accountアカウントの管理を行う

 SwiftはOpenStackプロジェクトの一部として開発が進められているものの、ほかのコンポーネントとの関連性は低い。認証にはユーザー認証機能を提供するOpenStackの「Keystone」コンポーネントを使用できるが、基本的にそれ以外のコンポーネントへの依存性はなく、単独での環境構築が可能だ。

 また、これらのサービスを実行するホストは「ノード」と呼ばれる。一般的な構成としては、Proxyサービスを実行させる「プロクシノード」と、ObjectサービスおよびContainerサービス、Accountサービスを実行させる「ストレージノード」、そしてkeystoneを実行させる「認証ノード」を複数用意することが多い(図1)。

図1 Swiftの一般的な構成例
図1 Swiftの一般的な構成例

 すべてのサービスを1つのノード上で稼働させたり、認証ノードおよびプロクシノードとストレージノードそれぞれ1台のみを利用するといったシンプルな構成でもサービスの実現は可能だが、この場合オブジェクトの分散化は行われず、冗長性が確保されない。そのため、実運用環境においては最低でも5台のストレージノードを利用するのが推奨される。また、ストレージノードではオブジェクトの管理にファイルシステムが持つメタデータ機能を利用する。そのため、通常オブジェクト保存用のストレージには単独のパーティションもしくはストレージを用意し、そのファイルシステムにはXFSを使用する。Linuxで一般的なext3やext4はメタデータ機能をサポートしていないため、オブジェクト格納用のストレージとしては利用できない点には注意したい。

 なお、サービスを利用するクライアントはProxyサービスに向けてリクエストを送信し、ストレージノードに対するデータの読み書きはProxyサービスが実行する。そのため、ストレージノードは通常プロクシノードからのみアクセスできるプライベートネットワークに接続される。