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"
    }
})

以上。

■ 関連

MacでLISTENポートを調べる

表題の通り。

■ 環境

  • Mac OSX (10.10.5)

■ やりたいこと

Linuxでいうところの下記のようなことをしたい。

$ ss -nlt

Macで同じようなことがやりたい。

■ lsof

`lsof`を使えばある程度できる。

$ lsof -n -P | grep LISTEN

`grep`が面倒なのでもうちょっと`lsof`で頑張ると下記のようにも書ける。

$ lsof -n -P -iTCP -sTCP:LISTEN

どちらにしてもLinuxに慣れているとオプションの違い等もあり、少々面倒ではある。

以上。

Macにetcdをインストール

表題の通り。分散KVSとしてのetcdがどんなものか少し触ってみたかったのでMacに入れてみる。

■ 環境

  • etcd
  • Mac OSX (10.10.5)
  • Homebrew

■ インストール

`brew`でインストールする。

$ brew update
$ brew install etcd

■ 確認

いろいろ確認してみる。

$ brew list etcd
/usr/local/Cellar/etcd/2.2.1/bin/etcd
/usr/local/Cellar/etcd/2.2.1/bin/etcdctl
/usr/local/Cellar/etcd/2.2.1/homebrew.mxcl.etcd.plist
$
$ etcd --version
etcd Version: 2.2.1
Git SHA: GitNotFound
Go Version: go1.5.1
Go OS/Arch: darwin/amd64
$

起動してみる。

$ etcd
2015-11-26 19:16:38.215734 I | etcdmain: etcd Version: 2.2.1
2015-11-26 19:16:38.217944 I | etcdmain: Git SHA: GitNotFound
2015-11-26 19:16:38.217958 I | etcdmain: Go Version: go1.5.1
2015-11-26 19:16:38.217967 I | etcdmain: Go OS/Arch: darwin/amd64
  :
2015-11-26 19:16:38.229565 I | etcdserver: starting server... [version: 2.2.1, cluster version: to_be_decided]
  :

別のターミナルから`etcdctl`を確認してみる。

$ etcdctl -h

etcdクラスタの情報も確認できそうなので取得してみる。

$ etcdctl member list
ce2a822cea30bfca: name=default peerURLs=http://localhost:2380,http://localhost:7001 clientURLs=http://localhost:2379,http://localhost:4001
$

4つのポートをLISTENしているようである。これも確認してみる。

$ sudo lsof -i -P | grep LISTEN
  :
etcd  15723  withsin  3u  IPv4 0x24eb4cb24a505bb9  0t0  TCP localhost:2380 (LISTEN)
etcd  15723  withsin  5u  IPv4 0x24eb4cb24e2edfa9  0t0  TCP localhost:7001 (LISTEN)
etcd  15723  withsin  6u  IPv4 0x24eb4cb24e2ed6d9  0t0  TCP localhost:2379 (LISTEN)
etcd  15723  withsin  7u  IPv4 0x24eb4cb24e32e879  0t0  TCP localhost:4001 (LISTEN)
  :
$

Key/Valueを入れてみる。

$ etcdctl mk /test test
test
$
$ etcdctl ls
/test
$
$ etcdctl get /test
test
$

ZooKeeperとの違いをこれから試していきたい。

以上。

MacにElasticsearchをインストール

表題の通り。

■ 環境

  • Elasticsearch
  • Mac OSX (10.10.5)
  • Homebrew

■ インストール

いつも通り`brew`でインストールする。

$ brew update
$ brew install elasticsearch

■ 起動

軽く動作確認する。

$ elasticsearch -d
$
$ jps
9494 Elasticsearch
9501 Jps
$

起動できたようである。

`curl`コマンドで確認。

$ curl 'localhost:9200/_cat/nodes?v'
host      ip        heap.percent ram.percent load node.role master name
127.0.0.1 127.0.0.1            2         100 1.90 d         *      Amatsu-Mikaboshi
$

稼働はしているようだ。

以上。

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
>

以上。

■ 関連