Riak Meetup Tokyo 2 に参加してきた #riakjp

2013/07/10 Yahoo! JAPAN にて開催された Riak Meetup Tokyo #2 に参加してきたのでメモ

セッション1
FreakOut 久森さん 「Riak環境をプロダクションで構築&運用してみた(仮)」

RTB (こっちじゃない) という「50ms or die」な環境で Riak を導入してみて...というお話。
SSP からのリクエストに 100ms 以内にリクエストを返さないと、リクエストすら来なくなるというハードな世界。ネットワークの TTL が 10ms 程度で、アプリ側の処理は 50ms に抑えたいという。
このような環境でデータストアとして Kyoto なんとか Tokyo なんとかを使ってきたがアプリ側での計算による分散であるため、スケールアウトが容易ではないという問題を解決するために Riak の導入にチャレンジしている。

構成はアプリとの間に HA Proxy を挟む Engine Yard 方式 (前回の Meetup で紹介されていました) を採用。

で、どうだったかというと HA Proxy が RoundRobin などで振り分けてしまうため、実際に必要なデータを持っていない node に振られることが多く、その場合、そこから更にデータを持っている node から取ってきて返すという処理 (Redirect) が発生し、そのレスポンス待ちでアプリの worker が詰まってしまい 100ms を超えてしまう状況が発生してしまった。
今後は HA Proxy の層を撤廃し、どの node がデータを持っているかを bucket と key から計算してダイレクトに node に問い合わせる方法を検討されているとのこと。

FreakOut のアプリは Perl がメインで今回の Riak クライアントも Perl (XS) で実装。
既存の Perl Module は遅かったので自作されたとのこと。Protocol は PBC https://github.com/myfinder/p5-riak-lite
パフォーマンス比較 https://gist.github.com/myfinder/5232845

Riak を空きポートで起動させてテストするためのコードも https://github.com/myfinder/p5-riak-lite-pbc

@johtani さんの Riak Meetup Tokyo #2に参加しました。 を見て思い出したので追記 (2013/7/11)

  • HA Proxy 構成では厳しいので今はホットなデータを memcached にキャッシュしている
  • Riak の backend は Bitcask (とりあえずデフォルトで評価というのと expire 機能に期待)
  • Bucket の r, w は最初デフォルトの r:2, w:3 で、r:1 に変えてみたけど求める速度には至らなかった

LT
IIJ 曽我部さん、田中さん 「Yokozuna 日本語検索性能を評価しました」

Riak に Solr を組み合わせた Yokozuna というものが日本語に対応したということで、その検証レポート。まだまだ検証途中のようです。

Solr だからスキーマは定義して上げる必要がある。Bucket 単位で Solr の core を作成する。データは yz_extractor が plain text / JSON / XML を parse してくれる。

タイトルだけ見た段階では、「それなら Elastic Search じゃない?」って思いましたが Riak へのデータ登録、削除、node の増減にも追随するということなら良いかもと思いました。が、そのあたりはまだテストできてないとのことでしたので要望として上げておこう。

  • すでにデータの存在する Bucket に設定すると index してくれるのか
  • Re-index する機能があるのか
  • スキーマを変えたい時は別のスキーマを指定した index を追加して切り替えられるのか
  • データの更新・削除は index に反映されるのか
  • node の追加、削除時に hand off に合わせて index も移動するのか
  • Solr (Java) だけが一時的に落ちてしまった場合の対応方法 (Java のチューニングで再起動とかはありそう)
  • Solr への登録は同期?非同期?

とか?

Solr の distributed search って全部からの応答を待つし、一つでもエラーがあったらエラーになってしまう記憶があるので、ちょっとでも遅いサーバーがあったりすると全体に影響するのかな?

しかし、テストのために32台もの結構良いスペックのサーバーが使えるなんて IIJ さんうらやましい。

Drinkup

Riak Drinkup Tokyo #2
こちらも参加させていただきました。ごちそうさまでした。

おまけ

Bucket と Key から Hash 値を取得する方法とか、Hash 値から node を取得する方法とか書いてあるサイト見つけました。参考になる。

第2回 NOSQL実機ハンズオン(Riak、Hibari)
https://github.com/ossforum-jp-nosql/hands-on

Riak Meetup に参加してきた

雪で延期となっていた Riak Meetup Tokyo に参加してきました。

@kuenishi さんから Riak の概要と RICON 2012 (Riakに限らず分散ストレージ関連のカンファレンス、Basho主催なのでRiakの話題は多い) の紹介がありました。
みんな MonboDB、CouchDB、MySQL から Riak に移行してますよと。後で動画や資料を見てみよう。

Riak については「7つのデータベース7つの世界」の3章を読むのが良いと思います。@kuenishi さんもそう言われてましたし、私も今日読みました。日本語での一番詳しいドキュメントじゃないかなと。

株式会社IDCフロンティアさんからは CloudStack Collaboration Conference 2012 の紹介がありました、CloudStack は ASF に移されて主流になりつつあるらしい。
そして Riak を利用した AWS S3 と高い互換性をもつ分散ストレージの紹介、福島の白河と北九州とでの分散ということなので災害対策として悪くないんじゃないでしょうか。

EngineYard さんのサービスを使えば、ブラウザからポチポチすれば簡単に Riak クラスターが作成できますよと。10台でも20台でもポチッとなと。EngineYard では EC2 で Gentoo を使っているそうです。自由度が高いから boot 時間を短くしたりできるんだと。EC2の起動って結構待たされるんですよねぇと。
EngineYardパンダもらいました。ありがとうございます。

Beerup にも参加させていただきました。ごちそうさまでした。

次はシリアスなドロドロしたやつを。

Riak Admin GUI

Riak の bucket 設定とか、オブジェクトの管理ツールを Ruby on Rails の勉強がてら作ってみようかなぁと思ってたら...
ひとりでやるRiak Advent Calendar 2012 day1 - 入門 - kuenishi's blog
ん?!

しかし私は軟弱なのでGUIを使う。riak_controlというイカしたWeb UIがあるのだ。

なんですとっ!!標準添付されてた...
では早速試してみよう。

etc/app.config を書き換えて stop / start
http と https を両方有効にしてどちらも 0.0.0.0 で listen させて、http から admin_gui にアクセスしようとしたら https://0.0.0.0:xxx/ というリンクになってたからここは 0.0.0.0 は使わないほうが良さそう。

そしてアクセスしてみた。かっちょいい!!



あれれ?? Bucket の設定とか Object の操作するインターフェースがないなぁ。上西さんの blog の画像にはそんな機能が見えるのにな(グレーアウトしてる感じだけど)
1.2.1 だけどどうやってインストールしたんだっけなぁ
Installing Riak from source package これか。git clone してるな。

Riak cluster を試してみる

前回 (Installing Riak from source package) Riak を source からインストールして 3 node の cluster をセットアップしたので、これを使って cluster の操作をテストしてみる。

まず、cluster 操作は node 追加と削除などを同時に行えるように riak-admin で join や leave を実行した後に commit コマンドで反映させる仕様となっている。

まずは、3台で cluster を組んでいる状態

$ rel/riak1/bin/riak-admin member-status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      34.4%      --      'riak1@127.0.0.1'
valid      32.8%      --      'riak2@127.0.0.1'
valid      32.8%      --      'riak3@127.0.0.1'
-------------------------------------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

ここに node4 を追加してみる

$ rel/riak4/bin/riak start

$ rel/riak4/bin/riak-admin cluster join riak1@127.0.0.1
Success: staged join request for 'riak4@127.0.0.1' to 'riak1@127.0.0.1'

$ rel/riak4/bin/riak-admin cluster plan
=============================== Staged Changes ================================
Action         Nodes(s)
-------------------------------------------------------------------------------
join           'riak4@127.0.0.1'
-------------------------------------------------------------------------------


NOTE: Applying these changes will result in 1 cluster transition

###############################################################################
                         After cluster transition 1/1
###############################################################################

================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      34.4%     25.0%    'riak1@127.0.0.1'
valid      32.8%     25.0%    'riak2@127.0.0.1'
valid      32.8%     25.0%    'riak3@127.0.0.1'
valid       0.0%     25.0%    'riak4@127.0.0.1'
-------------------------------------------------------------------------------
Valid:4 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

Transfers resulting from cluster changes: 47
  5 transfers from 'riak2@127.0.0.1' to 'riak3@127.0.0.1'
  10 transfers from 'riak3@127.0.0.1' to 'riak1@127.0.0.1'
  16 transfers from 'riak2@127.0.0.1' to 'riak4@127.0.0.1'
  16 transfers from 'riak1@127.0.0.1' to 'riak2@127.0.0.1'

$ rel/riak4/bin/riak-admin cluster commit
Cluster changes committed

追加されて、既存データのリバランスが行われる

$ rel/riak4/bin/riak-admin member-status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      32.8%     25.0%    'riak1@127.0.0.1'
valid      34.4%     25.0%    'riak2@127.0.0.1'
valid      28.1%     25.0%    'riak3@127.0.0.1'
valid       4.7%     25.0%    'riak4@127.0.0.1'
-------------------------------------------------------------------------------
Valid:4 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

$ rel/riak4/bin/riak-admin transfers
'riak4@127.0.0.1' waiting to handoff 59 partitions
'riak3@127.0.0.1' waiting to handoff 3 partitions
'riak2@127.0.0.1' waiting to handoff 8 partitions
'riak1@127.0.0.1' waiting to handoff 6 partitions

Active Transfers:

$ rel/riak4/bin/riak-admin member-status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      32.8%     25.0%    'riak1@127.0.0.1'
valid      32.8%     25.0%    'riak2@127.0.0.1'
valid      23.4%     25.0%    'riak3@127.0.0.1'
valid      10.9%     25.0%    'riak4@127.0.0.1'
-------------------------------------------------------------------------------
Valid:4 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

リバランス (handoff) 完了

$ rel/riak4/bin/riak-admin member-status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      25.0%      --      'riak1@127.0.0.1'
valid      25.0%      --      'riak2@127.0.0.1'
valid      25.0%      --      'riak3@127.0.0.1'
valid      25.0%      --      'riak4@127.0.0.1'
-------------------------------------------------------------------------------
Valid:4 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

さらに追加して5 nodeにしてみる
(20% x5 とはならなかった)

$ rel/riak5/bin/riak-admin member-status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      18.8%      --      'riak1@127.0.0.1'
valid      18.8%      --      'riak2@127.0.0.1'
valid      18.8%      --      'riak3@127.0.0.1'
valid      25.0%      --      'riak4@127.0.0.1'
valid      18.8%      --      'riak5@127.0.0.1'
-------------------------------------------------------------------------------
Valid:5 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

そしてデータを足してみた

$ du -sh rel/riak?/data/bitcask
129M	rel/riak1/data/bitcask
121M	rel/riak2/data/bitcask
126M	rel/riak3/data/bitcask
168M	rel/riak4/data/bitcask
131M	rel/riak5/data/bitcask

node5 を SIGKILL で停止させてみる

$ rel/riak1/bin/riak-admin ring-status
================================== Claimant ===================================
Claimant:  'riak2@127.0.0.1'
Status:     up
Ring Ready: true

============================== Ownership Handoff ==============================
No pending changes.

============================== Unreachable Nodes ==============================
The following nodes are unreachable: ['riak5@127.0.0.1']

WARNING: The cluster state will not converge until all nodes
are up. Once the above nodes come back online, convergence
will continue. If the outages are long-term or permanent, you
can either mark the nodes as down (riak-admin down NODE) or
forcibly remove the nodes from the cluster (riak-admin
force-remove NODE) to allow the remaining nodes to settle.

この状態で先ほど登録したデータは全て無事に取得できました、
ではもう一台強制停止してみよう

$ rel/riak1/bin/riak-admin ring-status
================================== Claimant ===================================
Claimant:  'riak2@127.0.0.1'
Status:     up
Ring Ready: true

============================== Ownership Handoff ==============================
No pending changes.

============================== Unreachable Nodes ==============================
The following nodes are unreachable: ['riak4@127.0.0.1','riak5@127.0.0.1']

WARNING: The cluster state will not converge until all nodes
are up. Once the above nodes come back online, convergence
will continue. If the outages are long-term or permanent, you
can either mark the nodes as down (riak-admin down NODE) or
forcibly remove the nodes from the cluster (riak-admin
force-remove NODE) to allow the remaining nodes to settle.

2 node 止まってしまうと取得できなくなってしまったオブジェクトがでてきました
でも bucket の設定で v_val は 3 ですから 3 つのコピーがあるはずなので 2 台が停止してしまっても取得できることが期待されます。そこで r = quorum を r = 1 にしてしまいましょう。
r の default は quorum でこれは n_val/2+1 です。n_val の過半数が正常でないとオブジェクトが取得できません。(HTTP Bucket Properties)

{
  props: {
    name: "test",
    allow_mult: false,
    basic_quorum: false,
    big_vclock: 50,
    chash_keyfun: {
      mod: "riak_core_util",
      fun: "chash_std_keyfun"
    },
    dw: "quorum",
    last_write_wins: false,
    linkfun: {
      mod: "riak_kv_wm_link_walker",
      fun: "mapreduce_linkfun"
    },
    n_val: 3,
    notfound_ok: true,
    old_vclock: 86400,
    postcommit: [ ],
    pr: 0,
    precommit: [ ],
    pw: 0,
    r: "quorum",
    rw: "quorum",
    small_vclock: 50,
    w: "quorum",
    young_vclock: 20
  }
}
$ curl -X PUT \
>  -H "Content-Type: application/json" \
>  -d '{"props":{ "r": 1}}' \
>  http://localhost:8298/buckets/test/props

無事に全てのオブジェクトを取得できました。やったね!
死んでしまった node4, node5 をきちんと消してしまいましょう。

$ rel/riak1/bin/riak-admin cluster force-remove riak5@127.0.0.1
Success: staged remove request for 'riak5@127.0.0.1'

$ rel/riak1/bin/riak-admin cluster force-remove riak4@127.0.0.1
Success: staged remove request for 'riak4@127.0.0.1'

$ rel/riak1/bin/riak-admin cluster plan
Cannot plan until cluster state has converged.
Check 'Ring Ready' in 'riak-admin ring_status'

おっと、みんな集まらないと plan は実行できないよと。node4, node5 はもういないから集まれないんだよと教えてあげる必要があるみたいです。

$ rel/riak1/bin/riak-admin down riak5@127.0.0.1
Success: "riak5@127.0.0.1" marked as down

$ rel/riak1/bin/riak-admin down riak4@127.0.0.1
Success: "riak4@127.0.0.1" marked as down

$ rel/riak1/bin/riak-admin cluster plan
=============================== Staged Changes ================================
Action         Nodes(s)
-------------------------------------------------------------------------------
force-remove   'riak4@127.0.0.1'
force-remove   'riak5@127.0.0.1'
-------------------------------------------------------------------------------

WARNING: All of 'riak4@127.0.0.1' replicas will be lost
WARNING: All of 'riak5@127.0.0.1' replicas will be lost

NOTE: Applying these changes will result in 1 cluster transition

###############################################################################
                         After cluster transition 1/1
###############################################################################

================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      34.4%     34.4%    'riak1@127.0.0.1'
valid      32.8%     32.8%    'riak2@127.0.0.1'
valid      32.8%     32.8%    'riak3@127.0.0.1'
-------------------------------------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

WARNING: Not all replicas will be on distinct nodes

Partitions reassigned from cluster changes: 28
  5 reassigned from 'riak4@127.0.0.1' to 'riak3@127.0.0.1'
  4 reassigned from 'riak5@127.0.0.1' to 'riak3@127.0.0.1'
  5 reassigned from 'riak4@127.0.0.1' to 'riak2@127.0.0.1'
  4 reassigned from 'riak5@127.0.0.1' to 'riak2@127.0.0.1'
  6 reassigned from 'riak4@127.0.0.1' to 'riak1@127.0.0.1'
  4 reassigned from 'riak5@127.0.0.1' to 'riak1@127.0.0.1'

Transfers resulting from cluster changes: 34
  4 transfers from 'riak1@127.0.0.1' to 'riak3@127.0.0.1'
  4 transfers from 'riak1@127.0.0.1' to 'riak2@127.0.0.1'
  3 transfers from 'riak3@127.0.0.1' to 'riak2@127.0.0.1'
  4 transfers from 'riak2@127.0.0.1' to 'riak1@127.0.0.1'
  4 transfers from 'riak5@127.0.0.1' to 'riak3@127.0.0.1'
  4 transfers from 'riak3@127.0.0.1' to 'riak1@127.0.0.1'
  3 transfers from 'riak2@127.0.0.1' to 'riak3@127.0.0.1'
  4 transfers from 'riak5@127.0.0.1' to 'riak2@127.0.0.1'
  4 transfers from 'riak5@127.0.0.1' to 'riak1@127.0.0.1'

$ rel/riak1/bin/riak-admin cluster commit
Cluster changes committed
$ rel/riak1/bin/riak-admin member-status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      31.3%     34.4%    'riak1@127.0.0.1'
valid      34.4%     32.8%    'riak2@127.0.0.1'
valid      34.4%     32.8%    'riak3@127.0.0.1'
-------------------------------------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

掃除終了

$ rel/riak1/bin/riak-admin member-status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      34.4%      --      'riak1@127.0.0.1'
valid      32.8%      --      'riak2@127.0.0.1'
valid      32.8%      --      'riak3@127.0.0.1'
-------------------------------------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

r を quorum に戻して全てのオブジェクトが取得できるかテスト

$ curl -X PUT \
>  -H "Content-Type: application/json" \
>  -d '{"props":{ "r": "quorum" }}' \
>  http://localhost:8298/buckets/test/props

無事全てのオブジェクトが取得できました。

node4, node5 としてはまだ cluster に参加しているつもりなので、再度起動してきたらどうなるのだろうか?と気になるところですが、きちんと起動時に確認して、もうメンバーでないことを認識して自ら自分の片付けをして shutdown します。

では、最後に通常の node 削除を試してみる

$ rel/riak1/bin/riak-admin cluster leave riak3@127.0.0.1
Success: staged leave request for 'riak3@127.0.0.1'

$ rel/riak1/bin/riak-admin cluster plan
=============================== Staged Changes ================================
Action         Nodes(s)
-------------------------------------------------------------------------------
leave          'riak3@127.0.0.1'
-------------------------------------------------------------------------------


NOTE: Applying these changes will result in 2 cluster transitions

###############################################################################
                         After cluster transition 1/2
###############################################################################

================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
leaving    32.8%      0.0%    'riak3@127.0.0.1'
valid      34.4%     50.0%    'riak1@127.0.0.1'
valid      32.8%     50.0%    'riak2@127.0.0.1'
-------------------------------------------------------------------------------
Valid:2 / Leaving:1 / Exiting:0 / Joining:0 / Down:0

WARNING: Not all replicas will be on distinct nodes

Transfers resulting from cluster changes: 42
  10 transfers from 'riak3@127.0.0.1' to 'riak2@127.0.0.1'
  10 transfers from 'riak2@127.0.0.1' to 'riak1@127.0.0.1'
  11 transfers from 'riak1@127.0.0.1' to 'riak2@127.0.0.1'
  11 transfers from 'riak3@127.0.0.1' to 'riak1@127.0.0.1'

###############################################################################
                         After cluster transition 2/2
###############################################################################

================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      50.0%      --      'riak1@127.0.0.1'
valid      50.0%      --      'riak2@127.0.0.1'
-------------------------------------------------------------------------------
Valid:2 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

WARNING: Not all replicas will be on distinct nodes

$ rel/riak1/bin/riak-admin cluster commit
Cluster changes committed

データは node1, node2 に寄せられています。node3 は leave コマンドで node1,2 に handoff することで空っぽになってます。

$ du -sh rel/riak?/data/bitcask
316M	rel/riak1/data/bitcask
279M	rel/riak2/data/bitcask
12K	rel/riak3/data/bitcask
198M	rel/riak4/data/bitcask
131M	rel/riak5/data/bitcask

ざっと簡単なパターンのクラスターオペレーションを試してみました。簡単ですね。
Riak CS でないと認証機能がないのがちょっとつらい。認証つけた Proxy を前に置くのかなぁ。

次回はもっと深いところを調べてみよう。

Installing Riak from source package

運用が楽な KVS ということで Riak をテストしてみる
1サーバーに複数 node を起動させて\クラスタのテストをする ( Running-Multiple-Nodes-on-One-Host ) ために source から入れてみる ( bin/riak は shell script でこいつを書き換えれば各種ディレクトリを指定できるので package で Riak を入れても1サーバーで複数起動させられそう )

まずは Erlang のインストール

Installing Erlang を参考にインストールする

安易に最新版を使ってはいけない。Riak 1.2, 1.2.1 の場合は R15B01 をインストールする。
Ruby の rvm みたいな kerl を使う

$ curl -o ~/bin/kerl https://raw.github.com/spawngrid/kerl/master/kerl
$ chmod a+x ~/bin/kerl
$ sudo yum install gcc glibc-devel make ncurses-devel openssl-devel autoconf
$ kerl build R15B01 r15b01
Getting the available releases from erlang.org...
Downloading otp_src_R15B01.tar.gz to /home/ytera/.kerl/archives
Getting the checksum file from erlang.org...
Verifying archive checksum...
Checksum verified (f12d00f6e62b36ad027d6c0c08905fad)
Extracting source code
Building Erlang/OTP R15B01 (r15b01), please wait...
Erlang/OTP R15B01 (r15b01) has been successfully built
$ kerl list builds
R15B01,r15b01
$ kerl install r15b01 ~/erlang/r15b01
Installing Erlang/OTP R15B01 (r15b01) in /home/ytera/erlang/r15b01...
You can activate this installation running the following command:
. /home/ytera/erlang/r15b01/activate
Later on, you can leave the installation typing:
kerl_deactivate
$ kerl list installations
r15b01 /home/ytera/erlang/r15b01
$ kerl active
No Erlang/OTP kerl installation is currently active
$ . /home/ytera/erlang/r15b01/activate
$ kerl active
The current active installation is:
/home/ytera/erlang/r15b01
$ erl -version
Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 5.9.1

次は Riak を GitHub から Download してインストール

Installing Riak from Source を参考にインストール

$ git clone git://github.com/basho/riak.git
Initialized empty Git repository in /home/ytera/riak/.git/
remote: Counting objects: 13705, done.
remote: Compressing objects: 100% (4461/4461), done.
remote: Total 13705 (delta 8951), reused 13573 (delta 8837)
Receiving objects: 100% (13705/13705), 10.16 MiB | 3.49 MiB/s, done.
Resolving deltas: 100% (8951/8951), done.
$ cd riak
$ make rel

クラスタを構成する3つの node を起動するための準備

まずはコピー

$ for i in 1 2 3; do cp -a rel/riak rel/riak$i; done

port を変更する

Riak は Protocol Buffer (pb_port) と HTTP (http) をサポートしている
pb_port: 8087 -> 8187,8287,8387 (Protocol Buffer)
http: 8098 -> 8198, 8298, 8398 (HTTP or HTTPS)
handoff_port: 8099 -> 8199,9299,8399 (cluster 制御用)

Protocol Buffer と HTTP では他のサーバーからのアクセスできるように bind address を 0.0.0.0 に変更している

$ vi rel/riak1/etc/app.config
$ diff -u rel/riak{,1}/etc/app.config
--- rel/riak/etc/app.config	2013-01-12 23:54:38.000000000 +0900
+++ rel/riak1/etc/app.config	2013-01-13 14:18:45.052914322 +0900
@@ -12,11 +12,11 @@
 
             %% pb_ip is the IP address that the Riak Protocol Buffers interface
             %% will bind to.  If this is undefined, the interface will not run.
-            {pb_ip,   "127.0.0.1" },
+            {pb_ip,   "0.0.0.0" },
 
             %% pb_port is the TCP port that the Riak Protocol Buffers interface
             %% will bind to
-            {pb_port, 8087 }
+            {pb_port, 8187 }
             ]},
 
  %% Riak Core config
@@ -30,7 +30,7 @@
 
               %% http is a list of IP addresses and TCP ports that the Riak
               %% HTTP interface will bind.
-              {http, [ {"127.0.0.1", 8098 } ]},
+              {http, [ {"0.0.0.0", 8198 } ]},
 
               %% https is a list of IP addresses and TCP ports that the Riak
               %% HTTPS interface will bind.
@@ -45,7 +45,7 @@
 
               %% riak_handoff_port is the TCP port that Riak uses for
               %% intra-cluster data handoff.
-              {handoff_port, 8099 },
+              {handoff_port, 8199 },
 
               %% To encrypt riak_core intra-cluster data handoff traffic,
               %% uncomment the following line and edit its path to an
$ vi rel/riak1/etc/vm.args
$ diff -u rel/riak{,1}/etc/vm.args
--- rel/riak/etc/vm.args	2013-01-12 23:54:38.000000000 +0900
+++ rel/riak1/etc/vm.args	2013-01-13 14:18:53.802141554 +0900
@@ -1,5 +1,5 @@
 ## Name of the riak node
--name riak@127.0.0.1
+-name riak1@127.0.0.1
 
 ## Cookie for distributed erlang.  All nodes in the same cluster
 ## should use the same cookie or they will not be able to communicate.
$ vi rel/riak2/etc/vm.args
$ vi rel/riak3/etc/vm.args

Riak を起動させて、クラスターを組む

一つ目の Riak を起動させると epmd という process も起動する、これは Riak の node がお互いに探しあうために使われているようだ (Riak Users - epmd daemon runs after riak stops)
そして、Riak を停止しても epmd は停止しないが、これは放置で問題ないとのこと

$ rel/riak1/bin/riak start
$ rel/riak2/bin/riak start
$ rel/riak3/bin/riak start
$ rel/riak2/bin/riak-admin cluster join riak1@127.0.0.1
Success: staged join request for 'riak2@127.0.0.1' to 'riak1@127.0.0.1'
$ rel/riak3/bin/riak-admin cluster join riak1@127.0.0.1
Success: staged join request for 'riak3@127.0.0.1' to 'riak1@127.0.0.1'
$ rel/riak2/bin/riak-admin cluster plan
=============================== Staged Changes ================================
Action         Nodes(s)
-------------------------------------------------------------------------------
join           'riak2@127.0.0.1'
join           'riak3@127.0.0.1'
-------------------------------------------------------------------------------


NOTE: Applying these changes will result in 1 cluster transition

###############################################################################
                         After cluster transition 1/1
###############################################################################

================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid     100.0%     34.4%    'riak1@127.0.0.1'
valid       0.0%     32.8%    'riak2@127.0.0.1'
valid       0.0%     32.8%    'riak3@127.0.0.1'
-------------------------------------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0

WARNING: Not all replicas will be on distinct nodes

Transfers resulting from cluster changes: 42
  21 transfers from 'riak1@127.0.0.1' to 'riak3@127.0.0.1'
  21 transfers from 'riak1@127.0.0.1' to 'riak2@127.0.0.1'

$ rel/riak2/bin/riak-admin cluster commit
Cluster changes committed

これで 8198,8298,8398 port にブラウザでアクセス可能となる。

テスト

データを登録してみる (キーの値を指定しない場合は自動採番される)

$ curl -v -d 'this is a test' -H "Content-Type: text/plain" http://127.0.0.1:8198/riak/test
* About to connect() to 127.0.0.1 port 8198 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 8198 (#0)
> POST /riak/test 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: 127.0.0.1:8198
> Accept: */*
> Content-Type: text/plain
> Content-Length: 14
> 
< HTTP/1.1 201 Created
< Vary: Accept-Encoding
< Server: MochiWeb/1.1 WebMachine/1.9.2 (someone had painted it blue)
< Location: /riak/test/8ug82sCaLj0HjrnKh8RxhyNVTW9
< Date: Sun, 13 Jan 2013 05:49:38 GMT
< Content-Type: text/plain
< Content-Length: 0
< 
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0

登録したデータの確認
3つのどの node にアクセスしても取得可能

$ curl http://127.0.0.1:8198/riak/test/8ug82sCaLj0HjrnKh8RxhyNVTW9
this is a test
$ curl http://127.0.0.1:8298/riak/test/8ug82sCaLj0HjrnKh8RxhyNVTW9
this is a test
$ curl http://127.0.0.1:8398/riak/test/8ug82sCaLj0HjrnKh8RxhyNVTW9
this is a test

クラスタのオペレーションやもっと高度なテストはまた今度。