今日も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がなくなるデータベースというもの沢山ありますね^^;