2013年5月31日金曜日

mongoDBでレプリカセットをやってみた

■概要
今回は1台のサーバで3ノード(プロセス)立ててレプリカセットを作成しました
mongoのバージョンは2.4.3
未インストールの場合は以下を参考にインストールしてください
http://kakakikikeke.blogspot.jp/2012/07/mongodbperl.html

■レプリケーション設定
□master
mkdir -p /data/node1
mkdir -p /data/node2
mkdir -p /data/node3
3ノード分のフォルダを作成

mongod --dbpath=/data/node1 --replSet=myrep --port=27017 --fork --logpath /var/log/mongodb27017.log --logappend
mongod --dbpath=/data/node2 --replSet=myrep --port=27018 --fork --logpath /var/log/mongodb27018.log --logappend
mongod --dbpath=/data/node3 --replSet=myrep --port=27019 --fork --logpath /var/log/mongodb27019.log --logappend
3ノード分のプロセスを起動します replSet は同じ名前にします
--fork を入れることでバックグラウンド実行することができます

mongo --port 27017
今回は 27017 ポートで動作しているプロセスをマスターノードとして設定します

config = {
"_id" : "myrep",
"members" : [
{ "_id" : 0, "host" : "127.0.0.1:27017" },
{ "_id" : 1, "host" : "127.0.0.1:27018" },
{ "_id" : 2, "host" : "127.0.0.1:27019", "arbiterOnly" : true } ] }
mongoのインタラクティブモードになったら上記を実行して config オブジェクトを実行します

rs.initiate(config)
rs.status()
config を引数にしてレプリカセットを初期化します
エラーにならなければ設定完了です
status で確認したときに3ノードが登録されていることも確認します

exit
mongo --port 27017
use mydb
db.test.insert({"key001": "values001"})
db.test.find()
一旦抜けたあとに再度インタラクティブモードになりテストデータをインサートしてデータが入ったことを確認します

□slave
mongo --port 27018
27018 ポートで動作しているプロセスをスレーブとしてます

db.getMongo().setSlaveOk()
スレーブとして動作させるためのおまじないです

show dbs
use mydb
db.test.find()
マスタからインサートしたデータがスレーブ側でも反映されていることを確認します

一番失敗しやすいのは config オブジェクトを作成してレプリカセットを初期化するところだと思います
ここでエラーになった場合はエラーメッセージでググればいろいろと解決策は出てくると思います

0 件のコメント:

コメントを投稿