CentOS 7にRethinkDBをインストールしてみる

先日、仕事で負荷テストを行っていた際、RethinkDBなるNoSQL(JSONデータベース)があることを知ったので、試しに入れてみる事にした。
MongoDBに比べるとパフォーマンス面では劣る面があるようだけど、テーブルのjoinをしたりといったRDBMSっぽいこともできるようだ。こちらを見ると、MongoDBが書き込み時(読み込み時もか?)にDBロックを書けることが多いのに対し、ロック無しでトランザクションを実現する事が可能らしい。
(まぁ、今回はあくまでもお試しなので、CentOS 7に入れて少しいじってみるだけなのだが)

1.インストール

まずはインストール。
こちらを参考に、yumから入れるだけだ。

sudo wget http://download.rethinkdb.com/centos/7/`uname -m`/rethinkdb.repo -O /etc/yum.repos.d/rethinkdb.repo
sudo yum install rethinkdb

インストールが完了したら、systemd経由で起動するように以下のコマンドを実行する。

echo "d /run/rethinkdb 0755 rethinkdb rethinkdb -" > /usr/lib/tmpfiles.d/rethinkdb.conf
cat <<EOF > /usr/lib/systemd/system/rethinkdb@.service
[Unit]
Description=RethinkDB database server for instance '%i'

[Service]
User=rethinkdb
Group=rethinkdb
ExecStart=/usr/bin/rethinkdb serve --config-file /etc/rethinkdb/instances.d/%i.conf
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF
chmod 644 /usr/lib/systemd/system/rethinkdb@.service
rethinkdb create -d /opt/rethinkdb
chown -R rethinkdb.rethinkdb /opt/rethinkdb
cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/instance1.conf
sed -e '/# directory/c directory=/opt/rethinkdb' \
    -e '/# bind/c bind IPアドレス' \
    -i /etc/rethinkdb/instances.d/instance1.conf

後は、サービスを起動するだけだ。

systemctl enable rethinkdb@instance1
systemctl start rethinkdb@instance1

これでRethinkDBが利用できるようになった。

2.Webコンソールへ接続してみる

さて、それでは実際にRethinkDBに接続してみよう。
RethinkDBではWebコンソール(http://IPアドレス:8080)が用意されているようなので、まずはそちらにアクセスする。
認証は特に無いようだ。

「Table」から、データベースとテーブルを作成してみる。

「Data Explorer」から、ReQL(RethinkDB操作用の言語)を用いてデータを操作することが出来る。
置換もできるようだし、書き方は結構簡単だと思う。

r.db('DB名').table('テーブル名').filter({キー名: 値,...}) # SELECT
r.db('DB名').table('テーブル名').insert({キー名: 値,...}) # INSERT
r.db('DB名').table('テーブル名').filter({キー名: 値,...}).delete() # DELETE

3.Pythonからアクセスする

残念ながら、クライアント用のコマンドというものは用意されていないようなので、Pythonなどで書いてあげる必要がある。
まず、以下のコマンドでRethinkDBへアクセスするためのライブラリを導入する。

pip install rethinkdb

後は、Pythonで記述してやるだけだ。

python
import rethinkdb as r
r.connect('localhost', 28015).repl()
r.db('testdb').table('testtb').insert({'id': 1,'title': 'test1','contents': 'test'}).run()
r.db('testdb').table('testtb').insert({'id': 2,'title': 'test2','contents': 'test'}).run()
r.db('testdb').table('testtb').insert({'id': 3,'title': 'test3','contents': 'test'}).run()
r.db('testdb').table('testtb').filter({'id': 1}).run()
r.db('testdb').table('testtb').get(2).run()
[root@BS-PUB-CENT7-01 ~]# python
Python 2.7.5 (default, Nov 20 2015, 02:00:19)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import rethinkdb as r
>>> r.connect('localhost', 28015).repl()

>>> r.db('testdb').table('testtb').insert({'id': 1,'title': 'test1','contents': 'test'}).run()
{u'skipped': 0, u'deleted': 0, u'unchanged': 0, u'errors': 0, u'replaced': 0, u'inserted': 1}
>>> r.db('testdb').table('testtb').insert({'id': 2,'title': 'test2','contents': 'test'}).run()
{u'skipped': 0, u'deleted': 0, u'unchanged': 0, u'errors': 0, u'replaced': 0, u'inserted': 1}
>>> r.db('testdb').table('testtb').insert({'id': 3,'title': 'test3','contents': 'test'}).run()
{u'skipped': 0, u'deleted': 0, u'unchanged': 0, u'errors': 0, u'replaced': 0, u'inserted': 1}
>>> r.db('testdb').table('testtb').filter({'id': 1}).run()

>>> r.db('testdb').table('testtb').get(2).run()
{u'id': 2, u'contents': u'test', u'title': u'test2'}

クラスタ組めるようだし、まぁ悪くないような…