chunkSizeではまる

MongoDBのShardingまわりいじっててmongosの起動の際にパラメータ指定してもなんかどうにもchunkSizeが適用されない。
configサーバのsettingsコレクションが怪しい気がする。

> db.settings.find()                                    
{ "_id" : "chunksize", "value" : 64 }


1.8のデフォルトは64MBなのでその値が入ってるみたい。
mongosの起動パラメータにchunkSize指定したらここが変更されてもよさそうなのになー。んーんーんー。
でもその場合複数mongos起動した場合にそれぞれでchunkSizeの指定が違った場合に対応できないしなー。
いやでもchunkとか管理するのはcongfigサーバだからどっかにサイズ持ってそうなもんだしなー。


と思って調べてみるとこんなんが。
Google Groups


configサーバ立ち上げてから初めてmongos立ち上げたタイミングで指定したchunkSizeのみが適用される的な。
以降はsettingsを手動で更新しろよ的な。
英語わかんないけどなんかそういう感じでしょうか。


というわけでEliotさんを信じてためしてみる。

> db.settings.update({_id:"chunksize"},{$set:{value:1}})
> db.settings.find()                                    
{ "_id" : "chunksize", "value" : 1 }


この状態で適当にぶちこんでもなんか上手くいってない気がしたのでconfigサーバとmongos立ち上げ直して念のためenableshardingとかもやり直して再度適当にぶちこむ。

> db.printShardingStatus()
(略)
  databases:
        { "_id" : "admin", "partitioned" : false, "primary" : "config" }
        { "_id" : "test2", "partitioned" : true, "primary" : "set01" }
                test2.table01 chunks:
                                set01   28
                                set03   27
                                set02   43


おお分割されてる。
ちょっと待ったらmigrationが起きて均等に割り振られました。

  databases:
        { "_id" : "admin", "partitioned" : false, "primary" : "config" }
        { "_id" : "test2", "partitioned" : true, "primary" : "set01" }
                test2.table01 chunks:
                                set01   33
                                set03   32
                                set02   33


migration中にcountとか発行したら噂通り本来の数より多い数値が表示されました。
なるほどなー。

ReplicaSetとかShardingとかためしてみる(Sharding編)

ReplicaSetを前回のエントリで構築できたので早速Shardingの設定にいってみます。
Shardingについては以下。


とりあえずconfigサーバなるメタデータ格納用のサーバを立ち上げます。
必須パラメータは「--configsvr」です。
デフォルトでは27019ポートにバインドするみたい。

mongod --configsvr --dbpath /data/mongodb/conf --logpath /var/log/mongodb/conf.log --logappend --pidfilepath /data/mongodb/conf.pid --directoryperdb --fork --rest


続けて各shardへのルーティングを行うmongosを立ち上げます。
デフォルトでは27017ポートにバインドしますが27017はちょっと別のmongo用に使ってたので他のポートを指定してます。
chunkの確認もしたかったので「--chunkSize」も指定しときます。
これを指定しないとデフォルトのサイズ(1.8では64M、1.6では200M)が使われて確認がめんどくさそうなので。

mongos --configdb localhost:27019 --port 27020 --logpath /var/log/mongodb/mongos.log --logappend --pidfilepath /data/mongodb/mongos.pid --fork --chunkSize 1


正常に立ち上がったようなので早速mongosに入ってShardingの設定をしてみます。

mongo --port 27020 admin
> db.runCommand({addshard:"set01/***.***.***.***:10001,***.***.***.***:10002,***.***.***.***:10003",name:"set01"});
{
        "ok" : 0,
        "errmsg" : "can't use localhost as a shard since all shards need to communicate. either use all shards and configdbs in localhost or all in actual IPs "
}


なんかエラーでた。
configサーバとshardは全てlocalhostか全て実IP指定かどっちかにしろってことでしょうか。

とりあえずconfigサーバに実IP指定してみます。
ついでなのでshardのIPのところはhost名に書き換えてみます。

mongos --configdb ***.***.***.***:27019 --port 27020 --logpath /var/log/mongodb/mongos.log --logappend --pidfilepath /data/mongodb/mongos.pid --fork

> db.runCommand({addshard:"set01/mongodb01:10001,mongodb01:10002,mongodb01:10003",name:"set01"});               
{
        "ok" : 0,
        "errmsg" : "host mongodb01:10001 does not belong to replica set as a non-passive memberset01"
}


またおこられた。ReplicaSetの設定も変更してみる。
とりあえずset01のprimaryに入って下記を参考にReplicaSetを再構築します。
Deploy a Replica Set — MongoDB Manual 2.4.8

set01:PRIMARY> new_config = {_id:'set01',members:[{_id:0, host:'mongodb01:10001'},{_id:1, host:'mongodb01:10002'},{_id:2, host:'mongodb01:10003'}]}
set01:PRIMARY> use local
set01:PRIMARY> old_config=db.system.replset.findOne();
set01:PRIMARY> new_config.version=old_config.version+1; 
set01:PRIMARY> use admin
set01:PRIMARY> db.runCommand({replSetReconfig:new_config});
set01:PRIMARY> rs.status()
{
        "set" : "set01",
        "date" : ISODate("2011-05-11T13:28:40Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "***.***.***.***:10001",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "optime" : {
                                "t" : 1305116528000,
                                "i" : 7281
                        },
                        "optimeDate" : ISODate("2011-05-11T12:22:08Z"),
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "mongodb01:10002",
(略)
                }
        ],
        "ok" : 1
}


反映されてない…!
nameがmongodb01になってて欲しかったんですけど。
困ったときの再起動ということでReplicaSet全部落として再度試します。

set01:PRIMARY> rs.status()
{
        "set" : "set01",
        "date" : ISODate("2011-05-11T13:28:40Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "mongodb01:10001",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "optime" : {
                                "t" : 1305116528000,
                                "i" : 7281
                        },
                        "optimeDate" : ISODate("2011-05-11T12:22:08Z"),
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "mongodb01:10002",
(略)
                }
        ],
        "ok" : 1
}


いけた。
こういうものなのかな。
あんまりやらないオペレーションだとは思うけどmember増やすときとかちょっと不安。


hostsの設定をmongosの乗ってるサーバでもして改めてShardingの設定を試してみます。

> db.runCommand({addshard:"set01/mongodb01:10001,mongodb01:10002,mongodb01:10003",name:"set01"});
{ "shardAdded" : "set01", "ok" : 1 }


いけた…!
同じようにset02、03も設定します。
完了したらconfigサーバに入って確認!

> db.shards.find()
{ "_id" : "set01", "host" : "set01/mongodb01:10001,mongodb01:10002,mongodb01:10003" }
{ "_id" : "set02", "host" : "set02/mongodb02:10001,mongodb02:10002,mongodb02:10003" }
{ "_id" : "set03", "host" : "set03/mongodb03:10001,mongodb03:10002,mongodb03:10003" }


どうやらいけてる模様。
準備は整ったので実際にDBとコレクションをShardingの対象にしてみます。

> db.runCommand({enablesharding:"test"})
{ "ok" : 1 }

> db.printShardingStatus()
--- Sharding Status --- 
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
      {
        "_id" : "set01",
        "host" : "set01/mongodb01:10001,mongodb01:10003,mongodb01:10002"
}
      {
        "_id" : "set02",
        "host" : "set02/mongodb02:10001,mongodb02:10003,mongodb02:10002"
}
      {
        "_id" : "set03",
        "host" : "set03/mongodb03:10001,mongodb03:10003,mongodb03:10002"
}
  databases:
        { "_id" : "admin", "partitioned" : false, "primary" : "config" }
        { "_id" : "test2", "partitioned" : true, "primary" : "set02" }


set02をprimaryとして「test」DBのShardingが有効になったみたい。
set02でも確認してみます。

set01:PRIMARY> show dbs
admin   (empty)
local   1.203125GB
test2    (empty)

あるある。でもset01と03にはまだデータがないのでtest2自体存在しません。
次にコレクションをSharding対象にします。
自動でindex作られるみたいなことをどっかで見ましたが、先駆けてindexを作成しときます。
indexは一旦適当です。

> db.table01.ensureIndex({createdDatetime:1,entryId:1});
> db.table01.getIndexes()
[
        {
                "name" : "_id_",
                "ns" : "test2.table01",
                "key" : {
                        "_id" : 1
                },
                "v" : 0
        },
        {
                "_id" : ObjectId("4dca5d3b4c06e48a77e298cb"),
                "ns" : "test2.table01",
                "key" : {
                        "createdDatetime" : 1,
                        "entryId" : 1
                },
                "name" : "createdDatetime_1_entryId_1",
                "v" : 0
        }
]


続けてcollectionにindexと同じものをShardKeyに指定してshardCollectionを実行します。

> use admin
switched to db admin
> db.runCommand({shardCollection:"test2.table01",key:{createdDatetime:1,entryId:1}});           
{ "collectionsharded" : "test2.table01", "ok" : 1 }
> db.printShardingStatus()
--- Sharding Status --- 
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
      {
        "_id" : "set01",
        "host" : "set01/mongodb01:10001,mongodb01:10003,mongodb01:10002"
}
      {
        "_id" : "set02",
        "host" : "set02/mongodb02:10001,mongodb02:10003,mongodb02:10002"
}
      {
        "_id" : "set03",
        "host" : "set03/mongodb03:10001,mongodb03:10003,mongodb03:10002"
}
  databases:
        { "_id" : "admin", "partitioned" : false, "primary" : "config" }
        { "_id" : "test", "partitioned" : true, "primary" : "set01" }
                test2.table01 chunks:
                                set02   1
                        { "createdDatetime" : { $minKey : 1 }, "entryId" : { $minKey : 1 } } -->> { "createdDatetime" : { $maxKey : 1 }, "entryId" : { $maxKey : 1 } } on : set02 { "t" : 1000, "i" : 0 }
        { "_id" : "test2", "partitioned" : true, "primary" : "set02" }
                test2.table01 chunks:
                                set02   1
                        { "createdDatetime" : { $minKey : 1 }, "entryId" : { $minKey : 1 } } -->> { "createdDatetime" : { $maxKey : 1 }, "entryId" : { $maxKey : 1 } } on : set02 { "t" : 1000, "i" : 0 }


何故か別のテスト用に作ったtestの方にも反映されている…。
一旦考えないことにして先に進めます…。


データの分割を確認するべくデータをたくさんぶちこんでみます。

> for(var i=1;i<=5000;i++) db.table01.save({entryId:i,createdDatetime:new Date(),text:"test0"+i});

db.printShardingStatus()するも変化なし。んんん?
データが少ないのかもしれないのでついカッとなって15万件までぶちこんだら変化がありました。

> db.printShardingStatus()
(略)
        { "_id" : "test2", "partitioned" : true, "primary" : "set02" }
                test2.table01 chunks:
                                set03   1
                                set02   2
                                set01   1
                        { "createdDatetime" : { $minKey : 1 }, "entryId" : { $minKey : 1 } } -->> { "createdDatetime" : ISODate("2011-05-11T09:51:25.418Z"), "entryId" : 1 } on : set03 { "t" : 2000, "i" : 0 }
                        { "createdDatetime" : ISODate("2011-05-11T09:51:25.418Z"), "entryId" : 1 } -->> {
        "createdDatetime" : ISODate("2011-05-11T11:38:21.927Z"),
        "entryId" : 67510
} on : set02 { "t" : 3000, "i" : 1 }
                        {
        "createdDatetime" : ISODate("2011-05-11T11:38:21.927Z"),
        "entryId" : 67510
} -->> {
        "createdDatetime" : ISODate("2011-05-11T11:38:33.941Z"),
        "entryId" : 128707
} on : set02 { "t" : 2000, "i" : 4 }
                        {
        "createdDatetime" : ISODate("2011-05-11T11:38:33.941Z"),
        "entryId" : 128707
} -->> { "createdDatetime" : { $maxKey : 1 }, "entryId" : { $maxKey : 1 } } on : set01 { "t" : 3000, "i" : 0 }


どうやら分割されたみたい。
configサーバでも確認してみる。

> db.chunks.find()  
{ "_id" : "test2.table01-createdDatetime_MinKeyentryId_MinKey", "lastmod" : { "t" : 2000, "i" : 0 }, "ns" : "test2.table01", "min" : { "createdDatetime" : { $minKey : 1 }, "entryId" : { $minKey : 1 } }, "max" : { "createdDatetime" : ISODate("2011-05-11T09:51:25.418Z"), "entryId" : 1 }, "shard" : "set03" }
{ "_id" : "test2.table01-createdDatetime_new Date(1305107485418)entryId_1.0", "lastmod" : { "t" : 3000, "i" : 1 }, "ns" : "test2.table01", "min" : { "createdDatetime" : ISODate("2011-05-11T09:51:25.418Z"), "entryId" : 1 }, "max" : { "createdDatetime" : ISODate("2011-05-11T11:38:21.927Z"), "entryId" : 67510 }, "shard" : "set02" }
{ "_id" : "test2.table01-createdDatetime_new Date(1305113901927)entryId_67510.0", "lastmod" : { "t" : 2000, "i" : 4 }, "ns" : "test2.table01", "min" : { "createdDatetime" : ISODate("2011-05-11T11:38:21.927Z"), "entryId" : 67510 }, "max" : { "createdDatetime" : ISODate("2011-05-11T11:38:33.941Z"), "entryId" : 128707 }, "shard" : "set02" }
{ "_id" : "test2.table01-createdDatetime_new Date(1305113913941)entryId_128707.0", "lastmod" : { "t" : 3000, "i" : 0 }, "ns" : "test2.table01", "min" : { "createdDatetime" : ISODate("2011-05-11T11:38:33.941Z"), "entryId" : 128707 }, "max" : { "createdDatetime" : { $maxKey : 1 }, "entryId" : { $maxKey : 1 } }, "shard" : "set01" }


entryIdの値が67510と128707を境に分割されてるみたい。
set03はどうなってるのかよく分からない。
試しにそれぞれのsetに入ってどんだけデータが入ってるか見てみます。

set01:PRIMARY> db.table01.find().count()
21294

set02:PRIMARY> db.table01.find().count()
128706

set03:PRIMARY> db.table01.find().count()
0


うむ。
とりあえず分割は確認できました。とりあえず。すごい偏ってるけど。
他にもshardCollectionのとき何で関係ないはずのDBに反映されたのかなとかchunkSize効いてなくね?とか色々不明点はあるので綺麗にしてもっかい試してみようとおもいます。

ReplicaSetとかShardingとかためしてみる(ReplicaSet編)

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の設定。次につづきます。

MongoDBをさわる(DBとかコレクションとか)

前回の記事で前準備が出来たので早速DBをいじってみる。

DBをつくる

いざ!と思ったもののDBの作り方さえ分からないのでhelpさんにお願いします。

> db.help()
DB methods:
        db.addUser(username, password[, readOnly=false])
        db.auth(username, password)
        db.cloneDatabase(fromhost)
(略)

えっ。DB作成できそうなコマンドがない。
「use 」で使用するDBを変更できるっぽいのでためしに存在しないDB名を渡してみます。

> use test2
switched to db test2

お?

> show dbs
admin   (empty)
local   (empty)
test    (empty)

おお?

> db.stats()      
{
        "db" : "test2",
        "collections" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "numExtents" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "fileSize" : 0,
        "ok" : 1
}

おおお…?

> show dbs        
admin   (empty)
local   (empty)
test    (empty)
test2   (empty)

できてる…!


useで切り替えてそのDBに対して何らかの操作をしたときに自動的に作られるみたい。
なるほど違和感。

テーブルをつくる

次はテーブルを作りたい。
調べたところMySQLとかで言うところのテーブルはコレクション、レコードはドキュメントと呼ぶらしい。
早速コレクションのhelpを!と思ったところで、先ほどDBのhelpを見たときそれっぽいのがあったのを思い出しました。

db.createCollection(name, { size : ..., capped : ..., max : ... } )

超それっぽい。
けどなんかsizeとかmaxとか指定するの気が進まないしcappedに至っては何のことかさっぱり分からない。
助けてオンラインドキュメント…!


なるほど。
とりあえずなんか今は必要ないということだけ分かった。


DBと同じように何か操作すれば作成されることを期待して、とりあえず何かinsertしてみます。
しかしやっぱりコマンドが分からないので今度はコレクションのhelpさんに助けを求めてみます。

> db.mycoll.help()
DBCollection help
        db.mycoll.find().help() - show DBCursor help
        db.mycoll.count()
        db.mycoll.dataSize()
(略)
        db.mycoll.save(obj)

db.mycoll.save(obj)…それっぽい…。
けどobjって何だ…。どう入れればいいんだ…。しにたい…。
やはり頼みの綱はドキュメント。


すてき!
JSONに似たBSONという形式で渡してやればよいみたい。
そうと分かれば早速実行…!

> db.table01.save({seq:1,text:"test1"});
> db.table01.find();
{ "_id" : ObjectId("4db90d62d4f62aaa740c8d43"), "seq" : 1, "text" : "test1" }

はいったー。


スキーマレスということで好き放題やってみる。

> db.table01.save({seq:2,text:"test2",array:[0,1,2]});
> db.table01.save({seq:3,text:"test2",insDatetime:new Timestamp()});
> db.table01.save({seq:2,text:"test2",array2:[{"x":0},{"y":1},{"z":2}]});
> db.table01.find();                                                     
{ "_id" : ObjectId("4db90d62d4f62aaa740c8d43"), "seq" : 1, "text" : "test1" }
{ "_id" : ObjectId("4db90f58bda403cc100f763a"), "seq" : 2, "text" : "test2", "array" : [ 0, 1, 2 ] }
{ "_id" : ObjectId("4db90f7ebda403cc100f763b"), "seq" : 3, "text" : "test2", "insDatetime" : { "t" : 0, "i" : 0 } }
{ "_id" : ObjectId("4db9106bbda403cc100f763c"), "seq" : 2, "text" : "test2", "array2" : [ { "x" : 0 }, { "y" : 1 }, { "z" : 2 } ] }

おお…。
配列も連想配列も、あるんだよ。すてきですね。


よく見たらコマンドコピーしたせいでseqとかtextとか被ったりしてる。はずい。アップデートしたい。

db.collection.update( criteria, objNew, upsert, multi )

これでいけるらしい。
とりあえず3つ目のドキュメントのtextの値を修正します。

> db.table01.update({_id: ObjectId("4db90f7ebda403cc100f763b")},{$set:{text:"text3"}}); 
> db.table01.find({_id:ObjectId("4db90f7ebda403cc100f763b")});
{ "_id" : ObjectId("4db90f7ebda403cc100f763b"), "seq" : 3, "text" : "text3", "insDatetime" : { "t" : 0, "i" : 0 } }

でけた!


次に4つ目のドキュメントのseqを修正します。
折角なのでなんかインクリメントする関数的なやつを使ってみます。

> db.table01.update({_id: ObjectId("4db9106bbda403cc100f763c")},{$inc:{seq:2}});
> db.table01.find({_id:ObjectId("4db9106bbda403cc100f763c")});                  
{ "_id" : ObjectId("4db9106bbda403cc100f763c"), "seq" : 4, "text" : "test2", "array2" : [ { "x" : 0 }, { "y" : 1 }, { "z" : 2 } ] }

でけた!


findするたび目に付いた_idは明示的に指定しないと自動的に入るみたい。


とりあえず今回はここまで。

CentOS5.4でMongoDBをためす

なんか流行ってるみたいなので!
環境はCentOS5.4(64bit)。ファイルシステムはとりあえずの検証用なのでext3。
がっつりやるときext4とかに変える予定。


色々調べたもののとりあえず入れないとどうにもならないので入れてみる。

インストール

yumでインストールするために/etc/yum.repos.d/にファイル作成して以下を貼り付け。

[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0

参考:Install MongoDB on Red Hat Enterprise, CentOS, or Fedora — MongoDB Manual 2.4.8


yum確認、インストール。

# yum search mongodb
mongo-10gen.x86_64 : mongo client shell and tools
mongo-10gen-server.x86_64 : mongo server, sharding server, and support scripts
# yum install mongo-10gen.x86_64 mongo-10gen-server.x86_64
(省略)
Complete!

ヤター。デキタヨー。

起動

起動スクリプトは「/etc/init.d/mongod」にあるっぽい。
yumで入れるとユーザー「mongo」が自動で作成され、この起動スクリプトにおける実行ユーザーもこれになってるみたい。
設定ファイルは「/etc/mongod.conf」あたり。


yumで入れておいてあれだけど会社でアカウントの規定があるので起動スクリプトバックアップとった上でユーザーまわりだけ書き換え。
起動スクリプトぽちっと実行。

# /etc/init.d/mongod start
Starting mongod: can't open [/var/log/mongo/mongod.log] for log file: errno:13 Permission denied
                                                           [失敗]

すみません。しにます。


ご丁寧に「/var/log/mongo/mongod.log」までもともと作成されてて権限がmongod:mongodになってるみたい。
「/var/lib/mongo/」も同様。

# chown -R xxx:xxx(作ったユーザー、グループ) /var/log/mongo/
# chown -R xxx:xxx /var/lib/mongo/

えいしゃおらー。

# /etc/init.d/mongod start
Starting mongod: all output going to: /var/log/mongo/mongod.log
forked process: 7383
                                                           [  OK  ]

えいしゃー。
できたー。

yumのプロセスで出てたけど念のためバージョン確認。

# /usr/bin/mongo --version
MongoDB shell version: 1.8.1

対話形式でごにょごにょ

気を取り直して対話形式のやつをためしてみる。

$ mongo
MongoDB shell version: 1.8.1
connecting to: test
> 

デフォルトではtestってDBに接続されてるみたい。そしてバージョン出た。せつない。
とりあえず何していいのか分からないので「help」を打ってみたら色々出たのでいくつか試してみる。

> show dbs
admin   (empty)
local   (empty)
test    (empty)

うむ。

> show users

お?

> show collections

おお?


結果存在しないとEmptyとか表示もしてくれない感じなんだろうか。

db.help()                    help on db methods
db.mycoll.help()             help on collection methods
rs.help()                    help on replica set methods

各メソッドのヘルプはこれらを実行すると得られるっぽい。


とりあえず対話抜ける方法が分かったので終わってみる。

> exit
bye

えいしゃー。


おつかれさまでした。

スポンサーリンク