FrontPage

tips

localhostだけbindする

mongod.confに次のエントリを追加。

bind_ip = 127.0.0.1

kernel settings

  • 32bitは制限があるので64bitを強く推奨
  • ファイルシステムのatimeオプションは切る
  • ファイルディスクリプタは4000以上(ulimitで確認してね)
  • EXT4 / XFS

Debianでの例。

mkfs.xfs /dev/hogehoge
mount -o defaults,noatime /dev/hogehoge /path
vi /etc/security/limits.conf
mongodb soft nofile 8192
mongodb hard nofile 10240
vi /etc/default/mongodb
ulimit -n 8192

ReplicaSets?

  • v1.6ではnot production quality -> http://www.mongodb.org/display/DOCS/Replica+Set+Tutorial
  • mongosのようなクエリルータは不要
  • レプリカは3台以上がオススメ
    • 2台だとsplit brain予防のためフェイルオーバーしない
    • 2台でやるならarbiterが必要
  • 負荷分散やフェイルオーバはドライバ依存(pymongo 1.8以降で対応)

レプリカセット

構築

configにreplSet = hogeを書くか、デーモン起動時に--replSet hogeって書く。

replSet = mybike

コンフィグ定義。

cfg = { 
	_id : "mybike", 
	members : [ 
		{ _id : 0, host : "xxx.xxx.xxx.xxx" }, 
		{ _id : 1, host : "yyy.yyy.yyy.yyy" },
		{ _id : 2, host : "zzz.zzz.zzz.zzz" },
	]
}

コンフィグ投入。

rs.initiate(cfg) 

ステータス確認。

rs.status() 
{
	"set" : "mybike",
	"date" : "Sun Feb 13 2011 01:57:40 GMT+0900 (JST)",
	"myState" : 1,
	"members" : [
		{
			"_id" : 0,
			"name" : "xxx.xxx.xxx.xxx:27017",
			"health" : 1,
			"state" : 1,
			"self" : true
		},
		{
			"_id" : 1,
			"name" : "yyy.yyy.yyy.yyy",
			"health" : 1,
			"state" : 2,
			"uptime" : 1082,
			"lastHeartbeat" : "Sun Feb 13 2011 01:57:39 GMT+0900 (JST)"
		}
	],
	"ok" : 1
}

normal operation

バックアップ

BSONでダンプ。

mongodump -d database_name -u username -p password

JSONでエクスポート。

mongoexport -d database_name -u username -p password -o dump.json

リストア

データを削除してBSONを取り込む。

mongorestore -d database_name -u username -p password --drop backup.bson

JSONをインポート。

mongoimport -d database_name -u username -p password -upsert dump.json

upsertの部分は、upsert or dropが指定できる。後者だとデータベースを落としてから取り込み。

データベース削除

mongo
> use mongotest
> db.dropDatabase()

コレクション削除

mongo
> use mongotest
> db.collection_name.drop()

インデックス作成

mongo
> use mongotest
> db.collection_name.ensureIndex({'id': 1})

コレクションのインデックスを見る

db.collection_name.getIndexes()
[
	{
		"name" : "_id_",
		"ns" : "mybike-local.activity_record",
		"key" : {
			"_id" : 1
		},
		"v" : 0
	},
	{
		"_id" : ObjectId("4f1af239c60242acd9f21c17"),
		"ns" : "mybike-local.activity_record",
		"key" : {
			"records.timestamp" : 1
		},
		"name" : "records.timestamp_1",
		"v" : 0
	},
	{
		"_id" : ObjectId("4f1af242c60242acd9f21c18"),
		"ns" : "mybike-local.activity_record",
		"key" : {
			"records.location" : "2d"
		},
		"name" : "records.location_"
	}
]

slaveから参照

slaveから参照するにはsetSlaveOk?()を呼び出す必要がある。

mongo
> db.getMongo().setSlaveOk()
> db.collection_name.find()

検索対象の値を変更して比較

created_atをepochにして比較したりとか。インデックス効かないので遅いと思います。

dt = datetime(2012, 5, 12, 11, 22, 33)
condition['$where'] = "Math.round(this.created_at.getTime() / 1000) > %s" % dt.strftime("%s")

Document.objects(__raw__=condition)

mongo

GridFSのファイル一覧

$ mongo
> db.fs.files.find()
{ "_closed" : true, "_id" : ObjectId("4d23b66d6a1b275360000000"), "chunkSize" : 262144, "filename" : "bike_picture/5/1294186085/origin/evolution.jpg", "length" : 65619, "md5" : "0e3d09f4ac28941ce56f9f0f6dc3f2ea", "uploadDate" : "Wed Jan 05 2011 09:08:13 GMT+0900 (JST)" }
{ "_closed" : true, "_id" : ObjectId("4d23b6866a1b275360000002"), "chunkSize" : 262144, "filename" : "bike_picture/5/1294186118/origin/evolution.jpg", "length" : 65619, "md5" : "0e3d09f4ac28941ce56f9f0f6dc3f2ea", "uploadDate" : "Wed Jan 05 2011 09:08:38 GMT+0900 (JST)" }

GridFSのファイル削除

$ mongo
> db.fs.files.remove({})

容量の確認

注:重いです。

> db.fs.chunks.validate()
{
	"ns" : "mybike.fs.chunks",
	"result" : "\nvalidate\n  firstExtent:0:88000 ns:mybike.fs.chunks\n  lastExtent:3:49f8f00 ns:mybike.fs.chunks\n  # extents:18\n  datasize?:512783524 nrecords?:3871 lastExtentSize:93068800\n  padding:1\n  first extent:\n    loc:0:88000 xnext:0:490500 xprev:null\n    nsdiag:mybike.fs.chunks\n    size:4195584 firstRecord:0:880b0 lastRecord:0:488028\n  3871 objects found, nobj:3871\n  512845460 bytes data w/headers\n  512783524 bytes data wout/headers\n  deletedList: 0001111000000000001\n  deleted: n: 7 size: 24599308\n  nIndexes:2\n     mybike.fs.chunks.$_id_ keys:3871\n    mybike.fs.chunks.$files_id_1_n_1 keys:3871\n",
	"ok" : 1,
	"valid" : true,
	"lastExtentSize" : 93068800
}

pre allocationなのでけっこう容量食ってますね。

http://www.mongodb.org/pages/viewpage.action?pageId=17596968

Insert

db.collection_name.operation(object)というかんじ。

以下、マニュアルにあるやつですが、postsコレクションにdocオブジェクトをINSERTする例。

doc = { author : 'joe', created : new Date('03/28/2009') }
db.posts.insert(doc)

query

空間処理

2dというインデックスを張ると2次元空間処理が出来る。1.8から球体もサポートしている。

doc = {
  'name': '渋谷駅',
  'location': [139.701334, 35.658517] // longitude, latitudeの順。GeoJSONと同じ並び (http://geojson.org/)
}
db.locations.insert(doc)
db.locations.ensureIndex({'location':'2d'})

ある地点を中心に、半径1kmの円の中のドキュメントを得る。

// 地球の半径
earthRadius = 6371
// 距離
distance = 1

// 緯度経度(マークシティ)
longitude = 139.698196
latitude = 35.658123

results = db.locations.find({
  'location': {
    "$within": {
      "$centerSphere": [[longitude, latitude], distance / earthRadius]
    }
  }
})

GridFS

mongofiles

ファイルの一覧取得

mongofiles -d mybike-local list

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-07-10 (火) 02:00:01 (1901d)