序章

RethinkDBはNoSQLデータベースです。 データベースと対話するための使いやすいAPIがあります。 RethinkDBを使用すると、データベースクラスターのセットアップも簡単になります。 つまり、同じデータベースとテーブルにサービスを提供するサーバーのグループです。 クラスターは、ダウンタイムなしでデータベースを簡単に拡張する方法です。

このチュートリアルでは、クラスターをセットアップし、データをインポートして保護する方法について説明します。 RethinkDBを初めて使用する場合は、より複雑なクラスター構成プロセスに進む前に、このチュートリアルの基本を確認してください。

前提条件

このチュートリアルには、Ubuntu14.04LTSを実行する少なくとも2つのドロップレットが必要です。 rethink1 rethink2 (これらの名前は、このチュートリアル全体で使用されます)。 RethinkDBを設定する前に、各ドロップレットで非root sudoユーザーを設定する必要があります。これは、優れたセキュリティ対策です。

このチュートリアルでは、このチュートリアルで説明されているPythonクライアントドライバーも参照しています。

ノードの設定

RethinkDBのクラスターには、特別なノードはありません。 それは純粋なピアツーピアネットワークです。 クラスタを構成する前に、RethinkDBをインストールする必要があります。 各サーバーのホームディレクトリから、RethinkDBキーとリポジトリをapt-getに追加します。

source /etc/lsb-release && echo "deb http://download.rethinkdb.com/apt $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list

wget -qO- http://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add -

次に、apt-getを更新し、RethinkDBをインストールします。

sudo apt-get update
sudo apt-get install rethinkdb

次に、起動時に実行するようにRethinkDBを設定する必要があります。 RethinkDBには、起動時に実行するスクリプトが付属していますが、そのスクリプトを有効にする必要があります。

sudo cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/cluster_instance.conf

起動スクリプトは、構成ファイルとしても機能します。 このファイルを開きましょう:

sudo nano /etc/rethinkdb/instances.d/cluster_instance.conf

このファイルには、マシン名(Web管理コンソールおよびログファイル内の名前)が設定されています。 (一番下の)行を見つけて、これをマシンのホスト名と同じにします。

# machine-name=server1

そしてそれを次のように変更します:

machine-name=rethink1

(注:RethinkDBを初めて起動する前に名前を設定しないと、DOTAをテーマにした名前が自動的に設定されます。)

次の行を見つけて、すべてのネットワークインターフェイスからアクセスできるようにRethinkDBを設定します。

# bind=127.0.0.1

そしてそれを次のように変更します:

bind=all

構成を保存し、nanoを閉じます(Ctrl-XYEnterの順に押します)。 これで、新しい構成ファイルを使用してRethinkDBを起動できます。

sudo service rethinkdb start

次の出力が表示されます。

rethinkdb: cluster_instance: Starting instance. (logging to `/var/lib/rethinkdb/cluster_instance/data/log_file')

これで、RethinkDBが稼働しています。

RethinkDBの保護

bind=allオプションをオンにして、サーバーの外部からRethinkDBにアクセスできるようにしました。 これは安全ではありません。 したがって、RethinkDBをインターネットからブロックする必要があります。 ただし、許可されたコンピューターからのサービスへのアクセスを許可する必要があります。

クラスターポートについては、ファイアウォールを使用してクラスターを囲みます。 Web管理コンソールとドライバーポートについては、SSHトンネルを使用してサーバーの外部からそれらにアクセスします。 SSHトンネルは、SSHを介してクライアントコンピューター上の要求をリモートコンピューターにリダイレクトし、リモートサーバーのローカルホストネームスペースでのみ利用可能なすべてのサービスへのクライアントアクセスを提供します。

すべてのRethinkDBサーバーでこれらの手順を繰り返します。

まず、すべての外部接続をブロックします。

# The Web Management Console
sudo iptables -A INPUT -i eth0 -p tcp --dport 8080 -j DROP
sudo iptables -I INPUT -i eth0 -s 127.0.0.1 -p tcp --dport 8080 -j ACCEPT

# The Driver Port
sudo iptables -A INPUT -i eth0 -p tcp --dport 28015 -j DROP
sudo iptables -I INPUT -i eth0 -s 127.0.0.1 -p tcp --dport 28015 -j ACCEPT

# The Cluster Port
sudo iptables -A INPUT -i eth0 -p tcp --dport 29015 -j DROP
sudo iptables -I INPUT -i eth0 -s 127.0.0.1 -p tcp --dport 29015 -j ACCEPT

IPTablesの構成の詳細については、このチュートリアルを確認してください。

ルールを保存するために「iptables-persistent」をインストールしましょう。

sudo apt-get update
sudo apt-get install iptables-persistent

次のようなメニューが表示されます。

IPtables Image

Yesオプションを選択して(Enterを押す)、ファイアウォールルールを保存します。 IPv6ルールに関する同様のメニューも表示されます。これも保存できます。

管理ユーザーの設定

RethinkDBのWeb管理コンソールとドライバーインターフェイスにアクセスするには、SSHトンネルを設定する必要があります。 rethink1でsshトンネルの新しいユーザーを作成しましょう。

sudo adduser ssh-to-me

次に、新しいユーザーの承認済みキーファイルを設定します。

sudo mkdir /home/ssh-to-me/.ssh
sudo touch /home/ssh-to-me/.ssh/authorized_keys

SSHを使用してクラウドサーバーに接続している場合は、ローカルコンピューターでターミナルを開きます。 そうでない場合は、SSHキーの詳細をご覧ください。 公開鍵を取得してクリップボードにコピーします。

cat ~/.ssh/id_rsa.pub

次に、サーバーでauthorized_keysファイルを開いて、そのキーを新しいアカウントに追加します。

sudo nano /home/ssh-to-me/.ssh/authorized_keys

キーをファイルに貼り付けます。 次に、nanoを保存して閉じます(Ctrl-XYEnter)。


他のクラスターノードに対して、これらのすべての手順を繰り返す必要があります。

データベースのインポートまたは作成

既存のデータベースをクラスターにインポートすることをお勧めします。 これは、別のサーバーまたはこのサーバーに既存のデータベースがある場合にのみ必要です。 それ以外の場合、RethinkDBは自動的に空のデータベースを作成します。

外部データベースをインポートする必要がある場合:

インポートするデータベースがrethink1に保存されていない場合は、データベースをコピーする必要があります。 まず、現在のRethinkDBデータベースのパスを見つけます。 rethinkdbコマンドを使用して古いデータベースを起動した場合、これは自動作成されたrethinkdb_dataディレクトリになります。 次に、rethink1scpを使用してコピーします。

sudo scp -rpC From Server User@From Server IP:/RethinkDB Data Folder/* /var/lib/rethinkdb/cluster_instance/data

例えば:

sudo scp -rpC [email protected]:/home/user/rethinkdb_data/* /var/lib/rethinkdb/cluster_instance/data

次に、RethinkDBを再起動します。

sudo service rethinkdb restart

rethink1に既存のデータベースがある場合:

rethink1 に既存のRethinkDBデータベースがある場合、手順は異なります。 まず、rethink1で構成ファイルを開きます。

sudo nano /etc/rethinkdb/instances.d/cluster_instance.conf

次に、インポートするRethinkDBデータベースのパスを見つけます。 rethinkdbコマンドを使用して古いデータベースを起動した場合、これは自動作成されたrethinkdb_dataディレクトリになります。 次の行を追加して、そのパスを構成ファイルに挿入します。

directory=/home/user/rethink/rethinkdb_data/

ファイルを閉じて変更を保存します(Ctrl-XYEnterの順に使用)。 次に、RethinkDBを再起動します。

sudo service rethinkdb restart

既存のデータベースをインポートすると、rethink1がデータベースの古いマシンの名前を継承することに注意することが重要です。 後でデータベースのシャーディングを管理するときに、これを知る必要があります。

クラスターの作成

クラスターを作成するには、すべてのクラスターマシンが互いのファイアウォールを通過できるようにする必要があります。 rethink1 マシンで、IPTablesルールを追加して、他のノードがファイアウォールを通過できるようにします。 この例では、rethink2 IPをそのサーバーのIPアドレスに置き換える必要があります。

sudo iptables -I INPUT -i eth0 -s rethink2 IP -p tcp --dport 29015 -j ACCEPT

追加する他のノードに対してコマンドを繰り返します。

次に、ファイアウォールルールを保存します。

sudo sh -c "iptables-save > /etc/iptables/rules.v4"

次に、他のノードに対してこれらの手順を繰り返します。 2サーバー設定の場合は、 rethink2 に接続し、rethink1のIPのブロックを解除する必要があります。

次に、すべてのノードを接続してクラスターを作成する必要があります。 SSHを使用してrethink2に接続し、構成ファイルを開きます。

sudo nano /etc/rethinkdb/instances.d/cluster_instance.conf

joinオプションは、参加するクラスターのアドレスを指定します。 構成ファイルでjoin行を見つけます。

# join=example.com:29015

そしてそれを次のように置き換えます:

join=rethink1 IP

構成ファイルを保存して閉じます(Ctrl-XYEnterの順に使用)。 次に、RethinkDBを再起動します。

sudo service rethinkdb restart

最初のノードrethink1は、joinの更新を必要としません。 rethink1 を除いて、他のすべてのノードで構成ファイルの編集を繰り返します。

これで、完全に機能するRethinkDBクラスターができました。

Web管理コンソールへの接続

Web管理コンソールは、RethinkDBの基本的な管理機能にアクセスできる使いやすいオンラインインターフェイスです。 このコンソールは、クラスターのステータスを表示したり、単一のRethinkDBコマンドを実行したり、基本的なテーブル設定を変更したりする必要がある場合に役立ちます。

クラスタ内のすべてのRethinkDBインスタンスは管理コンソールにサービスを提供していますが、ファイアウォールルールを使用して他の世界からブロックしているため、これはサーバーのローカルホスト名前空間からのみ利用できます。 SSHトンネルを使用して、localhost:8080のリクエストをrethink1 にリダイレクトできます。これにより、名前空間内のlocalhost:8080にリクエストが送信されます。 これにより、Web管理コンソールにアクセスできるようになります。 これは、ローカルコンピューターでSSHを使用して実行できます。

ssh -L 8080:localhost:8080 [email protected]rethink1 IP

ブラウザでlocalhost:8080 に移動すると、RethinkDBWeb管理コンソールが表示されます。

bind: Address already in useエラーが発生した場合は、コンピューターですでにポート8080を使用しています。 Web管理コンソールを、コンピューターで使用可能な別のポートに転送できます。 たとえば、ポート8081に転送して、 localhost:8081に移動できます。

ssh -L 8081:localhost:8080 [email protected]rethink1 IP

2つのテストデータベースを持つことに関して競合が見られる場合は、そのうちの1つに名前を変更できます。

Pythonドライバーを使用したクラスターへの接続

このセットアップでは、すべてのRethinkDBサーバー(Web管理コンソール、ドライバーポート、およびクラスターポート)が外部からブロックされます。 Web管理コンソールの場合と同様に、SSHトンネルを使用してドライバーポートに接続できます。 ドライバーポートは、RethinkDB APIドライバー(アプリケーションを構築するドライバー)がクラスターに接続する方法です。

まず、接続するノードを選択します。 クラスターに接続している複数のクライアント(Webアプリサーバーなど)がある場合は、クラスター全体でそれらのバランスをとる必要があります。 クライアントのリストを作成してから、クライアントごとにサーバーを割り当てることをお勧めします。 同様のテーブルを必要とするクライアントが同じクラウドサーバーまたはサーバーのグループに接続し、サーバーが多数のクライアントで過負荷にならないように、クライアントをグループ化してみてください。

この例では、接続サーバーとしてrethink2を使用します。 ただし、データベースサーバーとWebアプリサーバーが分離している大規模なシステムでは、実際にデータベース呼び出しを行っているWebアプリサーバーからこれを実行する必要があります。

次に、接続サーバーで、SSHキーを生成します。

ssh-keygen -t rsa

そして、それをクリップボードにコピーします。

cat ~/.ssh/id_rsa.pub

次に、authorized_keysファイルを開き、新しい行にキーを貼り付けて、クラスターノード(この例では rethink1 )で新しいキーを承認します。

sudo nano /home/ssh-to-me/.ssh/authorized_keys

nanoを閉じて、ファイルを保存します(Ctrl-XYEnterの順に)。

次に、SSHトンネリングを使用して、接続サーバーからドライバーポートにアクセスします。

ssh -L 28015:localhost:28015 [email protected]Cluster Node IP -f -N

これで、localhost:28015からドライバーにアクセスできます。 bind: Address already in useエラーが発生した場合は、ポートを変更できます。 たとえば、ポート28016を使用します。

ssh -L 28016:localhost:28015 [email protected]Cluster Node IP -f -N

接続サーバーにPythonドライバーをインストールします。 ここにコマンドの簡単な説明があり、このチュートリアルでコマンドの詳細を読むことができます。

Python仮想環境をインストールします。

sudo apt-get install python-virtualenv

~/rethinkディレクトリを作成します。

cd ~
mkdir rethink

ディレクトリに移動して、新しい仮想環境構造を作成します。

cd rethink
virtualenv venv

環境をアクティブ化します(Pythonインターフェイスを開始する前に毎回環境をアクティブ化する必要があります。そうしないと、モジュールが見つからないというエラーが発生します)。

source venv/bin/activate

RethinkDBモジュールをインストールします。

pip install rethinkdb

次に、接続サーバーからPythonを起動します。

python

データベースに接続し、必要に応じて、28015を使用したポートに置き換えてください。

import rethinkdb as r
r.connect("localhost", 28015).repl()

テーブルtestを作成します。

r.db("test").table_create("test").run()

テーブルにデータを挿入しますtest

r.db("test").table("test").insert({"hello":"world"}).run()
r.db("test").table("test").insert({"hello":"world number 2"}).run()

そして、データを印刷します。

list(r.db("test").table("test").run())

次のような出力が表示されます。

[{u'hello': u'world number 2', u'id': u'0203ba8b-390d-4483-901d-83988e6befa1'},
 {u'hello': u'world', u'id': u'7d17cd96-0b03-4033-bf1a-75a59d405e63'}]

シャーディングの設定

RethinkDBでは、複数のクラウドサーバー間でシャーディング(分割)されるようにテーブルを構成できます。 シャーディングは、キャッシュに使用できるRAMが多いため、単一のマシンのRAMに収まるデータセットよりも大きいデータセットを適切に実行するための簡単な方法です。 シャーディングはデータセットを複数のマシンに分割するため、テーブルで使用できるディスク容量が増えるため、より大きく、パフォーマンスの低いテーブルを作成できます。 これは、Web管理コンソールを介して実行できます。

これを行うには、Web管理コンソールのテーブルタブに移動します。

Tables List

test テーブル(前のセクションで作成したもの)をクリックして、設定を入力します。 シャーディング設定カードまで下にスクロールします。

Sharding settings card

編集ボタンをクリックします。 そこで、テーブルを分割するサーバーの数を入力できます。 この例では、2と入力します。 リバランスボタンをクリックして設定を保存してください。

あなたはあなたが持つことができる破片の量に最大があることに気付くかもしれません。 これは、データベース内のドキュメントの数と同じです。 新しいテーブルのシャーディングを設定しようとしている場合は、さらにデータを待つか、ダミーデータを追加してシャードを追加できるようにする必要があります。

高度なシャーディング

内部的には、RethinkDBには、ドキュメントIDに基づく範囲ベースのシャードがあります。 つまり、IDがA、B、C、およびDのデータセットがある場合、RethinkDBはそれを2つのシャード(A、B(-無限大からC)およびC、D(Cから+無限大))に分割する可能性があります。 ID A1のドキュメントを挿入する場合、それは最初のシャードの範囲(-無限大からC)内にあるため、そのシャードに入ります。 シャードの境界を設定して、データベース構成を最適化できます。

その前に、操作するデータセットを追加する必要があります。 Web管理コンソールのデータエクスプローラータブで、次のコマンドを実行してテーブルを作成できます(入力後に実行をクリックします)。

r.db('test').tableCreate('testShards')

次に、テストデータを挿入します。

r.db("test").table("testShards").insert([
  {id:"A"}, 
  {id:"B"}, 
  {id:"C"}, 
  {id:"D"}, 
  {id:"E"}])

これで、シャードを詳細に構成できます。 そのためには、管理シェルに入る必要があります。 管理シェルは、クラスターを制御するためのより高度な方法であり、セットアップを微調整することができます。 rethink1 マシンで、管理シェルを開きます。

rethinkdb admin

次に、テーブルに関するいくつかの情報を表示できます。

ls test.testShards

期待される出力:

table 'testShards' b91fda27-a9f1-4aeb-bf6c-a7a4211fb674

...

1 replica for 1 shard
shard      machine uuid                          name      primary  
-inf-+inf  91d89c12-01c7-487f-b5c7-b2460d2da22e  rethink1  yes

RethinkDBには、テーブルに名前を付ける方法がたくさんあります。 database.nametest.testShards)、名前(testShards)、またはテーブルuuid(e780f2d2-1baf-4667-b725-b228c7869aab)を使用できます。 これらはすべて互換的に使用できます。

このシャードを分割しましょう。 2つのシャードを作成します:-無限大からCおよびCから+無限大:

split shard test.testShards C

コマンドの一般的な形式は次のとおりです。

split shard TABLE SPLIT-POINT

ls testShardsを再度実行すると、シャードが分割されたことが示されます。 新しいシャードをあるマシンから別のマシンに移動することをお勧めします。 この例では、シャード-inf-C(-infinty to C)をマシン rethink2 に固定(移動)できます。

pin shard test.testShards -inf-C --master rethink2

コマンドの一般的な形式は次のとおりです。

pin shard TABLE SHARD-RANGE --master MACHINE-NAME

もう一度ls testShardsすると、シャードが別のサーバーに移動したことがわかります。

共通の境界がわかっている場合は、2つのシャードをマージすることもできます。 作成したシャードをマージしてみましょう(-無限大をCに、Cを+無限大に):

merge shard test.testShards C

コマンドの一般的な形式は次のとおりです。

merge shard TABLE COMMON-BOUNDARY

シェルを終了するには、exitと入力します

機械を安全に取り外す

ドキュメントが複数のマシンに分割されている場合、1台のマシンが常にプライマリインデックスを保持します。 特定のドキュメントのプライマリインデックスを持つクラウドサーバーがオフラインになると、ドキュメントは失われます。 したがって、マシンを削除する前に、マシン上のすべてのプライマリシャードをマシンから移行する必要があります。

この例では、ノード rethink2 からデータを移行して、rethink1を唯一のノードとして残します。

rethink1でRethinkDB管理シェルに入ります。

rethinkdb admin

まず、 rethink2 が担当するシャード(ドキュメントのグループ)をリストします。

ls rethink2

出力は次のようになります。

machine 'rethink2' bc2113fc-efbb-4afc-a2ed-cbccb0c55897
in datacenter 00000000-0000-0000-0000-000000000000

hosting 1 replicas from 1 tables
table                                 name        shard                                               primary  
b91fda27-a9f1-4aeb-bf6c-a7a4211fb674  testShards  -inf-+inf                                           yes  

これは、rethink2がID「bdfceefb-5ebe-4ca6-b946-869178c51f93」のテーブルのプライマリシャードを担当していることを示しています。 次に、このシャードをrethink1に移動します。 これはピン留めと呼ばれます。

pin shard test.testShards -inf-+inf --master rethink1

コマンドの一般的な形式は次のとおりです。

pin shard TABLE SHARD-RANGE --master MACHINE-NAME

ここでls rethink1を実行すると、シャードがそのマシンに移動されたことがわかります。 すべてのシャードがrethink2からrethink1に移動されたら、管理シェルを終了する必要があります。

exit

これで、不要なサーバーでRethinkDBを安全に停止できます。 重要:削除するマシンでこれを実行します。 この例では、これをrethink2で実行します。

sudo service rethinkdb stop

次にWeb管理コンソールにアクセスすると、RethinkDBは真っ赤な警告を表示します。 問題の解決をクリックします。

RethinkDB Issues List

表示されている問題が上記のようで、マスターの責任がリストされていない場合は、完全に削除をクリックします。 これにより、マシンがクラスターから削除されます。 マスターの責任がリストされている場合は、RethinkDBをオンに戻し(sudo service rethinkdb start)、すべてのプライマリシャードをそのサーバーから移行するようにしてください。

注:マシンをクラスターに再度追加しようとすると、ゾンビマシンに関するメッセージが表示されます。 データディレクトリを削除して、この問題を修正できます。

sudo rm -r /var/lib/rethinkdb/cluster_instance/
sudo service rethinkdb restart