Ubuntu 14.04で断片化されたRethinkDBクラスターを作成する方法

前書き

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

このチュートリアルでは、クラスターのセットアップ、データのインポート、および保護の方法について説明します。 RethinkDBを初めて使用する場合は、https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-rethinkdb-on-an-ubuntu-12-04-vps [より複雑なクラスタ構成プロセスに進む前に、このチュートリアル]。

前提条件

このチュートリアルでは、* rethink1 および rethink2 *という名前のUbuntu 14.04 LTSを実行する少なくとも2つのドロップレットが必要です(これらの名前はこのチュートリアル全体で使用されます)。 root以外のsudoユーザーを設定でRethinkDBをセットアップする前のドロップレット-これを行うことは、優れたセキュリティプラクティスです。

このチュートリアルでは、https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-rethinkdb-on-an-ubuntu-12-04-vpsで説明されている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=

(注: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を介してクライアントコンピューター上の要求をリモートコンピューターにリダイレクトし、リモートサーバーのlocalhost名前空間でのみ利用可能なすべてのサービスへのクライアントアクセスを提供します。

すべての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の構成の詳細については、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04 [このチュートリアル]をご覧ください。 。

「iptables-persistent」をインストールして、ルールを保存しましょう。

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

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

image:https://assets.digitalocean.com/articles/RethinkDB_Ubuntu14/1.png [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を使用してクラウドサーバーに接続している場合は、*ローカルコンピューター*でターミナルを開きます。 そうでない場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys—​2 [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 `コマンドを使用した場合、これは自動作成された ` rethinkdb_data `ディレクトリになります。 次に、* rethink1 *で ` scp +`を使用してコピーします。

sudo scp -rpC @://* /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=

ファイルを閉じて、変更を保存します(「+ Ctrl-X 」、「 Y 」、「 Enter +」を使用)。 次に、RethinkDBを再起動します。

sudo service rethinkdb restart

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

クラスターの作成

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

sudo iptables -I INPUT -i eth0 -s  -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=

設定ファイルを保存して閉じます(「+ Ctrl-X 」、「 Y 」、「 Enter +」を使用)。 次に、RethinkDBを再起動します。

sudo service rethinkdb restart

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

これで、RethinkDBクラスターが完全に機能するようになりました!

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

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

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

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

ブラウザでhttp:// localhost:8080 [localhost:8080]にアクセスすると、RethinkDB Web管理コンソールが表示されます。

「+ bind:Address already in use」エラーを受け取った場合は、コンピューターのポート8080を既に使用しています。 Web管理コンソールを、コンピューターで使用可能な別のポートに転送できます。 たとえば、ポート8081に転送して、http:// localhost:8081 [localhost:8081]に移動できます。

ssh -L :localhost:8080 [email protected]

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 +`ファイルを開いて新しい行にキーを貼り付けることにより、* clusterノード*(この例では* rethink1 *)で新しいキーを承認します。

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

nanoを閉じて、ファイルを保存します( + Ctrl-X +、次に + Y +、次に + Enter +)。

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

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

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

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

*接続サーバー*にPythonドライバーをインストールします。 ここにはコマンドのクイックランスルーがあり、それらについて詳しくはhttps://www.digitalocean.com/community/tutorials/how-to-install-and-configure-rethinkdb-on-anで読むことができます。 -ubuntu-12-04-vps [このチュートリアル]。

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", ).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管理コンソールの[テーブル]タブに移動します。

image:https://assets.digitalocean.com/articles/RethinkDB_Ubuntu14/2.png [テーブルリスト]

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

image:https://assets.digitalocean.com/articles/RethinkDB_Ubuntu14/3.png [シャーディング設定カード]

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

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

高度なシャーディング

内部的に、RethinkDBにはドキュメントIDに基づいた範囲ベースのシャードがあります。 つまり、IDがA、B、C、Dのデータセットがある場合、RethinkDBはそれを2つのシャード、A、B(-∞からC)およびC、D(Cから+ infinity)に分割する可能性があります。 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から+ infinity:

split shard test.testShards C

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

split shard

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

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

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

pin shard  --master

testShards +を再度 `ls 'すると、シャードが別のサーバーに移動したことがわかります。

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

merge shard test.testShards C

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

merge shard

シェルを終了するには、「+ 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  --master

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

exit

不要なサーバーでRethinkDBを停止しても安全です。 重要:_remove_したいマシンでこれを実行してください。 この例では、これを* rethink2 *で実行します。

sudo service rethinkdb stop

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

image:https://assets.digitalocean.com/articles/RethinkDB_Ubuntu14/4.png [RethinkDB問題リスト]

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

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

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