使用しているStorageEngine

MongoDBにおいて表題の件を調べたい。

■ 環境

  • MongoDB 3.0.10/3.2.4
  • Docker 1.10.3
  • Mac OSX El Capitan

■ MongoDB

3.2“系ではデフォルトのStorageEngineが”WiredTiger“になったらしい。ディスクの使用量が大幅に下がったとか。とりあえず現状の環境は”3.2“系ではないのだが、そもそもデフォルトままであるから”mmapv1“が使われていると思われるのだが確認しておきたい。

■ MongoDB 3.0系

サーバを起動。

$ docker run -d --name mongo30 mongo:3.0.10

クライアントを接続して確認してみる。`db.serverStatus()`で取得ができそうである。

$ docker run -ti --rm --link mongo30 mongo:3.0.10 /bin/bash
root@ac6193941f36:/#
root@ac6193941f36:/# mongo --host mongo30
MongoDB shell version: 3.0.10
connecting to: mongo30:27017/test
Welcome to the MongoDB shell.
>
> db.serverStatus()
{
    "host" : "8130afcefb48",
    "version" : "3.0.10",
    "process" : "mongod",
  :
    "storageEngine" : {
        "name" : "mmapv1"
    },
  :

mmapv1“が使われていることが確認できる。

■ MongoDB 3.2系

サーバを起動。

$ docker run -d --name mongo32 mongo:3.2.4

クライアントから接続。

$ docker run -ti --rm --link mongo32 mongo:3.2.4 /bin/bash
root@82544d922a04:/#
root@82544d922a04:/# mongo --host mongo32
MongoDB shell version: 3.2.4
connecting to: mongo32:27017/test
Welcome to the MongoDB shell.
>
> db.serverStatus()
{
    "host" : "fb617c1ef2bc",
    "advisoryHostFQDNs" : [ ],
    "version" : "3.2.4",
    "process" : "mongod",
  :
    "storageEngine" : {
        "name" : "wiredTiger",
        "supportsCommittedReads" : true
    },
  :

3.2“系では`db.serverStatus()`で取得できるものが随分多くなっているようだ。

以上。

CappedCollection

MongoDBにおいて表題を試す。

■ 環境

  • MongoDB 3.0.7
  • Mac OSX (10.10.5)

■ MongoDB

起動する。先日のエントリの通りの設定である。

$ mongod --config /usr/local/etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4142
child process started successfully, parent exiting
$

■ CappedCollection

CappedCollection“は、2つの方法で作成することができる。1つはこれkション作成時に指定する。

> db.createCollection("log", {capped: true, size: 100})

上記は、コレクションサイズが最大100byteの”log“コレクションを”CappedCollection“で作成している。

既に存在するコレクションを”CappedCollection“にするには下記の通り。

$ db.runCommand({"convertToCapped": "log", size: 100})

■ データ投入

データを投入しつつドキュメントも見てみる。

> db.createCollection("log", {capped: true, size: 100})
{ "ok" : 1 }
>
> show collections
log
system.indexes
>
> db.log.insert({test: "aaa"})
WriteResult({ "nInserted" : 1 })
>
> db.log.find()
{ "_id" : ObjectId("565c0afc90b88be4ec0bee18"), "test" : "aaa" }
>
> db.log.insert({test: 1111111111})
WriteResult({ "nInserted" : 1 })
> db.log.insert({test: 2222222222})
WriteResult({ "nInserted" : 1 })
> db.log.insert({test: 3333333333})
WriteResult({ "nInserted" : 1 })
> db.log.insert({test: 4444444444})
WriteResult({ "nInserted" : 1 })
> db.log.insert({test: 5555555555})
WriteResult({ "nInserted" : 1 })
>
> db.log.find()
{ "_id" : ObjectId("565c0bb890b88be4ec0bee25"), "test" : 1111111111 }
{ "_id" : ObjectId("565c0bbd90b88be4ec0bee26"), "test" : 2222222222 }
{ "_id" : ObjectId("565c0bc190b88be4ec0bee27"), "test" : 3333333333 }
{ "_id" : ObjectId("565c0bc690b88be4ec0bee28"), "test" : 4444444444 }
{ "_id" : ObjectId("565c0bca90b88be4ec0bee29"), "test" : 5555555555 }
>

この時点までは特に変化は無し。そのままデータの投入を続けていくと、下記のようになる。

> db.log.find()
{ "_id" : ObjectId("565c0bc690b88be4ec0bee28"), "test" : 4444444444 }
{ "_id" : ObjectId("565c0bca90b88be4ec0bee29"), "test" : 5555555555 }
  :
> db.log.count()
73
> 

size“で指定したものと合っているのかはこの時点ではわからないが、最初に投入したデータから順に消えていくということが分かるであろう。ログのように増える一方のデータを扱うには良いコレクションである。

■ 注意点

CappedCollection“は”update“や”remove“といったデータの変更ができない。

> db.log.remove({})
WriteResult({
    "nRemoved" : 0,
    "writeError" : {
        "code" : 20,
        "errmsg" : "cannot remove from a capped collection: test.log"
    }
})

以上。

■ 関連

MongoDBのデータ移行

表題の通り。MongoDBのデータを移行する。全データではなく特定のコレクションだけを対象にして行う。`mongodump`/`mongorestore`もあるが、今回は`mongoexport`/`mongoimport`で移行する。

■ 環境

  • MongoDB 3.0.7

■ mongoexport

対象のMongoDBのホストに接続可能なマシン上で下記を実行する。

$ mongoexport --host [mongo_host] --db [db] --collection [collection] --out [output.json]
  • host: db01
  • db: master
  • collection: shop

接続先のMongoDB、対象のDB/コレクションを上記とすると、下記のようなコマンドになる。ちなみに出力はJSON形式なので”[collection].json“としている。

$ mongoexport --host db01 --db master --collection shop --out shop.json
2015-11-24T19:09:50.215+0900    connected to: db01
2015-11-24T19:09:50.642+0900    exported 10408 records
$

■ mongoimport

`mongoexport`で出力したJSONファイルをインポートする。

$ mongoimport --host [mongo_host] --db [db] --collection [collection] --file [input.json]
  • host: db02
  • db: master
  • collection: shop

上記とるすると、下記のようなコマンドとなる。

$ mongoimport --host db02 --db master --collection shop --file shop.json
2015-11-24T19:12:24.439+0900    connected to: tf0054_mongo
2015-11-24T19:12:24.801+0900    imported 10408 documents
$

データを確認する。

$ mongo --host db02 master
MongoDB shell version: 3.0.8
connecting to: db02:27017/master
>
> show collections
shop
system.indexes
>
> db.shop.count()
10408
>

以上。

■ 関連

MacにMongoDBをインストール

表題の通り。

■ 環境

  • MongoDB 3.0.7
  • Mac OSX (10.10.5)
  • Homebrew

■ インストール

いつも通りにインストール。

$ brew update
$ brew install mongodb

■ サーバプロセスの起動

とりあえずインストール時に表示されている手段で起動する。`brew info mongodb`でも同じ表記が取得できる。

$ mongod --config /usr/local/etc/mongod.conf

デーモン起動ではないようなので別ターミナルから接続する。

$ mongo
MongoDB shell version: 3.0.7
connecting to: test
> show dbs
2015-11-20T19:17:13.825+0900 E QUERY    Error: listDatabases failed:{
    "ok" : 0,
    "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
    "code" : 13
}
    at Error ()
    at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)
    at shellHelper.show (src/mongo/shell/utils.js:630:33)
    at shellHelper (src/mongo/shell/utils.js:524:36)
    at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47
>

認証が掛かっているようである。設定を確認。

$ cat /usr/local/etc/mongod.conf
# Store data in /usr/local/var/mongodb instead of the default /data/db
dbpath = /usr/local/var/mongodb

# Append logs to /usr/local/var/log/mongodb/mongo.log
logpath = /usr/local/var/log/mongodb/mongo.log
logappend = true

# Only accept local connections
bind_ip = 127.0.0.1

httpinterface=true
rest=true
auth=true
$

最終行に`auth=true`がある。これが原因のようである。ローカルのテスト環境なので認証を外す。また、デーモン起動できるように下記のように編集した。

  • fork = true
  • auth = false

これで起動する。

$ mongod --config /usr/local/etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 87692
child process started successfully, parent exiting
$

デーモン起動されたので同じターミナルから再度接続。

$ mongo
MongoDB shell version: 3.0.7
connecting to: test
> show dbs
local  0.078GB
>

接続が確認できた。

以上。

■ 関連