Ubuntuにriakインストールしたメモ

分散キーバリューストアのriakをインストールしたときのメモです。
kuenishiさんの[「ひとりでやるRiak Advent Calendar 2012 day1 - 入門」](http://kuenishi.hatenadiary.jp/entry/2012/12/01/131759)を参考にさせて頂きながらソースとUbuntu用パッケージの両方からインストールしてみました。
ここにはUbuntu用パッケージからのインストール記録を書いておきます。

## インストール
各ディストリビューション向けのパッケージが公開されているので、それを使えばErlangのインストールなしで使用できます。

http://basho.co.jp/resources/downloads/
をブラウザで開いて、

今回の環境はUbuntuだったのでUbuntu用パッケージを落とします。
**Riak -> 1.2 -> 1.2.1 -> ubuntu -> precise -> riak-1.2.1-1_amd64.deb**
をダウンロード。

ちなみに、すでに1.3系のパッケージも出てますが、こちらはGUI画面がきちんと表示されませんでした。ので1.2.1をインストールします。

おもむろにインストール
``` $ sudo dpkg -i riak_1.2.1-1_amd64.deb ```

## 起動
上記でインストールした場合、/etc/init.d/　以下にriakというファイル名で起動スクリプトが生成されていますので、これで起動を行います。
```$ /etc/init.d/riak start```

## Web管理画面
riakには便利なWeb管理画面がついていますが、これはデフォルト状態ではつかえないようです。
使用するには一旦riakを止めて、設定変更しなければなりません。
編集するファイルは"/etc/riak/app.config"です。
編集するのは

```/etc/riak/app.config
              %% http is a list of IP addresses and TCP ports that the Riak
              %% HTTP interface will bind.
              %{http, [ {"127.0.0.1", 8098 } ]}, % <- 無効にする 

              %% https is a list of IP addresses and TCP ports that the Riak
              %% HTTPS interface will bind.
              {https, [{ "127.0.0.1", 8098 }]},  % <- 有効にする

              %% Default cert and key locations for https can be overridden
              %% with the ssl config variable, for example:
              
              % 以下4行を有効にする
              {ssl, [
                     {certfile, "/etc/riak/cert.pem"}, 
                     {keyfile, "/etc/riak/key.pem"}
                    ]},
```

やってることは
1. {http, [{"127.0.0.1", 8098 } ]}をコメントアウト
2. {https, [{ "127.0.0.1", 8098 }]}を有効に
3. {ssl, [...省略...]}を有効に

ただし、SSL関係のファイルはパッケージには含まれていないので、自分で作るか、適当にとってきます。
今回はriakのgithubレポジトリからとってきました。

```
$ cd /etc/riak
$ sudo wget http://raw.github.com/basho/riak/master/rel/files/cert.pem
$ sudo wget http://raw.github.com/basho/riak/master/rel/files/key.pem

$ ls
app.config  cert.pem  key.pem  vm.args
```

それと、同じファイルの297行めあたりの"riak_control"のところで、管理画面を有効にします。

```/etc/riak/app.config
%% riak_control config
 {riak_control, [
                %% Set to false to disable the admin panel.
                {enabled, true}, %% <-trueに変更

                %% Authentication style used for access to the admin
                %% panel. Valid styles are 'userlist' <TODO>.
                {auth, userlist},

                %% If auth is set to 'userlist' then this is the
                %% list of usernames and passwords for access to the
                %% admin panel.
                {userlist, [{"guest", "hogepassword"} % <- ユーザ名とパスワード
                           ]},

                %% The admin panel is broken up into multiple
                %% components, each of which is enabled or disabled
                %% by one of these settings.
                {admin, true}
                ]}
```

やったのは
1. {enabled, false}]} を {enabled, true}に変更。
2. {userlist, [...]}にログインユーザ名とパスワードの組を追加
です。

変更したら再起動。
```$ sudo /etc/init.d/riak stop```
```$ sudo /etc/init.d/riak start```

riakの管理画面にブラウザからアクセス
https://127.0.0.1:8098/admin

左のメニューからClusterやRingをクリックすると稼働状態が見られると思います。
それと、別のノードを追加したい場合は、Clusterメニューの"Add Nodes to the Cluster..."から追加できます。

## 保存方式の変更
riakはデフォルトでbitcaskという方式で保存するようです。これはキーをメモリ上にもち、データをディスク上に持つようです。
他にもleveldbという、キーもデータもディスク上に持つ方法と、全てメモリ上に持つ方法があるようです。

どれか一つだけを使うように設定変更もできますが、multiで設定しておくと選択できます。

```/etc/riak/app.config
 {riak_kv, [
            %% Storage_backend specifies the Erlang module defining the storage
            %% mechanism that will be used on this node.
            {storage_backend, riak_kv_multi_backend},

            {multi_backend_default, <<"elevel_db">>},
            {multi_backend, [
                              {<<"bitcask">>,  riak_kv_bitcask_backend, [
                                {data_root, "/var/lib/riak/bitcask"}
                              ]},

                              {<<"elevel_db">>,  riak_kv_eleveldb_backend, [
                                {data_root, "/var/lib/riak/leveldb"}
                              ]}
                            ]},
```

上記のような設定にすればデフォルトでlevel_dbを使用し、指定すればbitcaskも使用できるようです。
やってることは、

1. {storage_backend, riak_kv_bitcask_backend} を {storage_backend, riak_kv_multi_backend}に変更。
2. multi_backend_defaultに<<"elevel_db">>を指定。
3. multi_backendに<<"bitcask">>と<<"elevel_db">>を追加してそれぞれのデータ保存先を設定。

です。
後はriakを再起動すれば新たに"/var/lib/riak/leveldb"というディレクトリが作られて、指定しなければそちらに保存されるようになります。

## 他ホストから使用できるようにする
riakはデフォルトでローカルからの接続のみ受け付けます。分散に関してもそうで、デフォルトでは他のホストとクラスタ構成を組むことができません。
これらを可能にするには、"/etc/riak/vm.args"と"/etc/riak/app.config"内の"127.0.0.1"を全て、そのマシンのIPアドレスに変えます。多分FQDNでもいいと思いますが試してません。

```/etc/riak/vm.args
-name riak@192.168.0.100
```
"riak@127.0.0.1" を "riak@マシンのIPアドレス"に修正します。

```/etc/riak/app.config
 {riak_api, [
             ....
            {pb_ip,   "192.168.0.100" },
             ....
            ]},

 {riak_core, [
             ....
              {https, [{ "192.168.0.100", 8098 }]},
             ....
             ]},
```

再起動すると有効になります。
注意が必要なのは、この場合、もう127.0.0.1でのアクセスはできなくなるので、管理画面もこのIPアドレスで接続しなければなりません。
https://192.168.0.100:8098/admin

### ホストの追加
なお、これで他のホストとクラスタ構成を組めますが、新規でホストを追加する際は管理画面のClusterメニューに追加するホストのノード名(/etc/riak/vm.argsに設定した名前。例： riak@192.168.0.101)を入力して[Add Node]をクリックすればいいです。あんまり簡単にできて拍子抜けしました＾＾；

## データの保存
データの保存には各言語向けのライブラリが出ているので、それを使うといいですが、手っ取り早くコマンドラインから試してみます。

**curlが入っていない場合はインストール**
```$ sudo apt-get install curl```

**"hello world"という内容のデータを、"mykey001"というキーで保存する。**

```
$ curl -i -H "Content-Type: plain/text" -d "helo world" https://192.168.0.100:8098/buckets/test_bucket/keys/mykey001 --insecure
```

**"hello world 2"という内容のデータを、"mykey002"というキーで保存する。**

```
$ curl -i -H "Content-Type: plain/text" -d "helo world 2" https://192.168.0.100:8098/buckets/test_bucket/keys/mykey002 --insecure
```

IPアドレスの部分は環境に合わせて適当にかえてください。

**現在"test_bucket"に保存されているキーのリストを取得する**

```
$ curl https://192.168.0.100:8098/buckets/test_bucket/keys?keys=true --insecure

{"keys":["mykey002","mykey001"]}
```

**値を取得してみる**

```
$ curl https://192.168.0.100:8098/buckets/test_bucket/keys/mykey001 --insecure

helo world
```