Ubuntu14.04でシャードRethinkDBクラスターを作成する方法
序章
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-X
、 それから Y
、 それから Enter
). これで、新しい構成ファイルを使用して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
次のようなメニューが表示されます。
を選択 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-X
、 それから Y
、 それから Enter
).
他のクラスターノードに対して、これらのすべての手順を繰り返す必要があります。
データベースのインポートまたは作成
既存のデータベースをクラスターにインポートすることをお勧めします。 これは、別のサーバーまたはこのサーバーに既存のデータベースがある場合にのみ必要です。 それ以外の場合、RethinkDBは自動的に空のデータベースを作成します。
外部データベースをインポートする必要がある場合:
インポートしたいデータベースが保存されていない場合 rethink1
、コピーする必要があります。 まず、現在のRethinkDBデータベースのパスを見つけます。 これは自動作成されます rethinkdb_data
を使用した場合はディレクトリ rethinkdb
古いデータベースを起動するコマンド。 次に、を使用してコピーします scp
rethink1 :
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_data
を使用した場合はディレクトリ rethinkdb
古いデータベースを起動するコマンド。 次の行を追加して、そのパスを構成ファイルに挿入します。
directory=/home/user/rethink/rethinkdb_data/
ファイルを閉じて変更を保存します( Ctrl-X
、 それから Y
、 それから Enter
). 次に、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
The join
オプションは、参加するクラスターのアドレスを指定します。 を見つける join
構成ファイルの行:
# join=example.com:29015
そしてそれを次のように置き換えます:
join=rethink1 IP
構成ファイルを保存して閉じます( Ctrl-X
、 それから Y
、 それから Enter
). 次に、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 ssh-to-me@rethink1 IP
ブラウザでlocalhost:8080 に移動すると、RethinkDBWeb管理コンソールが表示されます。
あなたが受け取った場合 bind: Address already in use
エラー、あなたはすでにあなたのコンピュータでポート8080を使用しています。 Web管理コンソールを、コンピューターで使用可能な別のポートに転送できます。 たとえば、ポート8081に転送して、 localhost:8081に移動できます。
ssh -L 8081:localhost:8080 ssh-to-me@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
次に、クラスタノード(この例では rethink1 )で新しいキーを承認し、 authorized_keys
ファイルを作成し、キーを新しい行に貼り付けます。
sudo nano /home/ssh-to-me/.ssh/authorized_keys
nanoを閉じて、ファイルを保存します(Ctrl-X
、 それから Y
、 それから Enter
).
次に、SSHトンネリングを使用して、接続サーバーからドライバーポートにアクセスします。
ssh -L 28015:localhost:28015 ssh-to-me@Cluster Node IP -f -N
これで、localhost:28015からドライバーにアクセスできます。 あなたが得る場合 bind: Address already in use
エラー、ポートを変更できます。 たとえば、ポート28016を使用します。
ssh -L 28016:localhost:28015 ssh-to-me@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管理コンソールのテーブルタブに移動します。
test テーブル(前のセクションで作成したもの)をクリックして、設定を入力します。 シャーディング設定カードまで下にスクロールします。
編集ボタンをクリックします。 そこで、テーブルを分割するサーバーの数を入力できます。 この例では、2と入力します。 リバランスボタンをクリックして設定を保存してください。
あなたはあなたが持つことができる破片の量に最大があることに気付くかもしれません。 これは、データベース内のドキュメントの数と同じです。 新しいテーブルのシャーディングを設定しようとしている場合は、さらにデータを待つか、ダミーデータを追加してシャードを追加できるようにする必要があります。
高度なシャーディング
内部的には、RethinkDBには、ドキュメントIDに基づく範囲ベースのシャードがあります。 つまり、IDがA、B、C、およびDのデータセットがある場合、RethinkDBはそれをA、B(-無限大からC)とC、D(Cから+無限大)の2つのシャードに分割する可能性があります。 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.name
(test.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
(-無限大から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をオンに戻します(sudo service rethinkdb start
)そして、すべてのプライマリシャードをそのサーバーから移行することを確認してください。
注:マシンをクラスターに再度追加しようとすると、ゾンビマシンに関するメッセージが表示されます。 データディレクトリを削除して、この問題を修正できます。
sudo rm -r /var/lib/rethinkdb/cluster_instance/
sudo service rethinkdb restart