Riak 2.0のCRDTで遊ぶ

今日もRiakアドベントカレンダーの記事だよ! GLEE見てると"Call Me Maybe"という曲があって、それがなんとなくお気に入りな昨日今日です。今日はWebDB Forum 2013で話してきたCRDTの話。

CRDTって何よ?という人多いと思うので当日僕が話したスライドを見てほしい。

まとめると、絶対にデータをなくしたくないし可用性を下げたくないための可換データ型をRiakにネイティブで実装したよという話です*1。で、ちょっと使ってみようと。

Riak 2.0を落としてきて動かす

$ git clone git://github.com/basho/riak
$ cd riak
$ git checkout riak-2.0.0pre7 -b crdttest
$ make rel
$ ulimit -n 4096
$ rel/riak/bin/riak start

これで多分起動したはず。ここまでは簡単... riak-admin は riak と同じパスにあるので適当に読み替えて。

$ riak-admin bucket-type list
$ riak-admin bucket-type create stests '{"props":{"datatype":"set"}}'
stests created
$ riak-admin bucket-type activate stests
stests has been activated
$ riak-admin bucket-type list
stests (active)

これで or-set が使えるようになった。

HTTPで叩いてみる

$ curl -X POST http://localhost:8098/types/stests/buckets/s/datatypes/k \
    -H 'content-type: application/json' -d '{"add":"foobar"}'
$ http localhost:8098/types/stests/buckets/s/datatypes/k                               
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Length: 121
Content-Type: application/json
Date: Sun, 22 Dec 2013 12:34:56 GMT
Server: MochiWeb/1.1 WebMachine/1.10.5 (jokes are better explained)
Vary: Accept-Encoding

{
    "context": "SwEIGINsAAAAAWgCbQAAAAgjCf75UrbcDWEBagAAAAcBZm9vYmFyDYNsAAAAAWgCYQFhAWo=", 
    "type": "set", 
    "value": [
        "foobar"
    ]
}

これがすごいのは、多少ネットワークが切れようがサーバーが落ちようが成功したWriteとDeleteは絶対になくさないところ。Vector Clocks + Sibling Resolutionだとプログラミングが面倒なのだけど、今度は複数の値が読めるということもないので、ちょっと特性を理解しておけば今までのコードがほぼそのまま流用できるはずなので、みんなぜひ試してみてね!

参考

Riak SCR 14回のネタをほぼ流用しているので興味ある人はそちらもどうぞ。Riakのリビジョンはちょっと古いので注意。

*1:世の中にはWriteがなくなるデータベースというもの沢山ありますね^^;