StorageにTokyoCabinetを利用する方法

これまでは全てstorageにメモリーを指定してきましたが、物理ファイルを利用する方法を紹介します
![logo.png](https://qiita-image-store.s3.amazonaws.com/0/103558/9442a915-cdfd-051d-a811-6f1410caa919.png)

# 条件
server: 1台
storage type : <font color='red'><b>TokyoCabinet</b></font>
ruby version : v2.1
ROMA version : v1.2.0
Installation type : rubygems

# 手順
## 1. install ROMA
```
$ gem install roma
```

## 2. make instance(Cluster)
```
$ mkroute localhost_10001 localhost_10002 --replication_in_host
ls -l
  -rw-r--r-- 1 root root 35693 Dec  2 05:35 localhost_10001.route
  -rw-r--r-- 1 root root 35693 Dec  2 05:35 localhost_10002.route
```

## 3. TokyoCabinet インストール  
### libraryのインストール
- OSにあわせて以下のライブラリをinstallします
<table>
  <thead>
    <th>CentOS 6.x 7.x</th>
    <th>Ubuntu 14.x</th>
  </thead>
  <tr>
    <td>gcc</td>
    <td>gcc</td>
  </tr>
  <tr>
    <td>gcc-c++</td>
    <td>build-essential</td>
  </tr>
  <tr>
    <td>make</td>
    <td>make</td>
  </tr>
  <tr>
    <td>zlib-devel</td>
    <td>zlib1g-dev</td>
  </tr>
  <tr>
    <td>bzip2-devel</td>
    <td>libbz2-dev</td>
  </tr>
</table>

### Install TokyoCabinet Main unit
```
$ wget http://fallabs.com/tokyocabinet/tokyocabinet-1.4.48.tar.gz
$ tar -zxvf tokyocabinet-1.4.48.tar.gz
$ cd tokyocabinet-1.4.48
$ ./configure --prefix=/usr/local/libexec
$ make
$ sudo make install
```
- prefix等は必要であれば適宜変更してください

### Install Tokyo Cabinet Ruby gem
- RubyからTokyoCabinetを使用できるようにするgemです
- 現在のtokyocabinet gemはrubyのv1.9.2以降には対応していないので、以下から対応版をdownloadして手動でinstallします

```
$ wget https://github.com/roma/tokyocabinet-ruby/archive/v1.31.a.tar.gz
$ tar -zxvf v1.31.a.tar.gz
$ cd tokyocabinet-ruby-1.31.a
$ gem build tokyocabinet.gemspec
$ gem install --local tokyocabinet-1.31.a.gem -- --with-tokyocabinet-dir=/usr/local/libexec
$ gem list tokyocabinet
*** LOCAL GEMS ***
tokyocabinet (1.31.a)
```

### 確認
- ちゃんとinstall出来たかirbで確認できます

```irb
$ irb
YOUR_RUBY :001 > require 'tokyocabinet'
 => true
YOUR_RUBY :002 > include TokyoCabinet
 => Object
YOUR_RUBY :003 > hdb = HDB.new
 => #<TokyoCabinet::HDB:0x00000002854fd8 @hdb=#<TokyoCabinet::HDB_data:0x00000002854fb0>>
YOUR_RUBY :004 > hdb.open('test.tch', HDB::OWRITER | HDB::OCREAT)
 => true
YOUR_RUBY :005 > hdb["test"] = "ok"
 => "ok"
YOUR_RUBY :006 > hdb["test"]
 => "ok"
YOUR_RUBY :007 > hdb.close
 => true
YOUR_RUBY :008 > exit
```

## 4. config設定
```rb
$ mkconfig

Which storage will you use?
[1] Ruby Hash
[2] Tokyo Cabinet
[3] Groonga
> ### => 2を選択します
```
残りの設定はサーバや環境に合わせて入力してください
http://qiita.com/hiroaki-iwase/items/84bdce36f2f482e6c2c3

## 5. booting ROMA
```
romad localhost -p 10001 -d --config ./config.rb --replication_in_host
romad localhost -p 10002 -d --config ./config.rb --replication_in_host
```
- 作成したconfig.rbを指定してROMAを起動します

## 6. 確認
`storages[roma].storage.st_class`がTCStorageになっていればOKです

```
$ telnet localhost 10001

> stat storage
  stats.run_iterate_storage false
  stats.run_storage_clean_up false
  storages[roma].storage.storage_path /home/roma/localhost_10001/roma
  storages[roma].storage.st_class TCStorage
  storages[roma].storage.divnum 10
  storages[roma].storage.option bnum=5000000#xmsiz=16106127#opts=d#dfunit=10
  .
  .
  .
```

`storages[roma].storage.storage_path`にあるとおり`/home/roma/localhost_10001/roma`以下にTCファイルが作成されています

```
$ ls -l /home/roma/localhost_10001/roma
total 204880
-rw-r--r-- 1 roma roma 20975936 Dec  4 11:31 0.tc
-rw-r--r-- 1 roma roma 20975936 Dec  4 11:31 1.tc
-rw-r--r-- 1 roma roma 20975936 Dec  4 11:31 2.tc
-rw-r--r-- 1 roma roma 20975936 Dec  4 11:31 3.tc
-rw-r--r-- 1 roma roma 20975936 Dec  4 11:31 4.tc
-rw-r--r-- 1 roma roma 20975936 Dec  4 11:31 5.tc
-rw-r--r-- 1 roma roma 20975936 Dec  4 11:31 6.tc
-rw-r--r-- 1 roma roma 20975936 Dec  4 11:31 7.tc
-rw-r--r-- 1 roma roma 20975936 Dec  4 11:31 8.tc
-rw-r--r-- 1 roma roma 20975936 Dec  4 11:31 9.tc
-rw-rw-r-- 1 roma roma        0 Dec  4 11:31 lock
-rw-rw-r-- 1 roma roma        0 Dec  4 11:31 status.log.1
```
- 同じく/home/roma/localhost_10002/roma以下にも作成されています

# Dataの中身
- virtual node, 時刻, 論理クロック(更新された回数), expired_time, value の順で1行で格納されている  
 - 実際のtcファイル内のデータはbinary変換されている
- 論理クロック
 - レコードが更新される毎に+1されていく
 - 過負荷時など、他から同時に処理が走っていた場合にどれが最新のものか判断するために利用される

# 参照URL
ROMA Use TokyoCabinet for ROMA : http://roma-kvs.org/learn/tokyocabinet_lib.html