強い整合性


[この前](http://qiita.com/saisa6153/items/3bbd719a17839568fa49)の記事の通り、Riakは結果整合性(Eventual Consistency)にもとづき取り扱う。
これに加えてRiak2.0では、強い整合性(Strong Consistency)が設定可能になる予定だ。

## [Strong Consistency](https://github.com/basho/riak_core/pull/441)
2.0のriak.confには、以下の記述がある。

```riak.conf
# Enable consensus subsystem (tech preview feature)
## Set to true to enable the consensus subsystem used for strongly
## consistent Riak operations.
## enable_consensus = true
```
このenable_consensus = trueをアンコメントして再起動すれば、強い整合性を設定可能になる。
Riak Meetup Tokyo #3でのスライドを引用して、実際に強い整合性を使ってみた。

<iframe src="http://www.slideshare.net/slideshow/embed_code/27960010?startSlide=21" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/shino/riak-meetup-3-20131106-riak-meetup3riak20pre5" title="Riak 2.0 pre5 @ Riak Meetup #3" target="_blank">Riak 2.0 pre5 @ Riak Meetup #3</a> </strong> from <strong><a href="http://www.slideshare.net/shino" target="_blank">Shunichi Shinohara</a></strong> </div>

riak.confを修正・再起動して設定を有効にした後、対象Bucketに強い整合性を設定する。

```
➜  riak git:(a12d5a2) ✗ rel/riak/bin/riak-admin bucket-type \
> create sc '{"props": {"consistent": true}}'
sc created
➜  riak git:(a12d5a2) ✗ rel/riak/bin/riak-admin bucket-type activate sc
sc has been activated
```
そうしたら、あとは実際にデータを投げてみる。

```
➜  riak git:(a12d5a2) ✗ curl -XPUT http://localhost:8098/types/sc/buckets/mybucket/keys/mykey -d "data1"
➜  riak git:(a12d5a2) ✗ curl -XPUT http://localhost:8098/types/sc/buckets/mybucket/keys/mykey -d "data2"
<html><head><title>412 Precondition Failed</title></head><body><h1>Precondition Failed</h1>Precondition Failed<p><hr><address>mochiweb+webmachine web server</address></body></html>
```
結果整合の時とは異なり、Siblingではなくエラーが返って来た。
書き込まれていない。
GETでVClockの値を読んで、それを使ってPUSHすれば、値の上書きができる。

```
➜  riak git:(a12d5a2) ✗ curl -v http://localhost:8098/types/sc/buckets/mybucket/keys/mykey
* Adding handle: conn: 0x7f84ab004000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7f84ab004000) send_pipe: 1, recv_pipe: 0
* About to connect() to localhost port 8098 (#0)
*   Trying ::1...
*   Trying fe80::1...
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8098 (#0)
> GET /types/sc/buckets/mybucket/keys/mykey HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:8098
> Accept: */*
>
< HTTP/1.1 200 OK
< X-Riak-Vclock: a85hYGBgzGBKYWBJLU4tzGDKY2Vo4gUKAWlLLfUzfFkA
< Vary: Accept-Encoding
* Server MochiWeb/1.1 WebMachine/1.10.5 (jokes are better explained) is not blacklisted
< Server: MochiWeb/1.1 WebMachine/1.10.5 (jokes are better explained)
< Link: </buckets/mybucket>; rel="up"
< Last-Modified: Thu, 19 Dec 2013 08:28:41 GMT
< ETag: "7Xmuz8KIPEqAGDUJVstdqc"
< Date: Thu, 19 Dec 2013 08:30:49 GMT
< Content-Type: application/x-www-form-urlencoded
< Content-Length: 5
<
* Connection #0 to host localhost left intact
data1

➜  riak git:(a12d5a2) ✗ curl -XPUT http://localhost:8098/types/sc/buckets/mybucket/keys/mykey\
> -H 'X-Riak-Vclock: a85hYGBgzGBKYWBJLU4tzGDKY2Vo4gUKAWlLLfUzfFkA' -d "data3"

➜  riak git:(a12d5a2) ✗ curl -v http://localhost:8098/types/sc/buckets/mybucket/keys/mykey
data3
```

この設定はバケット毎にBucket Typeで行うので、同じRiakクラスタ内で、Bucket毎でデータの特性にあわせて整合性の使い分けが可能だ。

アプリケーションでSiblingの解決の手間が省けるので良いといえば良いのだが、現段階ではTeck Previewであるので、実用にはまだ検証が必要なのかもしれない。