Riak CS をインストールする優れたやり方

一部の人が愛してやまない(らしい)、Riak CS がオープンソース化されました。
id:kuenishi【緊急】 Riak Cloud Storage が OSS になりました【速報】なんて記事を書いて、
インストール方法を説明していますが、手順が多すぎてなにいってんだかぜんぜんわかりません。

こんなに複雑な手順なのに、手順番号も振ってないし、クロスチェック用のチェック欄もありません。
手順書としては考えられない構成になっています。

しかたがないので、シンプルな手順で Riak CS が利用できるよう、chef でインストールすることにしましょう。
本家 Basho サイトを見ると Riak CS Using Chef という素敵な記事があります。
どうやら Basho では chef のレシピを提供してくれているようです。

Cheffile を作る

いつもどおり、librarian-chef 用の Cheffile を書きます。
先ほど書いたとおり、Basho が riak と riak-cs のレシピを提供しているのでこれを使います。

site 'http://community.opscode.com/api/v1'

cookbook 's3cmd'
cookbook 'riak',
  :git => 'https://github.com/basho/riak-chef-cookbook'
cookbook 'riak-cs',
  :git => 'https://github.com/basho/riak-cs-chef-cookbook'
cookbook 'riak-cs-prepare',
  :git => 'https://github.com/tk0miya/chef-riak-cs-prepare'

最後の行に riak-cs-prepare というものを追加しています。
これは僕がつくった riak-cs を入れるための調整用の cookbook です。
以下のような quick hack がなされています。

  • riak cookbook を素直に実行すると ulimit -n 4096 しろと怒られるので設定した
  • riak と riak-cs の起動順序がおかしいのを回避
    • Riak を設定するときに Riak CS が入っている必要があるのに、Riak CS は Riak が起動していないと落ちる問題が…

Attributes の設定をする

id:kuenishi のブログでは /etc/riak/app.config を書き換えていますが、
riak cookbook や riak-cs cookbook では Attributes を使って設定を追加することができます。
手元では以下のように solo.json を設定しました。

{
  "riak" : {
    "config" : {
      "riak_core" : {
        "default_bucket_props" : {
          "allow_mult": true
        }
      },
      "riak_kv" : {
        "storage_backend" : "riak_cs_kv_multi_backend"
      }
    }
  },
  "riak_cs" : {
    "config" : {
      "riak_cs" : {
        "anonymous_user_creation" : true
      }
    },
    "limits" : {
      "config_limits" : true
    }
  },
  "stanchion" : {
    "limits" : {
      "config_limits" : true
    }
  },
  "run_list" : [
    "recipe[yum::epel]",
    "recipe[s3cmd]",
    "recipe[riak-cs-prepare]",
    "recipe[riak]",
    "recipe[riak-cs]",
    "recipe[riak-cs::stanchion]"
  ]
}

なお、riak-cs-prepare と riak、riak-cs の順序はこの通りに並べる必要があります。
入れ替えるとエラーが出て失敗するので注意してください。

riak と riak_cs のオプションは undocumented なので cookbook を読み解きつつ必要なオプションを見つけています。
よりよいやり方があればツッコミお願いします!

あとは設定ファイル(solo.rb)を書いておきます。今回は途中でファイルのダウンロードを含むので file_cache_path を指定しておきます。

cookbook_path "/home/vagrant/cookbooks"
file_cache_path "/home/vagrant/cache"

実行する

いつもどおり chef-solo を実行します。

$ librarian-chef install
$ mkdir cache
$ sudo chef-solo -j solo.json -c $HOME/solo.rb

追記(3/13 7:10): librarian の実行とか solo.rb の追加とかの手順を念のため追加

これで riak と riak-cs がインストールされます*1
あとは 「最初のユーザをつくる」を実行すれば ok です。

$curl -H 'Content-Type: application/json' \
  -X POST http://10.0.2.15:8080/riak-cs/user \
  --data '{"email":"admin@admin.com", "name":"admin"}'

riak-cs-prepare では何を行なっているのか

riak-cs-prepare では、先程も書いたとおり

  • riak cookbook を素直に実行すると ulimit -n 4096 しろと怒られるので設定した
  • riak と riak-cs の起動順序がおかしいのを回避
    • Riak を設定するときに Riak CS が入っている必要があるのに、Riak CS は Riak が起動していないと落ちる問題が…

という対応をしています。

では、ちょっと recipe/default.rb を覗いてみましょう。

まず、先頭の方に次のような記述があります。

file_ulimit "riak" do
  user "riak"
  soft_limit 4096
  hard_limit 4096
end

ここでは riak 用の ulimit を定義しています。この file_ulimit リソースは riak-cs cookbook の中で定義されているものです。

そして、もうひとつ、最後のところで次のような記述をしています。

service "riak" do
  subscribes :restart, resources("package[#{package_name}]"), :immediately
end

subscribes という通知設定を使って、riak-cs パッケージをインストールした直後に riak の再起動を行なっています。
これにより、「Riak CS をインストールした直後」かつ「サービスを起動する前」のタイミングで
riak を起動することができます*2

まとめ

ちょっと手間がかかる Riak CS のセットアップを chef を使って行なってみました。
提供されている chef cookbook が完璧ではないため、調整用の cookbook を使う必要がありますが、
お手軽に Riak CS を使いはじめることができました。

*1:手元の環境では 3回に1回ぐらい、riak cookbook の実行中にエラーが出てました。もう一度実行すると問題無いのですが、何が起きてるんでしょうかねえ

*2:Riak の設定で Riak CS パッケージに含まれるモジュールを利用するよう設定しているので、このタイミングでしか起動するチャンスがない