docker
RethinkDB

DockerでサクッとRethinkDBのクラスタを試す

More than 3 years have passed since last update.


はじめに

Document型DBといえばMongoDBが定番ですが、ReplicationやShardingの構築かなり複雑です。一方RethinkDBはこれらがとても簡単にでき、私も徐々にMongoDBからRethinkDBにシフトしています。今回はDockerを使用してRethinkDBのクラスタ機能を構築して試してみます。


環境の準備

Dockerの環境を各自構築してください。私は普段はUbuntuを使用しているのでそのままインストールしました。


  • OS: Ubuntu 14.04

  • Docker: 1.9.1

  • Dokcer Compose: 1.5.1

WindowsやMac等を使用している方はVirtualBox(+Vagrant)等でCoreOSを立ちあげればすぐにDockerの環境が整います。もちろんUbuntu 14.04やCentos 7などのVMを作って自分でDockerを入れてもOKです。あとは公式の手順などを参考にDocker Composeをインストールしてください。


クラスタの起動


構成

次のようにdocker-compose.ymlを準備します。


docker-compose.yml

seed:

image: rethinkdb:2
ports:
- 8081:8080
command: rethinkdb -n rethink_seed --bind all

worker:
image: rethinkdb:2
links:
- seed:seed
command: rethinkdb --bind all -j seed:29015

proxy:
image: rethinkdb:2
ports:
- 8080:8080
links:
- worker:worker
command: rethinkdb proxy --bind all -j worker:29015


seedは種となるノードでこれにworkerノードがつながってRethinkDBのクラスタを形成します。-jオプションで接続する他のRethinkDBのアドレスとポートを指定します。ここではDockerのlink機能を使用してseed:29015のように指定しています。workerはDocker Composeのscaleを使用すれば複数のコンテナをすぐに起動できます。proxyというのは自身はデータを保存せず、クエリの転送や処理のみを行うノードです。こちらはworkerに接続します。あとでブラウザから操作するのでseedproxyはそれぞれhttpのポートをホストにマッピングしています。


起動

以下のコマンドでseedのRethinkDBコンテナが立ち上がります。

$ docker-compose up -d seed

ブラウザでhttp://host:8081にアクセスしてください。hostはDockerのホストのIPアドレスです。直接Ubuntuなどにインストールしている場合は127.0.0.1になり、VirtualBoxを使用している場合はゲストVMのIPアドレスです。

管理画面が表示されました。

Screenshot from 2015-12-02 00:38:08.png

Serversを見るとrethink_seedの1ノードだけいます。

Screenshot from 2015-12-02 00:38:15.png

次にworkerも立ち上げます。

$ docker-compose up -d worker

すぐにノードが1つ増えます。今度はserver nameを指定していないのでランダムに名前がついています。

Screenshot from 2015-12-02 00:38:30.png

workerを4つに増やしてみましょう。

$ docker-compose scale worker=4

一瞬で5ノードのクラスタが出来ました。

Screenshot from 2015-12-02 00:41:17.png

最後にproxyを立ち上げ、ブラウザで8080ポートにアクセスします。

$ docker-compose up -d proxy

proxyは4つのworkerのうちのどれかにつながっておりますが、proxyからも5ノードが見えているのがわかります。ただしproxy自身はデータを持たないノードなのでノードは6つには増えません。

Screenshot from 2015-12-02 00:44:40.png


DB,テーブル、データ


DBとテーブルの作成

proxyの管理画面をブラウザで開き、Tablesのタブを開いてください。はじめはtestというDBのみが存在しています。

Screenshot from 2015-12-02 00:49:52.png

RethinkDBはブラウザからDBやテーブルを作成することができ、冗長化の設定もできます。+Add Databaseと書いてあるボタンを押し、marvelというDBを作成します。つぎにmarvelの+Add Tableをクリックしてheroesというテーブルを作ります。作成が完了するとheroesをクリックしてテーブルの管理画面に進めます。

Screenshot from 2015-12-02 00:58:07.png

最初はrethink_seedのみにデータが保存されるのでSharding and replicationにあるReconfigureのボタンをクリックし、replicaとshardの数を設定します。例えばreplica=3, shard=2という設定にします。

Screenshot from 2015-12-02 01:01:23.png

これでDBとテーブルの準備が完了しました。


データ投入

Data Explorerタブをクリックし、テキストエリアに次のコマンドを入力してRUNボタンを押します。

r.db("marvel").table("heroes").insert([

{
"name": "Steve Rogers",
"alias": "Captain America",
"species": "Human",
"affiliations": ["Avengers", "S.H.I.E.L.D"]
},
{
"name": "Tony Stark",
"alias": "Iron Man",
"species": "Human",
"affiliations": ["Avengers", "Stark Industries", "Illuminati"]
},
{ "name": "Matthew Murdock",
"alias": "Daredevil",
"species": "Human",
"affiliations": ["Defenders", "Heroes for Hire"]
},
{ "name": "Thor Ordinson",
"species": "Asgardian",
"affiliations": ["Avengers"]
}
])

Screenshot from 2015-12-02 01:19:08.png

結果のJSONで"inserted":4となっていれば成功です。

最後にseedのノードからデータが入ったことと冗長性を確認します。以下のコマンドで4つ目のworkerを壊します。

$ docker-compose scale worker=3

Tableの状態を見るとshard1のreplicaが1つdisconnectedになってしまいました。

Screenshot from 2015-12-02 01:35:31.png

この状態でData Explorerのテキストエリアに以下のクエリを入力し、RUNを押します。

r.db("marvel").table("heroes")

Screenshot from 2015-12-02 01:35:54.png

1つノードが欠損しても先ほど挿入した4つのデータが入っていることが確認できました。


まとめ

RethinkDBを使えば非常に簡単にクラスタを組むことができます。MongoDBのクラスタを組むのに疲れてしまった人はぜひお試しください。