OpenStack Swiftの代わりにRiak-CSを使ってみる

OpenStackではオブジェクトストレージサービスとしてSwiftが使えますが、APIレイヤで差し換え可能なコンポーネントとしてSwiftStackやRiak-CSなどがあります。今回の記事では、分散オブジェクトストレージ Riak-CS をOpenStackと組み合わせる方法についてまとめてみます。

Riak-CSで出来ること

Riak-CSは Basho Technologies社が開発したAmazon S3のAPIを持つ分散オブジェクトストレージのソフトウェアで、2013年3月にオープンソース化されました。Riak-CSは分散データベース Riak の上で動作するアーキテクチャを取っているため、Riakの特長である高いAvailabilityやScalabilityが実現されています。
Swiftでは飽き足らない人やRiakが大好きな人は、是非この記事を参考に OpenStack のオブジェクトストレージを Riak-CS にしてお楽しみください。

情報源

Riak Documentation

Riak-CSが対応している認証方式

Riak-CSをOpenStack KeyStoneと連係させる際に利用できる認証方式は以下の2つがあります。

  • Access Key / Secret Key を用いた認証 (AWS互換API)
  • Access Tokenを用いた認証 (Swift互換API)

Riak-CSが対応している Swift互換API

Riak-CSで利用できる Swift互換APIは以下の通りです。

  • List Containers(lists all buckets for authenticated user)
  • List Objects
  • Create Container
  • Delete Container
  • Get Object
  • Create or Update Object
  • Delete Object

インストール方法

本記事では、ソースコードからビルドする形でのインストール方法を解説します。keystoneについては、devstackを用いてインストールします。

riak, riak-cs及びstanchionのソースコードをダウンロードする
$ git clone https://github.com/basho/riak
$ git clone https://github.com/basho/riak_cs
$ git clone https://github.com/basho/stanchion
riakをビルドする
$ cd riak
$ git branch -b 1.4.2 refs/tags/1.4.2
$ make stagedevrel
$ cd ..
riak-csをビルドする
$ cd riak_cs
$ git branch -b 1.4.3 refs/tags/1.4.3
$ make stagedevrel
$ cd ..
stanchionをビルドする
$ cd stanchion
$ git branch -b 1.4.3 refs/tags/1.4.3
$ make devrel
$ cd ..
riakの設定をriak-cs向けに修正し、riakプロセスを起動する
$ cd riak
$ vi dev/dev1/etc/app.conf
(riak_kv storage_backend の箇所をコメントし、下記を追加)
{add_paths, ["/home/foobar/src-github/riak-swift-test/riak_cs/dev/dev1/lib/riak_cs/ebin"]},
{storage_backend, riak_cs_kv_multi_backend},
{multi_backend_prefix_list, [{<<"0b:">>, be_blocks}]},
{multi_backend_default, be_default},
{multi_backend, [
  {be_default, riak_kv_eleveldb_backend, [
    {max_open_files, 50},
      {data_root, "./data/leveldb"}
  ]},
    {be_blocks, riak_kv_bitcask_backend, [
      {data_root, "./data/bitcask"}
  ]}
]},

(riak_core 下記の項目を追加)
{default_bucket_props, [{allow_mult, true}]},
$ ulimit -n 4096
$ dev/dev1/bin/riak start
$ cd ..
riak-csの設定を修正し、riak-csプロセスを起動する
$ cd ../riak_cs
$ vi dev/dev1/etc/app.config
(adminアカウントを作成するため、一時的に認証無しの設定にする)
{anonymous_user_creation, true},

(riakのポート設定を変更する)
riak_cs, ...
{riak_pb_port, 10017 } ,
$ dev/dev1/bin/riak-cs start
stanchionプロセスを起動する
$ vi dev/stanchion/etc/app.config
(stanchion riakポートを変更する)
{stanchion,...
{riak_pb_port, 10017 },
admin userを作成する
$ curl -H 'Content-Type: application/json' \
  -X POST http://localhost:8071/riak-cs/user \
  --data '{"email":"[email protected]", "name":"admin user"}'

以下のようなメッセージが返ってくる

{
   "email" : "[email protected]",
   "status" : "enabled",
   "key_id" : "KDGRAVNHTYYF8XNTD7CD",
   "name" : "admin user",
   "id" : "e52d4a6ee043848fceecbfeee10f48076924ef2a758d03d9554ecec05d6d1233",
   "display_name" : "admin",
   "key_secret" : "9IucFpt32qbAltZb_kEWa5N3bD_N9kbSB5mxsg=="
}
riak-cs, stanchionの Admin User Credential設定を上記で作成したものに変更して、anonymous user creation を disable に戻す
$ vi dev/stanchion/etc/app.config
$ dev/stanchion/bin/stanchion restart
$ cd ../riak_cs
$ vi dev/dev1/etc/app.config
$ dev/dev1/bin/riak-cs restart
s3cmdで動作テスト (まずは Riak-CS単体の動作テスト)
$ sudo apt-get install s3cmd
$ vi 00s3.cfg
(00s3.cfg)
[default]
access_key = KDGRAVNHTYYF8XNTD7CD
bucket_location = US
cloudfront_host = cloudfront.amazonaws.com
cloudfront_resource = /2010-07-15/distribution
default_mime_type = binary/octet-stream
delete_removed = False
dry_run = False
enable_multipart = False
encoding = UTF-8
encrypt = False
follow_symlinks = False
force = False
get_continue = False
gpg_command = /usr/local/bin/gpg
gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
gpg_passphrase = password
guess_mime_type = True
host_base = s3.amazonaws.com
host_bucket = %(bucket)s.s3.amazonaws.com
human_readable_sizes = False
list_md5 = False
log_target_prefix =
preserve_attrs = True
progress_meter = True
proxy_host = localhost
proxy_port = 8071
recursive = False
recv_chunk = 4096
reduced_redundancy = False
secret_key = 9IucFpt32qbAltZb_kEWa5N3bD_N9kbSB5mxsg==
send_chunk = 4096
simpledb_host = sdb.amazonaws.com
skip_existing = False
socket_timeout = 300
urlencoding_mode = normal
use_https = True
verbosity = WARNING
$ s3cmd -c 00s3.cfg ls
$ s3cmd -c 00s3.cfg mb s3://test
$ s3cmd -c 00s3.cfg put LICENSE s3://test/obj1
$ s3cmd -c 00s3.cfg ls s3://test/
$ s3cmd -c 00s3.cfg get s3://test/obj1 -
OpenStack Keystoneのインストール、プロセス起動
$ cd ..
$ git clone https://github.com/openstack-dev/devstack
$ cd devstack
$ cp samples/localrc .
$ vi localrc
(localrcの修正)
(Swift及びKeystoneのみを動作させるため、下記コンフィグを付け足す)
KEYSTONE_BRANCH=stable/havana
SERVICE_TOKEN=$ADMIN_PASSWORD
disable_all_services
enable_service key mysql
$ ./stack.sh
$ source openrc admin admin
$ keystone service-create --name=swift --type="object-store" \
    --description="Swift Service"
$ keystone endpoint-create \
          --region RegionOne \
          --service_id (service id) \
          --publicurl "http://localhost:8071/v1/AUTH_\$(tenant_id)s" \
          --adminurl "http://localhost:8071" \
          --internalurl "http://localhost:8071/v1/AUTH_\$(tenant_id)s"
$ keystone catalog
S3 APIの設定、テスト
$ cd ../riak_cs
$ vi dev/dev1/etc/app.config
(app.config)
- devstackのコンフィグで指定した token を追加

{os_admin_token, "nomoresecrete"},
    (Auth URL を指定する)
{os_auth_url, "http://(host or ip address):35357/v2.0/"},
{rewrite_module, riak_cs_s3_rewrite },
{auth_module, riak_cs_keystone_auth },
$ dev/dev1/bin/riak-cs restart
$ keystone user-create --name testuser --pass test --email [email protected] --tenant-id (demo tenant id) --enabled true
$ keystone role-create --name swiftoperator
$ keystone user-role-add --user-id (user-id) --role-id (role-id) --tenant-id (tenant-id)
$ keystone ec2-credentials-create --user_id (uid) --tenant_id (tenant-id)
$ vi 01s3.cfg
  (access_key, secret_key を ec2-credentials-create で生成されたものに変える)
$ s3cmd -c 01s3.cfg mb s3://bucket2
$ s3cmd -c 01s3.cfg ls
$ echo "ilovechickenilovelivermeowmixmeowmixwilldeliver" > upload.txt
$ s3cmd -c 01s3.cfg put upload.txt s3://bucket2
$ s3cmd -c 01s3.cfg get s3://bucket2/upload.txt download.txt
$ s3cmd -c 01s3.cfg del s3://bucket2/upload.txt
$ s3cmd -c 01s3.cfg rb s3://bucket2
OpenStack(Swift) APIの設定、テスト
$ vi dev/dev1/etc/app.config
(app.config)
{rewrite_module, riak_cs_oos_rewrite },
    (API を Swift API に変更する)
$ dev/dev1/bin/riak-cs restart
$ curl -s -d '{"auth": {"tenantName": "demo", "passwordCredentials": {"username": "testuser", "password": "test"}}}' -H 'Content-type: application/json' http://localhost:5000/v2.0/tokens | json_pp
$ export ID=...
  (token項目の中のidを X-Auth-Tokenとして使う)
$ export URL=...
  (object-store service の serviceCatalogから、publicURLの情報を得る)
$ curl -X PUT -H 'X-Auth-Token: '$ID $URL/bucket1
$ curl -H 'X-Auth-Token: '$ID $URL
$ curl -X PUT --data 'abcdefghi123456789' -H 'X-Auth-Token: '$ID $URL/bucket1/object1