based on v20
Replica Pairs のセットアップ
Mongoは、 replica pairs というものをサポートしています。これは、状況に応じて、masterとslaveが自動的に入れ替わるものです。
起動時に、複数のデータベース間で、どれがmasterでどれがslaveかというのを決定します。そしてデータベースサーバに障害があった場合、他のデータベースが自動的にその時点からmasterに取って代わります。次の障害に備え、masterの状態はペアのサーバに再度渡されます。これらのことを、データベースが自動的に行います。
*注意: * 原則として、新しいpairを最初に作り起動するときには、それぞれのpairで、空の /data/db の状態で起動してください。 下記の「既存のデータベースをpairにする」のセクションも参照してください。
このモードでpairを起動するには、次のコマンドをそれぞれで実行してください。
$ ./mongod --pairwith <remoteserver> --arbiter <arbiterserver>
- remoteserver は、pariの相手のサーバのホスト名です。 標準的でないポートで動かしたい場合には、 :port を付けてください。
- arbiterserver は、 arbiter のホスト名(とオプションでport番号)を指定します。arbiter とは、ある時点で、どのMongoデータベースが、masterとなるかを決定するのを手伝うMongoのデータベースサーバです。 arbiter を、独立したマシンで起動してください。これは、pairのメンバーがお互いにコミュニケーションできないとき、どのデータベースがmasterになるかというのを決定するのを効果的に行う役目("tie-breaker")になります。 --arbiter オプションで、arbiter なしで起動することもできます。この場合、ネットワークが切断された場合、両方のサーバがmaster状態になります。
どのデータベースが現在masterか、手動で確認することができます。
$ ./mongo
> db.$cmd.findOne({ismaster:1});
{ "ismaster" : 0.0 , "remote" : "192.168.58.1:30001" , "ok" : 1.0 }
(注意: セキュリティ機能がオンの場合、 admin データベースへの認証がされているコネクションでのみ、 remote が返されます。)
しかし、replica pairをサポートしているMongoドライバがこの処理をあなたに代わって管理します。
一貫性
pairのメンバーはフェイルオーバー後、最終的な一貫性があります。たとえば、pairの中でmasterだったマシンLが落ちた場合、過去数秒の更新は、Rへはまだされてない可能性があります。それらの更新は、後でLが復旧した後でRに反映されます。
セキュリティ
セキュリティ機能が有効になっている場合、セキュリティの設定の例です。
$ ./mongo <lefthost>/admin -u <adminusername> -p<adminpassword>
> use local
> db.addUser('repl', <replpassword>);
^c
$ ./mongo <righthost>/admin -u <adminusername> -p<adminpassword>
> use local
> db.addUser('repl', <replpassword>);
replica pairサーバの置き換え
Mongoのreplica pairの一台に障害が起きた場合、通常、そのマシンはその後オンラインに戻り、システムは自動的に復旧されるはずです。しかし、マシンが完全に壊れてしまった場合、置き換えが必要です。置き換えた場合、最初データがない状態でスタートします。次の手順は、どうやってpairの中の一台を入れ替えるか、という手順を説明しています。
(n1, n2) が元々のpairで、 n2 が死ぬと仮定してください。そして、 (n1,n3) のpairへ切り替えます。
- 可能であれば、 死んだ n2 が二度とオンラインにならないようにしてください。そうしないと、間違った古いpairで通信してしまう可能性があります。
- n1 に n2 の代わりに n3 を使うように言う必要があります。 replacepeer コマンドでこれはできます。次の操作が成功することを確認してください。
n1> ./mongo n1/admin
> db.$cmd.findOne({replacepeer:1});
{
"info" : "adjust local.sources hostname; db restart now required" ,
"ok" : 1.0
}
この時点で、 n1 は動いたままですが、n3 との通信を待つようになります。サーバは動いたままですが、レプリケーションは止まっています。
- 次のコマンドを実行して、 n1 を n3 と通信するようにします。
n1> ./mongod --pairwith n3 --arbiter <arbiterserver>
- n1 とpairになるように n3 を起動
n3> ./mongod --pairwith n1 --arbiter <arbiterserver>
n3 は n1 と完全に同期が取れるまで、どんなコマンドも"master"としては受け付ないことに注意してください。また、この操作は、 n1 のデータが多い場合時間がかかります。
slaveに対するクエリー
"slave ok flag"を立てることで、slaveに対してクエリーを実行することができます。シェルで、
db.getMongo().setSlaveOk()
arbiter とは何で、どういう場合に使うべきですか
arbiter は、ある局面で、pairのどれがmasterになるべきかという判断で使われます。ネットワークの切断 (両方とも生きてるが、通信できなくなった状態)では、arbiterに通信できるデータベースがmasterになります。
もし、両方のサーバが同じswitch(ネットワーク)にある場合、arbiterは不必要です。たとえば、同じec2 availability zonesで走らせる場合、同様に多分いらないでしょう。でも、違うec2 availability zonesで動かす場合には、arbiterを使うべきです。
既存のデータベースをpairにする
単独で動いているデータベースの既存のデータで、pairを有効にしたい場合、十分注意してください。pairを開始するには次の手順に従ってください。下記では、2つのサーバを"left"、"right"と呼びます。
- 両方のサーバでmongodプロセスが動いていないことを確認してください。
- left側のサーバにデータがあるとします。/data/db (--dbpath) のディレクトリに local.* なファイルがないことを確認してください。もしあった場合、削除してください。
- rightの/data/dbディレクトリが空になっていることを確認してください。
- leftのプロセスを--pairwithオプションを付けて起動します。
- rightのプロセスを正しいコマンドラインで起動します。
もし、leftとrightの両方のサーバのdbpathディレクトリにデータファイルがある場合、エラーが起きます。新しいpairが初期化されている間(レプリケーションのメタデータを含む)ローカルなデータベースはいらないでしょう。
IF YOU HAVE A QUESTION, POST IT TO THE USER GROUP.
These pages are fine for comments, but for questions, your best bet will always be the MongoDB User Group. blog comments powered by Disqus