Riak を使ってみる

ここ数日 Riak について調べていたのでメモ。
因にゴールが Riak CS を使って分散ストレージを使う事。


まずは Riak のセットアップ。
手元の Mac に入れてみる。
http://blog.basho.co.jp/post/50004340626/mac-riak-1-3-1 を参照。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
client = riak.RiakClient()
bucket = client.bucket('mybucket')
obj = bucket.new('key', data={
    'spam': 'foo',
    'eggs': 'bar'
})
obj.store()
obj = bucket.get('key')
print obj.get_data()

こんなんを書いて実行して

{'eggs': 'bar', 'spam': 'foo'}

が表示された。


手元でも良いけど Linux で構築したいので Vagrant の出番。

Vagrant.configure("2") do |config|
  config.vm.box = "centos"
  config.vm.network :forwarded_port, guest: 8098, host: 9098, auto_correct: true # riak http
  config.vm.network :forwarded_port, guest: 8087, host: 9087, auto_correct: true # riak pb
  config.vm.network :forwarded_port, guest: 9999, host: 8765, auto_correct: true # riak pb
end

こんな Vagrantfile を作って、vagrant up を実行。
# Fabric で自分の Vagrant 環境を構築するために、Sahara を入れて環境作っては怖しを繰り返してた
# 以下コマンドで書いてるけど、全て Fabric 化済み
# プロダクションで使う事になったら Vagrant じゃなくて職場の仮想サーバの上に構築するので、Chef で構築予定
# 今は調査してる段階だし、個人環境なので Fabric を使ってる


Riak, Riak CS, Stanchion のインストールは yumリポジトリから実施。

$ sudo yum install http://yum.basho.com/gpg/basho-release-6-1.noarch.rpm
$ sudo yum install riak
$ sudo yum install riak-cs
$ sudo yum install stanchion
$ sudo yum install riak-cs-control
$ wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ rpm -Uvh epel-release-6-8.noarch.rpm
$ sudo yum install protobuf
$ sudo yum install protobuf-devel

Python の riak クライアントに Protocol Buffers のライブラリが必要なのでインストールする。


めんどくさいので iptables とかはオフ*1。当然 SELinux も Disabled にする(vagrant up したら Disabled になってた)。

$ sudo /etc/init.d/iptables stop


Riak の設定ファイルとかは http://docs.basho.co.jp/riakcs/latest/cookbooks/configuration/Configuring-Riak/ を参考に追加。

$ sudo /etc/init.d/riak start
$ sudo /etc/init.d/riak-cs start
$ sudo /etc/init.d/stanchion start


まずは Riak が起動してるか VirtualBox のマシンからチェック。

$ curl -v http://localhost:8098/ping
* About to connect() to localhost port 8098 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 8098 (#0)
> GET /ping HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
> Host: localhost:8098
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: MochiWeb/1.1 WebMachine/1.9.2 (someone had painted it blue)
< Date: Tue, 28 May 2013 10:24:22 GMT
< Content-Type: text/html
< Content-Length: 2
< 
* Connection #0 to host localhost left intact
* Closing connection #0
OK

VirtualBox のホストのマシンからもチェックしようとしたら以下の様な応答になった。

$ curl -v http://localhost:9098/ping
* About to connect() to localhost port 9098 (#0)
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 9098 (#0)
> GET /ping HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:9098
> Accept: */*
>
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server

ちゃんとポートフォワードしてるはずなのに…。
と困ってたら [twitter:@voluntas] さんに教えて頂いた。
ありがとうございます!!


/etc/riak/app.config で 127.0.0.1 になってるのを全て 0.0.0.0 に変更し、Riak を再起動したら正しく動いた!
ということでホストマシンからもアクセスできるようになった。
原因は 127.0.0.1 だと Riak をホストしてるマシンからしか見えないよう。

app.configを見ればわかると思うが、このままだとデフォルトのポートはすべてループバックアドレスをlistenしてしまう。そのためローカルマシンからしかアクセスすることができない。これを外からでも見えるようにするためには、 etc/app.config と etc/vm.args に 127.0.0.1 と書いてあるところをすべてそのマシンのIPアドレスで書き換えること。 0.0.0.0 にしてもよいところとしてはいけないところに分かれているので、基本的にはそのネットワークで定義されているIPアドレスにしなければならない。
ちなみにIPv6は1.3以降のバージョンから動く、かもしれない。

ひとりでやるRiak Advent Calendar 2012 day1 - 入門 - kuenishi's blog

*1:あとでちゃんとやる予定