JavaでMongoDB読み書きとか先に試してたんですが、いずれ触ることになるのでそっちまとめる前にReplicaSetとかShardingを触ってみます。
ReplicaSetとShardingに関しては以下を。
The MongoDB 2.4 Manual — MongoDB Manual 2.4.8
The MongoDB 2.4 Manual — MongoDB Manual 2.4.8
ざっくり言うとレプリとかフェイルオーバーあたりをいい感じにやってくれるものみたいです。
全部1台でやろうかと思ったんですが、ちょっとだけプロダクト環境に近い形で以下のような構成でやります。
とりあえずmongodのほうから。
上の画像の通り1つのサーバ内でReplicaSetを構築してみます。
ディレクトリとかぱぱっと作ってReplicaSetの構築に必要なパラメータ「--replSet」を付与してmongod起動。
Shargingの設定もあとで設定するので「--shardsvr」も指定しときます。
mongod --replSet set01 --shardsvr --port 10001 --dbpath /data/mongodb/rs01 --logpath /var/log/mongodb/rs01.log --logappend --pidfilepath /data/mongodb/rs01.pid --directoryperdb --fork --rest mongod --replSet set01 --shardsvr --port 10002 --dbpath /data/mongodb/rs02 --logpath /var/log/mongodb/rs02.log --logappend --pidfilepath /data/mongodb/rs02.pid --directoryperdb --fork --rest mongod --replSet set01 --shardsvr --port 10003 --dbpath /data/mongodb/rs03 --logpath /var/log/mongodb/rs03.log --logappend --pidfilepath /data/mongodb/rs03.pid --directoryperdb --fork --rest
プロセス見たりnetstat見たりhttp://IP:port+1000にアクセスしてみたりして起動確認。
とりあえず問題はなさそう。
rs01のportに入って早速ReplicaSetの設定をしてみます。
説明は以下を。
The MongoDB 2.4 Manual — MongoDB Manual 2.4.8
> config = {_id:'set01',members:[{_id:0, host:'localhost:10001'},{_id:1, host:'localhost:10002'},{_id:2, host:'localhost:10003'}]} { "_id" : "set01", "members" : [ { "_id" : 0, "host" : "localhost:10001" }, { "_id" : 1, "host" : "localhost:10002" }, { "_id" : 2, "host" : "localhost:10003" } ] } > rs.initiate(config);
最後のコマンド実行後ちょっと待つと以下のような結果が返ってきます。
{ "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 } set01:STARTUP2> set01:PRIMARY>
どうやらいけたっぽい。
コマンドラインの最初の文字が若干変わってる。
他のmemberに入るとPRIMARYのところがSECONDARYになってます。なるほどべんり。
念のためそれぞれのmemberの状態の確認をしておきます。
set01:PRIMARY> rs.status() { "set" : "set01", "date" : ISODate("2011-05-10T07:13:07Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "localhost:10001", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "optime" : { "t" : 1305011545000, "i" : 1 }, "optimeDate" : ISODate("2011-05-10T07:12:25Z"), "self" : true }, { "_id" : 1, "name" : "localhost:10002", (略) } ], "ok" : 1 }
healthが1になってるのでいけてるみたいですね!
ついでなのでPRIMARYで適当にぶちこんでSECONDARYにレプリされてるか確認してみます。
set01:SECONDARY> db.table01.find() error: { "$err" : "not master and slaveok=false", "code" : 13435 }
おこられた。
masterでもslaveokでもないからあかんといわれてます。
masterではないのでslaveokになりたいです。なります。
set01:SECONDARY> db.getMongo().setSlaveOk() set01:SECONDARY> db.table01.find() { "_id" : ObjectId("4dc8e88129202b316f2adb81"), "name" : "test" }
できたー。
でも何があるか分かんなくてこわいので戻しておきます。
set01:SECONDARY> db.getMongo().slaveOk = false false set01:SECONDARY> db.table01.find() error: { "$err" : "not master and slaveok=false", "code" : 13435 }
うむ。
とりあえず求めてるものは出来た気がするので他のReplicaSetも同じように作ります。
作れたら次はShardingの設定。次につづきます。