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-CSが対応している認証方式
Riak-CSをOpenStack KeyStoneと連係させる際に利用できる認証方式は以下の2つがあります。
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