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

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

 それでは、Swiftを使って実際にクラウドストレージサービスを構築する手順について解説していこう。以下ではサーバーとして「さくらの専用サーバ」サービスで提供される専用サーバーを使用する。これらのネットワーク構成は図2のとおりとなっている。

図2 今回使用するネットワーク構成
図2 今回使用するネットワーク構成

 OS環境としてはRet Hat Enterprise Linux(EPEL) 6.3互換のCentOS 6.3(64ビット版)を使用している。CentOS 6.3のパッケージリポジトリにはOpenStack関連のパッケージが含まれていないため、SwiftのインストールにはFedoraプロジェクトが公開しているパッケージリポジトリ「EPEL(Extra Packages for Enterprise Linux)」に含まれるパッケージを利用する。

 また、今回は認証サービスとしてOpenStackのKeystoneを使用する。Keystoneのインストールや設定については「さくらの専用サーバとOpenStackで作るプライベートクラウド」記事で詳しく解説しているので、そちらを参照してほしい。

keystoneへの登録

 SwiftではKeystoneを使ってユーザー認証を行うため、KeystoneのデータベースにSwift関連の設定を追加しておく必要がある。まずはKeystoneサービスを稼働させているホスト上で以下のスクリプトを実行してアカウントを追加しておく。

export SERVICE_TOKEN=<keystoneで設定したアクセストークン>
export SERVICE_ENDPOINT=http://localhost:35357/v2.0/

SWIFT_PROXY_HOST_PUB=<プロクシノードのパブリックネットワーク側ホスト名>
SWIFT_PROXY_HOST_INT=<プロクシノードのプライベートネットワーク側ホスト名>
TENANT_NAME=<サービス用のテナント名>
PASSWORD=<swift用ユーザーのパスワード>

# 管理者ロールとテナントIDを取得
ADMIN_ROLE=$(keystone role-list | awk '/admin/ {print $2}')
TENANT_ID=$(keystone tenant-list | awk "/$TENANT_NAME/ {print \$2}")

# ユーザーの作成
keystone user-create --tenant-id $TENANT_ID --name swift --pass $PASSWORD 
SWIFT_USER=$(keystone user-list | awk '{/swift/ print $2}')
keystone user-role-add --user-id $SWIFT_USER --tenant-id $TENANT_ID --role-id $ADMIN_ROLE

# サービスの登録
keystone service-create --name=swift --type=object-store --description="Swift Object Storage"
SWIFT_ID=$(keystone service-list | grep swift | awk '{print $2}')
keystone endpoint-create --region RegionOne --service_id $SWIFT_ID --publicurl "http://$SWIFT_PROXY_HOST_PUB:8080/v1/AUTH_%(tenant_id)s" --adminurl "http://$SWIFT_PROXY_HOST_INT:8080/v1"  --internalurl "http://$SWIFT_PROXY_HOST_INT:8080/v1/AUTH_%(tenant_id)s"

 このスクリプトではSwift用のユーザーとして「swift」という名前のユーザーを作成し、パスワードとしてPASSWORD変数で指定したものを設定する。また、サービスやエンドポイントの登録も実行している。

プロクシノードの準備

 では、ストレージノードの構築手順について説明していこう。

パッケージのインストール

 まず、Proxyサービスを提供するopenstack-swift-proxyパッケージと、Proxyサービスが利用するmemcachedパッケージ、そしてKeystoneにアクセスするためのライブラリであるpython-keystoneパッケージをyumコマンドでインストールする。

# yum --enablerepo=epel install openstack-swift-proxy memcached python-keystone

Memcachedの設定

 続いて、一時的なデータの保存に利用するMemcachedの設定を行っておく。Memcachedの設定は/etc/sysconfig/memcachedファイルに記述する。基本的にはデフォルトのままでOKだが、アクセスを許可する接続元を指定する「-l」オプションの追加だけ行っておこう。

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l <プロクシノード自身のIPアドレス>"

 ファイルの編集後、以下のようにしてMemcachedを起動しておく。

# service memcached start

Proxyサービスの設定

 Swiftでは各サービスごとに設定ファイルが分けられており、また各サービスで共通する設定項目は/etc/swift/swift.confというファイルに記述されている。今回/etc/swift/swift.confで設定が必要なのは、「swift_hash_path_suffix」項目だけだ。ここには適当な文字列を指定すれば良い。ただし、すべてのSwiftノードで同じ値が指定されている必要がある。たとえば「SourceForge20130401」という文字列を設定する場合は以下のようになる。

[swift-hash]
swift_hash_path_suffix = SourceForge20130401

 また、Proxyサービスの設定は/etc/swift/proxy-server.confファイルに記述されている。基本的にはデフォルトのままで大丈夫だが、Memcachedが稼働しているホストを指定する「memcache_server」や、keystoneの認証に使用する「admin_tenant_name」および「admin_user」、「admin_password」、「auth_host」項目については以下のように適切なものに変更しておく。

[DEFAULT]
bind_port = 8080
workers = 8
user = swift
cert_file=/etc/swift/cert.crt
key_file=/etc/swift/cert.key

[pipeline:main]
pipeline = healthcheck cache authtoken keystone proxy-server

[app:proxy-server]
use = egg:swift#proxy
allow_account_management = true
account_autocreate = true

[filter:cache]
use = egg:swift#memcache
memcache_servers = <プロクシサーバーのIPアドレス>:11211

[filter:catch_errors]
use = egg:swift#catch_errors

[filter:healthcheck]
use = egg:swift#healthcheck

[filter:keystone]
paste.filter_factory = keystone.middleware.swift_auth:filter_factory
operator_roles = admin, SwiftOperator
is_admin = true
cache = swift.cache

[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
admin_tenant_name = <管理用テナント名>
admin_user = <swiftユーザー名>
admin_password = <swiftユーザーのパスワード>
auth_host = <keystoneが稼働しているホスト名>
auth_port = 35357
auth_protocol = http
signing_dir = /tmp/keystone-signing-swift

ringの作成

 Swiftでは、どのホストがどのサービスを提供しているのか、またオブジェクトをどのように分散配置するのか、といった設定情報を「ring」と呼ぶ。ringはAccountサービスおよびContainerサービス、Objectサービスのそれぞれに必要で、swift-ring-builderコマンドでその作成や設定を行う。

 まず、「swift-ring-builder <ビルダー名> create」コマンドでring情報が含まれたファイルを作成する。<ビルダー名>には「account.builder」および「container.builder」、「object.builder」のうち対応するものを指定する。

swift-ring-builder <ビルダー名> create <part_power> <replicas>   <min_part_hours>

 ここでpart_powerは利用するパーティション数を決定するためのパラメータ(2のpart_power乗個のパーティションが利用される)を、replicasは1つのオブジェクトに対し保持する複製の数を、min_part_hoursはパーティションの複数回の移動を制限する時間を指定する。

 たとえば、2の18乗のパーティションを利用し、1つのデータに対し3つの複製を作成、データがパーティションを移動した場合にその後1時間はパーティションの移動を制限する、といった設定の場合、以下のようにコマンドを実行すればよい。

# swift-ring-builder account.builder create 18 3 1
# swift-ring-builder container.builder create 18 3 1
# swift-ring-builder object.builder create 18 3 1     

 この場合、1つのデータは3つの異なるストレージノードに複製されて格納される。そのため、3台以上のストレージノードが必要となる。

 続いて、「swift-ring-builder <ビルダー名> add」コマンドでringにサービス情報を追加する。

swift-ring-builder <ビルダー名> add z<zone>-<ip>:<port>/<device_name>_<meta> <weight>

 ここでzoneにはゾーン番号、ipにはIPアドレス、portにはポート番号、device_nameにはデバイス名、metaにはメタデータ名、weightには重みを指定する。メタデータ名は省略可能だ。

 たとえばゾーン番号が0でストレージノードのIPアドレスが「192.168.100.21」、使用するストレージデバイス名がsda5、重みを100とする場合、以下のようになる。

# swift-ring-builder account.builder add z0-192.168.100.21:6002/sda5 100
# swift-ring-builder container.builder add z0-192.168.100.21:6001/sda5 100
# swift-ring-builder object.builder add z0-192.168.100.21:6000/sda5 100

 使用するストレージノードごとにこれらのコマンドを実行し、ringにノードを登録しておこう。なお、登録された情報は「swift-ring-builder <ビルダー名>」コマンドで確認できる。

# swift-ring-builder account.builder
account.builder, build version 1
262144 partitions, 3 replicas, 1 zones, 1 devices, 100.00 balance
The minimum number of hours before a partition can be reassigned is 1
Devices:    id  zone      ip address  port      name weight partitions balance meta
             0     0  192.168.100.21  6002      sda5 100.00          0 -100.00
 :
 :
 :

 もしここで誤った値が登録されていた場合、再度swift-ring-builder craeteコマンドを実行してringを初期化するか、swift-ring-builder removeコマンドで指定したデバイスを削除して再度登録を行う。

 ノードの登録が完了したら、最後に「swift-ring-builder <ビルダー名> rebalance」コマンドを実行して設定を反映させる。

# swift-ring-builder account.builder rebalance
# swift-ring-builder container.builder rebalance
# swift-ring-builder object.builder rebalance

 すると、/etc/swift以下にring情報を格納した「container.ring.gz」および「object.ring.gz」、「account.ring.gz」というファイルが作成される。

Proxyサービスの起動

 以上の設定が完了したら、swift-initコマンドでProxyサービスを起動させる。swift-initコマンドは次のような引数を取る。

swift-init <サーバー名> <操作>

 <操作>には「start」や「stop」、「restart」、「status」などが指定可能だ。たとえばproxyサービスを起動するには、以下のようにする。

# swift-init proxy start

 なお、Swiftではエラーメッセージやログなどをsyslogを使って出力する。もし問題が発生した場合は、/var/log/messagesファイルを確認してみよう。