はじめに
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
を準備します。
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
に接続します。あとでブラウザから操作するのでseed
とproxy
はそれぞれhttpのポートをホストにマッピングしています。
起動
以下のコマンドでseed
のRethinkDBコンテナが立ち上がります。
$ docker-compose up -d seed
ブラウザでhttp://host:8081にアクセスしてください。hostはDockerのホストのIPアドレスです。直接Ubuntuなどにインストールしている場合は127.0.0.1になり、VirtualBoxを使用している場合はゲストVMのIPアドレスです。
管理画面が表示されました。
Serversを見るとrethink_seed
の1ノードだけいます。
次にworker
も立ち上げます。
$ docker-compose up -d worker
すぐにノードが1つ増えます。今度はserver nameを指定していないのでランダムに名前がついています。
worker
を4つに増やしてみましょう。
$ docker-compose scale worker=4
最後にproxy
を立ち上げ、ブラウザで8080ポートにアクセスします。
$ docker-compose up -d proxy
proxy
は4つのworker
のうちのどれかにつながっておりますが、proxy
からも5ノードが見えているのがわかります。ただしproxy
自身はデータを持たないノードなのでノードは6つには増えません。
DB,テーブル、データ
DBとテーブルの作成
proxy
の管理画面をブラウザで開き、Tablesのタブを開いてください。はじめはtestというDBのみが存在しています。
RethinkDBはブラウザからDBやテーブルを作成することができ、冗長化の設定もできます。+Add Databaseと書いてあるボタンを押し、marvel
というDBを作成します。つぎにmarvelの*+Add Table*をクリックしてheroes
というテーブルを作ります。作成が完了するとheroesをクリックしてテーブルの管理画面に進めます。
最初はrethink_seed
のみにデータが保存されるのでSharding and replicationにあるReconfigureのボタンをクリックし、replicaとshardの数を設定します。例えばreplica=3, shard=2という設定にします。
これで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"]
}
])
結果のJSONで**"inserted":4**となっていれば成功です。
最後にseed
のノードからデータが入ったことと冗長性を確認します。以下のコマンドで4つ目のworkerを壊します。
$ docker-compose scale worker=3
Tableの状態を見るとshard1のreplicaが1つdisconnectedになってしまいました。
この状態でData Explorerのテキストエリアに以下のクエリを入力し、RUNを押します。
r.db("marvel").table("heroes")
1つノードが欠損しても先ほど挿入した4つのデータが入っていることが確認できました。
まとめ
RethinkDBを使えば非常に簡単にクラスタを組むことができます。MongoDBのクラスタを組むのに疲れてしまった人はぜひお試しください。