レプリケーション

based on v26->v83(移行中)

紹介

MongoDBはバックアップやフェールオーバーに備えてサーバー間の非同期レプリケーションをサポートしています。
レプリケーションは、master/slave構成を拡張したもので、1つのサーバだけが書き込みに対してアクティブ(master)になることを意味します。
setまたはshard においては常に1つのサーバーのみが書き込みに対してアクティブ(primary/master)になっています。常に1つだけのmasterのみが書き込みに対してアクティブなことにより、強い一貫性(consistency)を実現します。
レプリケーションの1番の目的は、フェイルオーバーと冗長性です。

それ以外のサーバー(slave/secondary)に対しては、オプションで読み込み権限を与えることができます。これは結果整合性を採用しているためです。

MongoDBは現在master/slaveとreplica setsの2つの種類のレプリケーションをサポートします。従来まではmaster/slave、replica pairの2種類でしたが、v1.6.0 でreplica setsが導入され、replica pairsはこれに含まれる形となりました。詳しくは次のページを参照してください。

どの構成を選べば良いのか

3つのレプリケーションの内のどれを選べば良いのかの基準として、以下のポイントを参考にしてください:

  • v1.6 以下を使用している場合: master/slave
  • フェールオーバーやリカバリーのを自動で行いたい場合(管理は容易): replica sets
  • セキュリティ機能 --auth (security) や遅延スレーブ機能 --slavedelay を使用したい場合: (現在のところ) master/slave
  • シャーディング機能を利用したい場合 : どちらも可、ただし大きなクラスターを使用する場合はreplica sets
  • リスクを避ける場合 : master/slave (replica setsは v1.6.0からの新機能なので)

セキュリティ、遅延スレーブ機能に関してはこのページで説明します。

セキュリティ

セキュリティ機能が有効になっている場合、両方のサーバー上に存在する local のデータベースで、ユーザアカウントを設定してください。

slave 側のレプリケーション接続は、 local.system.usersrepl ユーザーをまず探します。存在する場合、ソース側のデータベースに対しての認証で、そのユーザーを使います。 repl ユーザーが存在しない場合、 local.system.users の最初のユーザーオブジェクトで接続を試みます。

local データベースは、 admin データベースのように使われます。 local にあるアカウントですべてのサーバーへアクセスします。

シェルからの確認

mongo シェルでmasterのステータスを確認します。

// master上のlocal.oplog.$main の中を調べ、状態を表示します。
db.printReplicationInfo() 

mongo シェルでslaveの状態を確認します。

// slaveのlocal.sourcesを中を調べ、状態を表示します。
db.printSlaveReplicationInfo() 

(上記のファンクションを括弧なしで実行することで、javascriptのソースを見ることができます)

バージョン1.3.2時点では、slaveで以下のことができます。

db._adminCommand( { serverStatus : 1 , repl : N } )

N は、診断情報のレベルで、以下の値を設定することができます。

  • 0 - none
  • 1 - local (他のサーバにつなぐ必要がない)
  • 2 - remote (チェックのためにマスターに接続する必要がある)

httpインターフェース

管理用の http Interace (port 28017) で、master/slaveのどちらでも、基本的なmongodのプロセスの情報を確認できます。

replInfo: repl: sleep 2sec before next pass
replication
master: 0
slave: 1
initialSyncCompleted: 1

オプション

遅延slave

ヒューマンエラーの対策として、masterから数時間遅れたデータを持つslaveを持つことが有益なことがあります。これは、MongoDB 1.3.3以上で、--slavedelayオプションをmongodコマンドラインオプションに付けることで可能です。

 
--slavedelay //masterからslaveに遅らせる時間(秒で)を指定します。

参照

プレゼンテーション


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