Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
17
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

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

はじめに

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のクラスタを組むのに疲れてしまった人はぜひお試しください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
17
Help us understand the problem. What are the problem?