実戦MongoDB-ReplicationのReplica Set


実戦MongoDB
Master-Slave
 
MongoDBは、異なるサービス間の非同期のデータレプリケーションをサポートし、failover(フェイルオーバー、フェイルオーバー、フェイルオーバー)and redundancy(データ冗長)を実現します.
同じ時間に、書き込みは1つのサービスノード(primaryまたはmaster)のみでサポートされます.
MongoDBでは、2つのレプリケーション・モードがサポートされています.
  • Master/Slaveは、マスターとslaveを含むマスターからコピーされます.
  • Replica Set、primaryとsecondaryを含むレプリケーションセットレプリケーション.

  •  
    Master/Slaveの公式アドレスを紹介します.
    http://www.mongodb.org/display/DOCS/Master+Slave
    Replica Setの公式アドレスを紹介します.
    http://www.mongodb.org/display/DOCS/Replica+Sets
     
    今日実戦したのはreplica set、つまりレプリケーションセットレプリケーションです.
  • replica setは、自動failoverおよび自動recoveryを実現することができる.
  • replica setは、2つ以上のノードからなり、互いのレプリケーションを実現する.
  • replica setはprimaryノードを自動的に選択し、固定primaryノードは1つもありません.
  • mongosは、replica setのprimaryノードが変化していることを自動的に発見し、この新しいprimaryノードに書き込み操作を送信します.

  • 通常は次のシーンで使用されます.
  • データ冗長性.
  • 自動failoverは、高可用性のサービスを提供します.
  • 分散読みの負荷.
  • メンテナンスをシンプル化します(master-slaveに対して).
  • ディザスタリカバリ.

  • まずmongodを起動します.replica setのパラメータは2つあります.
    --replset、複製セットの名前.
    --oplogSize、操作ログのサイズ、単位はMBです.
    今回はubuntuの下にreplica setを構成し、まず2つのmongodノードを起動します.
     
       
       
       
       
    1. mongod --dbpath /home/andyshi/mongo1/ --logpath /home/andyshi/mongo1/log.log --replSet shard1 --port 10001 --bind_ip 192.168.0.21 

     
       
       
       
       
    1. mongod --dbpath /home/andyshi/mongo2/ --logpath /home/andyshi/mongo2/log.log --replSet shard1 --port 10002 --bind_ip 192.168.0.21 

    上の2つのmongodの起動パラメータreplSetは、同じ値shard 1を指定しています.つまり、2つのmongodノードが同じreplica setにあることに気づきます.
    Replica Setの初期化
    光は2つのmongodノードを起動し、まだ何のサービスも提供できません.この場合、mongo接続を使用してdbを行います.book.Insertはno master、つまりprimaryノードがないので、どのノードにデータを書き込むか分かりません.
    2つのmongodノードを起動した後、初期化する必要があります.
    まずmongoで任意のmongodノードに接続し、次のコマンドを実行します.
       
       
       
       
    1. cfg={_id:'shard1',members:[ 
    2. {_id:0,host:'192.168.0.21:10001'}, 
    3. {_id:1,host:'192.168.0.21:10002'}] 
    4. rs.initiate(cfg) 

    次のヒント情報が現れると成功を表します.成功しなければ、googleでエラーヒントを与えると、多くの答えが見つかります.
     
       
       
       
       
    1.    "info" : "Config now saved locally.  Should come online in about a minute.", 
    2.    "ok" : 1 

    続行
     
       
       
       
       
    1. rs.status() 

    名前、時間、現在ログインしているmongodがprimaryなのかsecondaryなのか、メンバーの情報など、replica setのステータスを表示できます.
    Replica setの情報では、次のことが重要です.
  • myStateの値で、1であれば現在ログインしているprimaryを表します.2であれば、現在ログインしているのはsecondaryです.

  • メンバー情報には、住所、健康状態、primaryかsecondaryかなどが含まれています.
    メンバー情報で重要なのは
  • state:1は、hostが現在読み書き可能であることを示し、2:読み書き不可
  • health:1はhostが現在正常であることを示し、0:異常
  • このときprimaryのmongodにログインし、データを挿入します.
     
       
       
       
       
    1. // 10001 primary, rs.status  
    2. mongo 192.168.0.21:10001 
    3.  
    4. use test 
    5. db.book.insert({'title':'computer'}) 

    次にsecondaryのlogファイルを表示すると、コピー動作が発生しています.
    このときsecondary,use test,dbにログインします.book.find()、間違えてもいいです.
     
       
       
       
       
    1. error: { "$err" : "not master and slaveok=false", "code" : 13435 } 

    大丈夫です.secondaryでデータを読み込むには、データを読み込むsecondaryで実行する最後のステップが必要です.
     
       
       
       
       
    1. rs.slaveOK()

    この時再びdb.book.find()は、正常に結果が表示され、問題ありません.
     
    ノードの追加
     
    新しいmongodノードの起動
     
       
       
       
       
    1. mongod --dbpath /home/andyshi/mongo3/ --logpath /home/andyshi/mongo3/log.log --replSet shard1 --port 10003 --bind_ip 192.168.0.21   
    
    
    

    primaryノードに接続し、次のコマンドを実行します.
     
       
       
       
       
    1. rs.add('192.168.0.21:10003') 
    2. rs.addArb('192.168.0.21:10003') 
    3. //  
    4. rs.reconfig(rs.conf()) 

     
    ノードをprimaryに強制
    mongodb 2.0以降は次のように使用できます.
    master-slaveに比べて、replica setの利点は、単一の障害がないことです.primary障害の後、replica set全体が自動的に健康なノードを選択してprimaryになり、書くタスクを引き受け、master-slaveよりも可用性が高く、より高い可用性を提供します.