Replica Pairs

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へ切り替えます。

  1. 可能であれば、 死んだ n2 が二度とオンラインにならないようにしてください。そうしないと、間違った古いpairで通信してしまう可能性があります。
  2. n1n2 の代わりに 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 との通信を待つようになります。サーバは動いたままですが、レプリケーションは止まっています。

  3. 次のコマンドを実行して、 n1n3 と通信するようにします。
    n1> ./mongod --pairwith n3 --arbiter <arbiterserver> 
    
  4. n1 とpairになるように n3 を起動
    n3> ./mongod --pairwith n1 --arbiter <arbiterserver> 
    

    n3n1 と完全に同期が取れるまで、どんなコマンドも"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が初期化されている間(レプリケーションのメタデータを含む)ローカルなデータベースはいらないでしょう。


Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.

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