概要
本連載では第4回ではレプリケーション,
前回のシャーディングの構成では,
これを解決するために,
さらに信頼性を高めたい場合は,
続いて,
実際に構築する
構築する構成
今回は4台のサーバを使ってレプリカセットとシャーディングを組み合わせた構成を作ります。具体的には,
configサーバとmongosサーバはフロントサーバ上で動作させます。configサーバの冗長化は行いません。ですので今回は4つのサーバを用います。
4つのサーバが用意できない場合は,
準備
まず全てのサーバに同じバージョンのMongoDBをダウンロードし展開しておきます。また,
全サーバでの作業
cd (MongoDBインストールディレクトリ) mkdir data log
レプリカセットの作成
最初に,
サーバAでの作業
mkdir data/node0a bin/mongod --replSet rs0 --port 30000 --dbpath=data/node0a --logpath=log/node0a --nojournal --fork
サーバBでの作業
mkdir data/node0b bin/mongod --replSet rs0 --port 30001 --dbpath=data/node0b --logpath=log/node0b --nojournal --fork
サーバCでの作業
mkdir data/node0c bin/mongod --replSet rs0 --port 30002 --dbpath=data/node0c --logpath=log/node0c --nojournal --fork
- [注意]
- 1つのmongodでジャーナルファイルに3G程度のディスク容量が必要です。試しに使うだけでディスク容量を節約したい場合は,
ジャーナルは必要ないので, --nojournalオプションを追加してジャーナルの機能を止めてください。
次にサーバAにてレプリケーションの設定を行います。サーバAにて設定を行うのはサーバAをプライマリにするためです。
サーバAでの作業
bin/mongo localhost:30000 # ←mongoシェルに接続
サーバAのMongoシェルで作業
cfg = { _id : "rs0", members : [ { _id : 0, host : "(サーバAのIP):30000" }, { _id : 1, host : "(サーバBのIP):30001" }, { _id : 2, host : "(サーバCのIP):30002" } ] } rs.initiate(cfg) # → "ok" : 1 と表示されれば成功 rs.status() # → 時間がたつとサーバAがプライマリになります
- [注意]
- IPアドレスは,
1つのレプリカセット内でループバックインターフェース (localhostや127. 0.0. 1) とネットワークインターフェースを混在させることはできません。つまり (サーバAのIP) の部分は, サーバAのネットワークインターフェースのIPアドレスにしてください。 - [参考]
- うまくいかないときは,
サーバAのmongoシェルで, サーバBやサーバCのmongodに接続できるか確認してみましょう。ネットワークの疎通ができているかの確認になります。また, 設定をやり直すためにmongodを停止する場合は, killallコマンドが便利です。
続いて,
まずmongodを起動します。
サーバAでの作業
mkdir data/node1a bin/mongod --replSet rs1 --port 30010 --dbpath=data/node1a --logpath=log/node1a --nojournal --fork
サーバBでの作業
mkdir data/node1b bin/mongod --replSet rs1 --port 30011 --dbpath=data/node1b --logpath=log/node1b --nojournal --fork
サーバCでの作業
mkdir data/node1c bin/mongod --replSet rs1 --port 30012 --dbpath=data/node1c --logpath=log/node1c --nojournal --fork
続いてレプリケーションを設定しますが,
サーバBでの作業
bin/mongo localhost:30011
サーバBのMongoシェルでの作業
cfg = { _id : "rs1", members : [ { _id : 0, host : "(サーバAのIP):30010" }, { _id : 1, host : "(サーバBのIP):30011" }, { _id : 2, host : "(サーバCのIP):30012" } ] } rs.initiate(cfg) # → "ok" : 1 と表示されれば成功 rs.status() # → 時間がたつとサーバBがプライマリになります
最後に,
まずmongodを起動します。
サーバAでの作業
mkdir data/node2a bin/mongod --replSet rs2 --port 30020 --dbpath=data/node2a --logpath=log/node2a --nojournal --fork
サーバBでの作業
mkdir data/node2b bin/mongod --replSet rs2 --port 30021 --dbpath=data/node2b --logpath=log/node2b --nojournal --fork
サーバCでの作業
mkdir data/node2c bin/mongod --replSet rs2 --port 30022 --dbpath=data/node2c --logpath=log/node2c --nojournal --fork
続いてレプリケーションを設定を行いますが,
サーバCでの作業
bin/mongo localhost:30022
サーバCのMongoシェルでの作業
cfg = { _id : "rs2", members : [ { _id : 0, host : "(サーバAのIP):30020" }, { _id : 1, host : "(サーバBのIP):30021" }, { _id : 2, host : "(サーバCのIP):30022" } ] } rs.initiate(cfg) # → "ok" : 1 と表示されれば成功 rs.status() # → 時間がたつとサーバCがプライマリになります