※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。
今回のエンジニアブログでは、IDCフロンティアが研究開発を進めている分散ストレージについて、Basho Technologies社のRiakとRiak CSを使って構築する方法を説明していきます。
Riakとは
RiakはAmazon Dynamoを参考にして開発された分散キーバリューストアです。他の分散キーバリューストアに比べ、運用性が高く、ノードを追加してスケールアウトする操作も容易で、3コマンドで可能です。また、Entreprise版ではマルチデータセンターレプリケーションをサポートしており、高可用性を実現します。
Riak CSとは
Riak CSはRiak上に構築され、Awazon Web Services(以下、AWS) S3互換のREST APIを提供します。またマルチテナント機能を有し、アクセス制限、ネットワーク使用レポート、ストレージ使用レポートを提供します。Riak CSにはStanchionと呼ばれるアプリケーションが必要になります。StanchionもBasho Technologies社から提供されており、ユーザー名やバケット名の一意性を確認する役割を担います。
インストール準備
Riakではデフォルトで3ノード(ノードはサーバーと同意です)にデータをコピーします。そのため、デフォルト設定の場合は3つ以上のノードが必要になります。今回はIDCフロンティア セルフクラウド上に以下のスペックの仮想マシンを3台準備し、分散ストレージを構築していきます。IDCフロンティア セルフクラウドの使い方はご利用ガイドを参照してください。
IDCフロンティア セルフクラウドではブラウザから仮想マシンの作成、削除がお客様自身で可能であるため、Riakのノード追加、削除が容易に試せます。とりあえずRiak、RiakCSを動かしてみたい、Riak、RiakCSの運用性を確認してみたい方は、是非IDCフロンティア セルフクラウド上で構築してみてください。
Template:[LATEST]CentOS 6.4 64bit
OS:CentOS6.4 64bit
CPU:2
Memory:2G
Disk:15G
それでは実際に構築していきましょう。
1. OS設定
OSのインストール完了後、何点かOSの設定を変更する必要があります。
・selinuxの無効化
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
CentOSのデフォルト設定の場合、selinuxが有効になっているためこれを無効にします。
※IDCフロンティア セルフクラウドで用意されているTemplateから作成した仮想マシンの場合、selinuxはデフォルトで無効になっています。
[root@riakdemo1 ~]# cd /etc/selinux [root@riakdemo1 ~]# vi config SELINUX=の箇所をdisabledにします。 SELINUX=disabled
・Open Files Limitの変更
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
Open Files Limitを設定します。こちらを設定しておかないと、riak、riak csの起動時に警告が表示されます。
[root@riakdemo1 ~]# cd /etc/security/
[root@riakdemo1 ~]# vi limits.conf
ファイルの末尾に以下を追加します。
riak soft nofile 65536
riak hard nofile 65536
root soft nofile 65536
root hard nofile 65536
上記設定を反映させるため、ノードの再起動を実施します。
2. Riak、Riak CS、Stanchionのパッケージをダウンロード
Riak、Riak CSには無償のオープンソース版と有償のエンタープライズ版があります。有償のエンタープライズ版にはデータセンター間のレプリケーション機能やsnmpでの監視機能等がついています。今回は無償のオープンソース版をインストールします。最新のオープンソース版Riak、Riak CS、Stanchionは以下からダウンロード可能です。
[Riak] http://docs.basho.com/riak/latest/downloads/
[Riak CS、Stanchion] http://docs.basho.com/riakcs/latest/riakcs-downloads/
それでは構築した仮想マシンにダウンロードを実施します。Stanchionだけは1つの仮想マシンにのみダウンロードします。Riak、Riak CSはすべての仮想マシンにダウンロードします。今回の構成では、riakdemo1にStanchionをインストールします。
[root@riakdemo1 ~]# wget http://s3.amazonaws.com/downloads.basho.com/riak/1.4/1.4.1/rhel/6/riak-1.4.1-1.el6.x86_64.rpm [root@riakdemo1 ~]# wget http://s3.amazonaws.com/downloads.basho.com/stanchion/1.4/1.4.0/rhel/6/stanchion-1.4.0-1.el6.x86_64.rpm [root@riakdemo1 ~]# wget http://s3.amazonaws.com/downloads.basho.com/riak-cs/1.4/1.4.0/rhel/6/riak-cs-1.4.0-1.el6.x86_64.rpm
Stanchion以外のダウンロードをriakdemo2、riakdemo3でも同様に行います。
3. Riakのインストール
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[root@riakdemo1 ~]# rpm -ivh riak-1.4.1-1.el6.x86_64.rpm 準備中... ########################################### [100%] 1:riak ########################################### [100%] [root@riakdemo1 ~]#
4. Riak CSのインストール
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[root@riakdemo1 ~]# rpm -ivh riak-cs-1.4.0-1.el6.x86_64.rpm 準備中... ########################################### [100%] 1:riak-cs ########################################### [100%] [root@riakdemo1 ~]#
5. Stanchionのインストール
実施対象ノード:riakdemo1
[root@riakdemo1 ~]# rpm -ivh stanchion-1.4.0-1.el6.x86_64.rpm 準備中... ########################################### [100%] 1:stanchion ########################################### [100%] [root@riakdemo1 ~]#
6. Riakの設定変更
・/etc/riak/app.configの変更
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[変更前]
{pb, [ {"127.0.0.1", 8087 } ]}
[変更後]
各ノードのIPに変更します。
{pb, [ {"10.2.2.211", 8087 } ]}
[変更前]
{http, [ {"127.0.0.1", 8098 } ]},
[変更後]
各ノードのIPに変更します。
{http, [ {"10.2.2.211", 8098 } ]},
[変更前]
{storage_backend, riak_kv_bitcask_backend},
[変更後]
バックエンドストレージをriak cs用に変更します。
{add_paths, ["/usr/lib64/riak-cs/lib/riak_cs-1.4.0/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, "/var/lib/riak/leveldb"}
]},
{be_blocks, riak_kv_bitcask_backend, [
{data_root, "/var/lib/riak/bitcask"}
]}
]},
[追加]
riak_coreセクションに以下を追加します。
{default_bucket_props, [{allow_mult, true}]},
・/etc/riak/vm.argsの変更
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[変更前]
-name riak@127.0.0.1
[変更後]
各ノードのIPに変更します。
-name riak@10.2.2.211
7. Riak CSの設定変更
・/etc/riak-cs/app.configの変更
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[変更前]
{cs_ip, "127.0.0.1"},
[変更後]
各ノードのIPに変更します。
{cs_ip, "10.2.2.211"},
[変更前]
{riak_ip, "127.0.0.1"},
[変更後]
各ノードのIPに変更します。
{riak_ip, "10.2.2.211"},
[変更前]
{stanchion_ip, "127.0.0.1"},
[変更後]
各ノードのIPに変更します。
{stanchion_ip, "10.2.2.211"},
[変更前]
{cs_root_host, "s3.amazonaws.com"},
[変更後]
分散ストレージのエンドポイントとなるFQDNに変更します。
{cs_root_host, "riakdemo.xxx.xxx.jp"},
・/etc/riak-cs/vm.argsの変更
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[変更前]
-name riak-cs@127.0.0.1
[変更後]
各ノードのIPに変更します。
-name riak-cs@10.2.2.211
8. Stanchionの設定変更
・/etc/stanchion/app.configの変更
実施対象ノード:riakdemo1
[変更前]
{stanchion_ip, "127.0.0.1"},
[変更後]
riakdemo1のIPに変更します。
{stanchion_ip, "10.2.2.211"},
[変更前]
{riak_ip, "127.0.0.1"},
[変更後]
riakdemo1に変更します。
{riak_ip, "10.2.2.211"},
・/etc/stanchion/vm.argsの変更
実施対象ノード:riakdemo1
[変更前]
-name stanchion@127.0.0.1
[変更後]
riakdemo1のIPに変更します。
-name stanchion@10.2.2.211
9. Riak、Riak CS、Stanchionの起動
起動の順序は、Riak→Stanchion→Riak CSの順番になります。
・Riakの起動
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[root@riakdemo1 ~]# riak start
・Riakの起動確認
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[root@riakdemo1 ~]# riak ping
pong
pongが返ってくればriakは起動しています。
・Stanchionの起動
実施対象ノード:riakdemo1
[root@riakdemo1 ~]# stanchion start
・Stanchionの起動確認
実施対象ノード:riakdemo1
[root@riakdemo1 ~]# stanchion ping
pong
pongが返ってくればstanchionは起動しています。
・Riak CSの起動
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[root@riakdemo1 ~]# riak-cs start
・Riak CSの起動確認
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[root@riakdemo1 ~]# riak-cs ping
pong
pongが返ってくればriak csは起動しています。
10. リングの作成
作成した3台でリングを作成します。リングとはクラスタ(複数ノード)内でデータを分散し保存するためのハッシュ空間のことです。リング作成前の状態では、以下の通りリングに参加しているのは1ノード(自分自身)のみとなります。
[root@riakdemo1 ~]# riak-admin member_status
================================= Membership ==================================
Status Ring Pending Node
-------------------------------------------------------------------------------
valid 100.0% -- 'riak@10.2.2.211'
-------------------------------------------------------------------------------
Valid:1 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
riakdemo2をriakdemo1のリングに追加します。
実施対象ノード:riakdemo2
[root@riakdemo2 ~]# riak-admin cluster join riak@10.2.2.211(riakdemo1のIPアドレス) Success: staged join request for 'riak@10.2.2.33' to 'riak@10.2.2.211'
riakdemo2がriakdemo1のリングに追加される計画を確認します。
実施対象ノード:riakdemo2
[root@riakdemo2 ~]# riak-admin cluster plan
=============================== Staged Changes ================================
Action Details(s)
-------------------------------------------------------------------------------
join 'riak@10.2.2.33'
-------------------------------------------------------------------------------
NOTE: Applying these changes will result in 1 cluster transition
###############################################################################
After cluster transition 1/1
###############################################################################
================================= Membership ==================================
Status Ring Pending Node
-------------------------------------------------------------------------------
valid 100.0% 50.0% 'riak@10.2.2.211'
valid 0.0% 50.0% 'riak@10.2.2.33'
-------------------------------------------------------------------------------
Valid:2 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
WARNING: Not all replicas will be on distinct nodes
Transfers resulting from cluster changes: 32
32 transfers from 'riak@10.2.2.211' to 'riak@10.2.2.33'
riakdemo2がriakdemo1のリングに追加される計画をコミットします。
実施対象ノード:riakdemo2
[root@riakdemo2 ~]# riak-admin cluster commit Cluster changes committed
この時点でriakdemo2がriakdemo1のリングに追加され、riakdemo1からriakdemo2にデータが配置されます。
[root@riakdemo2 ~]# riak-admin member_status ================================= Membership ================================== Status Ring Pending Node ------------------------------------------------------------------------------- valid 75.0% 50.0% 'riak@10.2.2.211' valid 25.0% 50.0% 'riak@10.2.2.33' ------------------------------------------------------------------------------- Valid:2 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
以下の通りPendingの箇所が「--」となった時点でデータ配置が完了し、リングへの追加が完了です。
[root@riakdemo2 ~]# riak-admin member_status
================================= Membership ==================================
Status Ring Pending Node
-------------------------------------------------------------------------------
valid 50.0% -- 'riak@10.2.2.211'
valid 50.0% -- 'riak@10.2.2.33'
-------------------------------------------------------------------------------
Valid:2 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
同様にriakadmin3をリングへ追加します。最終的には以下の状態になります。
[root@riakdemo3 riak-cs]# riak-admin member_status
================================= Membership ==================================
Status Ring Pending Node
-------------------------------------------------------------------------------
valid 34.4% -- 'riak@10.2.2.211'
valid 32.8% -- 'riak@10.2.2.33'
valid 32.8% -- 'riak@10.2.2.58'
-------------------------------------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
11. 管理者用のアクセスキーを作成
Riak、Riak CS、Stanchionの設定に管理者用のアクセスキーを登録する必要があります。riakdemo1で管理者用のアクセスキーを生成します。
1. Riak CSの設定変更
・/etc/riak/app.config
実施対象ノード:riakdemo1
[変更前] {anonymous_user_creation, false}, [変更後] {anonymous_user_creation, true},
・Riak CSの再起動
実施対象ノード:riakdemo1
[root@riakdemo1 riak-cs]# riak-cs restart ok [root@riakdemo1 riak-cs]#
2. 管理者用のアクセスキーの作成
実施対象ノード:riakdemo1
以下のコマンドで管理者用のアクセスキーを作成します。URLのIP部分は実行するノードのIPを指定します。
[root@riakdemo1 ~]# curl -H 'Content-Type: application/json' -X POST http://10.2.2.211:8080/riak-cs/user --data '{"email":"admin@riakdemo.local", "name":"admin"}' {"email":"admin@riakdemo.local","display_name":"admin","name":"admin","key_id":"0MB9SCUBK_KJCNUWX0KF","key_secret":"0spg70YtgKTNZfuVQ4GBcY_KBq43TvhpfEHFxA==","id":"7fcb112f8125fe9dbcb0d335d7760b041d76bf73610a4e450feea1f227fdb2cc","status”:"enabled"} [root@riakdemo1 riak-cs]#
作成されたkey_idとkey_secretをメモしておきます。
管理者用のアクセスキー発行後、先ほど変更した設定を元に戻します。設定を戻しておかないと、誰でもkey_idとkey_secretが発行できてしまうので、注意が必要です。
・/etc/riak/app.configの変更
実施対象ノード:riakdemo1
[変更前] {anonymous_user_creation, true}, [変更後] {anonymous_user_creation, false},
・Riak CSの再起動
実施対象ノード:riakdemo1
[root@riakdemo1 riak-cs]# riak-cs restart ok [root@riakdemo1 riak-cs]#
3. 管理者用のアクセスキーを設定ファイルに投入します。
・/etc/riak-cs/app.configの変更
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[変更前] {admin_key, "admin-key"}, [変更後] {admin_key, "0MB9SCUBK_KJCNUWX0KF"},
[変更前] {admin_secret, "admin-secret"}, [変更後] {admin_secret, "0spg70YtgKTNZfuVQ4GBcY_KBq43TvhpfEHFxA=="},
・/etc/stanchion/app.configの変更
実施対象ノード:riakdemo1
[変更前] {admin_key, "admin-key"}, [変更後] {admin_key, "0MB9SCUBK_KJCNUWX0KF"},
[変更前] {admin_secret, "admin-secret"}, [変更後] {admin_secret, "0spg70YtgKTNZfuVQ4GBcY_KBq43TvhpfEHFxA=="},
設定反映のため、Riak CS、Stanchionを再起動します。
・Riak CSの再起動
実施対象ノード:riakdemo1、riakdemo2、riakdemo3
[root@riakdemo1 riak-cs]# riak-cs restart ok [root@riakdemo1 ~]#
・Stanchionの再起動
実施対象ノード:riakdemo1
[root@riakdemo1 riak-cs]# stanchion restart ok [root@riakdemo1 ~]#
これで分散ストレージの構築は完了です。
12. ネットワーク設定
最後に、構築した分散ストレージをインターネット経由でつかえるようにネットワークの設定を行います。
IDCフロンティア セルフクラウドには標準でグローバルIPアドレスが1つ付与されています。そして、そのグローバルIPアドレスでのファイアウォール、ポートフォワード、ロードバランサ―設定が可能となっています。今回は以下のように設定しました。
・ロードバランサ―設定項目で、構築した3台のサーバーに対してポート8080でロードバランシング
・ファイアウォール設定項目で、分散ストレージを利用させたいサイトからのポート8080を許可
IDCフロンティア セルフクラウドでのネットワーク設定変更方法についてはご利用ガイド(ネットワーク)を参照してください。
また、インターネット経由で接続するためのFQDN(今回の構成ではriakdemo.xxx.xxx.jp)をDNSサーバーに登録する必要があります。その際、どのサブドメインでも同じIPアドレスに変換されるようにワイルドカードを使います。
今回の設定では、
riakdemo.xxx.xxx.jp
*.riakdemo.xxx.xxx.jp
で同じIPアドレスに変換されるようにDNSサーバーへ登録します。
それでは実際に構築した分散ストレージにオブジェクトをアップロードしてみましょう。
Riak CSはAWS S3 API互換のため、s3cmd、s3curl等のAWS S3 API対応のアプリケーションをつかってオブジェクトを管理できます。今回はWindows上で動作するDragonDiskを使ってオブジェクトをアップロードしてみます。
DragonDiskは以下からダウンロード可能です。ダウンロード完了後にexeファイルを実行し、インストールを完了させます。
http://www.dragondisk.com/download-amazon-s3-client-google-cloud-storage-client.html
インストールされたDragonDiskを起動します。
「File」-「Accounts...」から新規ユーザー作成を行います。
必要箇所を入力し、ユーザー作成を完了させます。
作成されたユーザーを選択し、新規バケット作成を実施します。バケットはWindowsのフォルダのような位置づけになります。バケット名は分散ストレージ内で一意である必要があります。
作成されたバケットに対してオブジェクトをドラッグ&ドロップすることで、以下の通りオブジェクトが分散ストレージへアップロードされます。
今回はDragonDiskからの分散ストレージを利用する手順を簡単に紹介しましたが、次回はs3cmd、s3fs、s3curl等のコマンドツールを使った分散ストレージの利用方法を紹介します。ご期待ください!
以上、IDCフロンティア 営業支援部 テクニカルセールスグループの佐藤でした。