SlideShare ist ein Scribd-Unternehmen logo
1 von 33
MongoDB GridFS についてもろもろ @camelmasa
・自己紹介 ・今回何故 GridFS を調べたのか? ・ GridFS って何なのか? - ドライバー群 ・環境構築について - 検証環境 ・ ReplicaSet,Sharding での挙動 ・ mongofiles コマンド ・躓いた部分 ・もっと GridFS ! ・全体通したまとめ アジェンダ
・ @camelmasa( 道産子の 86 世代 ) ・ 旭川高専 ・ Livlis (kamado, inc.) ・元バリスタ (paul bassett etc.) 自己紹介
・ Livlis へのフィードバック ・ Lithium + MongoDB の新サービス ( 画像を沢山ストレージする系サービス ) 何故 GridFS を調べたのか?
MongoDB に巨大なファイルを格納するための仕様です。 MongoDB は、バイナリデータの格納を  BSON  でサポートしています。 しかし、  MongoDB で、 BSON オブジェクトは 4MB のサイズに制限されているが… GridFS って何なのか?
この GridFS の仕様は、大きいファイルを複数のドキュメントに透過的に分割する方法を提供します。 http://www.mongodb.org/display/DOCSJP/GridFS GridFS って何なのか?
ドライバー群 PHP, Java, Python, Ruby, Perl,earlang(github) GridFS って何なのか?
検証環境 ・ Amazon EC2 micro Instance Basic 64-bit Amazon Linux AMI 2011.02.1 Beta (1 core CPU, 613MB) 検証だけなら Large とかにすれば良かった…。 環境構築について
検証環境 ReplicaSet ReplicaSet Sharding1 Sharding2 環境構築について
Config の設定方法 通常の設定方法と変わらない! [/mongo/mongo-config.conf] configsvr=true dbpath=/mongo/db/config logpath=/mongo/log/config/mongo.log logappend=true fork=true [ 起動 ]mongod -f /mongo/mongo-config.conf 環境構築について
Mongos の設定方法 通常の設定方法と変わらない! [/mongo/mongos.conf] logpath=/mongo/log/mongos/mongos.log configdb=localhost:27019 port=27021 fork=true [ 起動 ]mongos -f /mongo/mongos.conf 環境構築について
ReplicaSet の設定方法 通常の設定方法と変わらない! [/mongo/mongo-s1r1.conf] dbpath=/mongo/db/s1_r1 port=28201 logpath=/mongo/log/s1_r1.log logappend=true rest=true replSet=s1 journal=true fork=true [ 起動 ]mongo -f /mongo/mongo-s1r1.conf 環境構築について
ReplicaSet の設定方法 通常の設定方法と変わらない! [ コマンド ] config = {_id: 's1', members: [{_id: 0, host: 'localhost:28201'},{_id: 1, host: 'localhost:28202'},{_id: 2, host: 'localhost:28203'}]} rs.initiate(config);  環境構築について
Sharding の設定方法 通常の設定方法と変わらない! [/mongo/mongo-s1r1.conf] dbpath=/mongo/db/s1_r1 port=28201 logpath=/mongo/log/s1_r1.log logappend=true rest=true replSet=s1 journal=true fork=true [ 起動 ]mongo -f /mongo/mongo-s1r1.conf 環境構築について
Sharding の設定方法 通常の設定方法と変わらない! [ コマンド ] db.runCommand( { enablesharding : "test" }); db.fs.chunks.ensureIndex({'files_id':1}); db.runCommand( { shardcollection : "test.fs.chunks", key : { files_id : 1 } } )  環境構築について
ReplicaSet の挙動 [mongos]mongofiles --host localhost:27021 put replica.set  connected to: localhost:27021 added file: { _id: ObjectId('4e3368d3c629125977fed2b7'), filename: "replica.set", chunkSize: 262144, uploadDate: new Date(1311992019116), md5: "d41d8cd98f00b204e9800998ecf8427e", length: 0 } Done! ReplicaSet,Sharding での挙動
ReplicaSet の挙動 [mongos] > db.fs.files.find({'filename':'replica.set'}) { "_id" : ObjectId("4e3368d3c629125977fed2b7"), "filename" : "replica.set", "chunkSize" : 262144, "uploadDate" : ISODate("2011-07-30T02:13:39.116Z"), "md5" : "d41d8cd98f00b204e9800998ecf8427e", "length" : 0 } [sharding1 の master] > db.fs.files.find({'filename':'replica.set'}) { "_id" : ObjectId("4e3368d3c629125977fed2b7"), "filename" : "replica.set", "chunkSize" : 262144, "uploadDate" : ISODate("2011-07-30T02:13:39.116Z"), "md5" : "d41d8cd98f00b204e9800998ecf8427e", "length" : 0 } [sharding1 の slave1] > db.fs.files.find({'filename':'replica.set'}) { "_id" : ObjectId("4e3368d3c629125977fed2b7"), "filename" : "replica.set", "chunkSize" : 262144, "uploadDate" : ISODate("2011-07-30T02:13:39.116Z"), "md5" : "d41d8cd98f00b204e9800998ecf8427e", "length" : 0 } [sharding1 の slave2] > db.fs.files.find({'filename':'replica.set'}) { "_id" : ObjectId("4e3368d3c629125977fed2b7"), "filename" : "replica.set", "chunkSize" : 262144, "uploadDate" : ISODate("2011-07-30T02:13:39.116Z"), "md5" : "d41d8cd98f00b204e9800998ecf8427e", "length" : 0 } ReplicaSet,Sharding での挙動
ReplicaSet の挙動 [sharding2 の master] > db.fs.files.find({'filename':'replica.set'}) [sharding2 の slave1] > db.fs.files.find({'filename':'replica.set'}) [sharding2 の slave2] > db.fs.files.find({'filename':'replica.set'}) ReplicaSet,Sharding での挙動
Sharding の挙動 > db.printShardingStatus()  --- Sharding Status ---  sharding version: { "_id" : 1, "version" : 3 } shards: { "_id" : "s1", "host" : "s1/localhost:28201,localhost:28202,localhost:28203" } { "_id" : "s2", "host" : "s2/localhost:28204,localhost:28205,localhost:28206" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "s2" } test.fs.chunks chunks: s1  10 s2  10 too many chunksn to print, use verbose if you want to force print { "_id" : "fs", "partitioned" : false, "primary" : "s2" } ReplicaSet,Sharding での挙動
Sharding の挙動 > db.printShardingStatus()  --- Sharding Status ---  sharding version: { "_id" : 1, "version" : 3 } shards: { "_id" : "s1", "host" : "s1/localhost:28201,localhost:28202,localhost:28203" } { "_id" : "s2", "host" : "s2/localhost:28204,localhost:28205,localhost:28206" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "s2" } test.fs.chunks chunks: s1  10 s2  10 too many chunksn to print, use verbose if you want to force print { "_id" : "fs", "partitioned" : false, "primary" : "s2" } ReplicaSet,Sharding での挙動
[PUT]… ファイルの新規登録 mongofiles --host localhost:27021 put a.txt  connected to: localhost:27021 added file: { _id: ObjectId('4e3349480eed7346d277d523'), filename: "a.txt", chunkSize: 262144, uploadDate: new Date(1311983944316), md5: "d41d8cd98f00b204e9800998ecf8427e", length: 0 } Done! ※ 同じファイル名で登録すると削除時に一緒に削除される mongofiles コマンド
[PUT]… ファイルの上書き登録 mongofiles --host localhost:27021  -r  put a.txt  connected to: localhost:27021 added file: { _id: ObjectId('4e3349480eed7346d277d523'), filename: "a.txt", chunkSize: 262144, uploadDate: new Date(1311983944316), md5: "d41d8cd98f00b204e9800998ecf8427e", length: 0 } done! mongofiles コマンド
[GET]… ファイルの取得 mongofiles --host localhost:27021 get a.txt  connected to: localhost:27021 done write to: a.txt mongofiles コマンド
[LIST]… ファイルをリスト表示 mongofiles --host localhost:27021 list a.txt  1000 … ( ファイル名 ,byte 数 ) mongofiles コマンド
[SEARCH]… ファイル検索 mongofiles --host localhost:27021 search a.txt connected to: localhost:27021 a.txt  0 mongofiles --host localhost:27021 search txt connected to: localhost:27021 a.txt  0 -> 完全一致じゃなくて良い。 mongofiles コマンド
[DELETE]… ファイルの削除 mongofiles --host localhost:27021 delete a.txt connected to: localhost:27021 Done! ※ 同じファイル名は全て削除されます! mongofiles コマンド
・ ReplicaSet が設定出来ない! EC2 の root device の容量が通常 8GB しかない。 ReplicaSet の設定をすると、 8GB が直ぐ埋まります。 ファイルを vim で開く度に .swp ファイル作れないという、エラーが出て気づきました。 100GB の Volumes を追加して mount し解決。 ->100G 中 48G 程埋まる。 今回の躓いた所
・ Sharding されない! 完全に僕の勘違いでした。 sharding1,sharding2 を使って検証していたのですが、ファイルを追加しても sharding2 に偏って保存されてしまっていました。 しかし、これでもかと言う程ファイルを追加したら、 sharding された。 今回の躓いた所
ReplicaSet の挙動の確認の際、 mongofies の挙動が微妙。 ・ mongofiles –host [master server] search test.txt -> ファイルが表示される。 ・ mongofiles –host [slave server] search test.txt -> ファイルが表示されない、エラーも出ない。 しかし、 db.test.fs.files.find({'filename':'test.txt'}) のコマンドは master,slave にもあるのは確認出来る。 (db.getMongo().setSlaveOk() 実行済み ) 今回の躓いた所
・ nginx-gridfs nginx の拡張モジュール。 スクリプトを介さず、 web サーバーから gridfs のファイルのレスポンスを返す。 [github] https://github.com/mdirolf/nginx-gridfs [ 参考 ] http://mybikejp.blogspot.com/2011/01/nginxgridfs.html もっと GridFS!
・ rack-gridfs 先程の nginx-gridfs の rack 版 。 [github] https://github.com/skinandbones/rack-gridfs もっと GridFS!
GridFS を用いるのに特別な設定・使用方法等は必要無し。 通常の ReplicaSet,Sharding 設定・使用方法と変わらない! (GridFS はあくまで仕様である為、当たり前と言われれば当たり前。 ) 気軽に分散ファイルシステムが出来ると考えると嬉しいですね。 ( 運用時に潜む罠は除く ) スクリプトからの実行では無く、 web サーバーとの連携の事例が出てくるのは面白いと思います。 全体を通したまとめ
ご清聴有り難うございました。

Weitere ähnliche Inhalte

Was ist angesagt?

ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門	ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門 Atsu Yamaga
 
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall博文 斉藤
 
Itamae-Serverspec入門
Itamae-Serverspec入門Itamae-Serverspec入門
Itamae-Serverspec入門辰徳 斎藤
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)Iwana Chan
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)Iwana Chan
 
社内勉強会02 シリアライズ[公開用]
社内勉強会02 シリアライズ[公開用]社内勉強会02 シリアライズ[公開用]
社内勉強会02 シリアライズ[公開用]Keme Sato
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Jun Ohtani
 
中小規模サービスのApacheチューニング
中小規模サービスのApacheチューニング中小規模サービスのApacheチューニング
中小規模サービスのApacheチューニング勲 國府田
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方Iwana Chan
 
OpenIndiana vWire Demo (Japanese)
OpenIndiana vWire Demo (Japanese)OpenIndiana vWire Demo (Japanese)
OpenIndiana vWire Demo (Japanese)Shoji Haraguchi
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
Serverspecの活用tips紹介
Serverspecの活用tips紹介Serverspecの活用tips紹介
Serverspecの活用tips紹介Daisuke Ikeda
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説Shoken Fujisaki
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009Akio Ishida
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
WebサーバのチューニングYu Komiya
 
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTMasahiro Nagano
 
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料Yasutaka Hamada
 

Was ist angesagt? (20)

Gossip事始め
Gossip事始めGossip事始め
Gossip事始め
 
ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門	ノンプログラマのためのウェブサーバ入門
ノンプログラマのためのウェブサーバ入門
 
Redisいれてみた
RedisいれてみたRedisいれてみた
Redisいれてみた
 
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
 
MongoDB2.2の新機能
MongoDB2.2の新機能MongoDB2.2の新機能
MongoDB2.2の新機能
 
Itamae-Serverspec入門
Itamae-Serverspec入門Itamae-Serverspec入門
Itamae-Serverspec入門
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)
 
社内勉強会02 シリアライズ[公開用]
社内勉強会02 シリアライズ[公開用]社内勉強会02 シリアライズ[公開用]
社内勉強会02 シリアライズ[公開用]
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
 
中小規模サービスのApacheチューニング
中小規模サービスのApacheチューニング中小規模サービスのApacheチューニング
中小規模サービスのApacheチューニング
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方
 
OpenIndiana vWire Demo (Japanese)
OpenIndiana vWire Demo (Japanese)OpenIndiana vWire Demo (Japanese)
OpenIndiana vWire Demo (Japanese)
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
Serverspecの活用tips紹介
Serverspecの活用tips紹介Serverspecの活用tips紹介
Serverspecの活用tips紹介
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
Webサーバのチューニング
 
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
 
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
2014/11/04 第2回 一撃サーバー構築シェルスクリプト勉強会(さっぽろ!) 発表資料
 

Ähnlich wie Mongo dbのgridfsについて

シラサギハンズオン 東京
シラサギハンズオン 東京シラサギハンズオン 東京
シラサギハンズオン 東京Yu Ito
 
シラサギハンズオン 大阪
シラサギハンズオン 大阪シラサギハンズオン 大阪
シラサギハンズオン 大阪Yu Ito
 
シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016Yu Ito
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツールtotty jp
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇Manabu Ori
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-靖 小田島
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistranokumachang_LL
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) Akihiro Kuwano
 
serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例Koichi Shimozono
 
Snowflake on AWSのターゲットエンドポイントとしての利用
Snowflake on AWSのターゲットエンドポイントとしての利用Snowflake on AWSのターゲットエンドポイントとしての利用
Snowflake on AWSのターゲットエンドポイントとしての利用QlikPresalesJapan
 
AWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンAWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンseiichi arai
 
ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~Akihiro Kuwano
 
Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7Sea Mountain
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門Tomoya Kawanishi
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 

Ähnlich wie Mongo dbのgridfsについて (20)

シラサギハンズオン 東京
シラサギハンズオン 東京シラサギハンズオン 東京
シラサギハンズオン 東京
 
シラサギハンズオン 大阪
シラサギハンズオン 大阪シラサギハンズオン 大阪
シラサギハンズオン 大阪
 
Ansible入門
Ansible入門Ansible入門
Ansible入門
 
シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 
web server
web serverweb server
web server
 
Hadoop on LXC
Hadoop on LXCHadoop on LXC
Hadoop on LXC
 
TripleOの光と闇
TripleOの光と闇TripleOの光と闇
TripleOの光と闇
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
Mina 20130417
Mina 20130417Mina 20130417
Mina 20130417
 
serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例
 
Snowflake on AWSのターゲットエンドポイントとしての利用
Snowflake on AWSのターゲットエンドポイントとしての利用Snowflake on AWSのターゲットエンドポイントとしての利用
Snowflake on AWSのターゲットエンドポイントとしての利用
 
AWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンAWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターン
 
ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~
 
Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 

Mongo dbのgridfsについて

  • 2. ・自己紹介 ・今回何故 GridFS を調べたのか? ・ GridFS って何なのか? - ドライバー群 ・環境構築について - 検証環境 ・ ReplicaSet,Sharding での挙動 ・ mongofiles コマンド ・躓いた部分 ・もっと GridFS ! ・全体通したまとめ アジェンダ
  • 3. ・ @camelmasa( 道産子の 86 世代 ) ・ 旭川高専 ・ Livlis (kamado, inc.) ・元バリスタ (paul bassett etc.) 自己紹介
  • 4. ・ Livlis へのフィードバック ・ Lithium + MongoDB の新サービス ( 画像を沢山ストレージする系サービス ) 何故 GridFS を調べたのか?
  • 5. MongoDB に巨大なファイルを格納するための仕様です。 MongoDB は、バイナリデータの格納を BSON でサポートしています。 しかし、 MongoDB で、 BSON オブジェクトは 4MB のサイズに制限されているが… GridFS って何なのか?
  • 7. ドライバー群 PHP, Java, Python, Ruby, Perl,earlang(github) GridFS って何なのか?
  • 8. 検証環境 ・ Amazon EC2 micro Instance Basic 64-bit Amazon Linux AMI 2011.02.1 Beta (1 core CPU, 613MB) 検証だけなら Large とかにすれば良かった…。 環境構築について
  • 9. 検証環境 ReplicaSet ReplicaSet Sharding1 Sharding2 環境構築について
  • 10. Config の設定方法 通常の設定方法と変わらない! [/mongo/mongo-config.conf] configsvr=true dbpath=/mongo/db/config logpath=/mongo/log/config/mongo.log logappend=true fork=true [ 起動 ]mongod -f /mongo/mongo-config.conf 環境構築について
  • 11. Mongos の設定方法 通常の設定方法と変わらない! [/mongo/mongos.conf] logpath=/mongo/log/mongos/mongos.log configdb=localhost:27019 port=27021 fork=true [ 起動 ]mongos -f /mongo/mongos.conf 環境構築について
  • 12. ReplicaSet の設定方法 通常の設定方法と変わらない! [/mongo/mongo-s1r1.conf] dbpath=/mongo/db/s1_r1 port=28201 logpath=/mongo/log/s1_r1.log logappend=true rest=true replSet=s1 journal=true fork=true [ 起動 ]mongo -f /mongo/mongo-s1r1.conf 環境構築について
  • 13. ReplicaSet の設定方法 通常の設定方法と変わらない! [ コマンド ] config = {_id: 's1', members: [{_id: 0, host: 'localhost:28201'},{_id: 1, host: 'localhost:28202'},{_id: 2, host: 'localhost:28203'}]} rs.initiate(config); 環境構築について
  • 14. Sharding の設定方法 通常の設定方法と変わらない! [/mongo/mongo-s1r1.conf] dbpath=/mongo/db/s1_r1 port=28201 logpath=/mongo/log/s1_r1.log logappend=true rest=true replSet=s1 journal=true fork=true [ 起動 ]mongo -f /mongo/mongo-s1r1.conf 環境構築について
  • 15. Sharding の設定方法 通常の設定方法と変わらない! [ コマンド ] db.runCommand( { enablesharding : "test" }); db.fs.chunks.ensureIndex({'files_id':1}); db.runCommand( { shardcollection : "test.fs.chunks", key : { files_id : 1 } } ) 環境構築について
  • 16. ReplicaSet の挙動 [mongos]mongofiles --host localhost:27021 put replica.set connected to: localhost:27021 added file: { _id: ObjectId('4e3368d3c629125977fed2b7'), filename: "replica.set", chunkSize: 262144, uploadDate: new Date(1311992019116), md5: "d41d8cd98f00b204e9800998ecf8427e", length: 0 } Done! ReplicaSet,Sharding での挙動
  • 17. ReplicaSet の挙動 [mongos] > db.fs.files.find({'filename':'replica.set'}) { "_id" : ObjectId("4e3368d3c629125977fed2b7"), "filename" : "replica.set", "chunkSize" : 262144, "uploadDate" : ISODate("2011-07-30T02:13:39.116Z"), "md5" : "d41d8cd98f00b204e9800998ecf8427e", "length" : 0 } [sharding1 の master] > db.fs.files.find({'filename':'replica.set'}) { "_id" : ObjectId("4e3368d3c629125977fed2b7"), "filename" : "replica.set", "chunkSize" : 262144, "uploadDate" : ISODate("2011-07-30T02:13:39.116Z"), "md5" : "d41d8cd98f00b204e9800998ecf8427e", "length" : 0 } [sharding1 の slave1] > db.fs.files.find({'filename':'replica.set'}) { "_id" : ObjectId("4e3368d3c629125977fed2b7"), "filename" : "replica.set", "chunkSize" : 262144, "uploadDate" : ISODate("2011-07-30T02:13:39.116Z"), "md5" : "d41d8cd98f00b204e9800998ecf8427e", "length" : 0 } [sharding1 の slave2] > db.fs.files.find({'filename':'replica.set'}) { "_id" : ObjectId("4e3368d3c629125977fed2b7"), "filename" : "replica.set", "chunkSize" : 262144, "uploadDate" : ISODate("2011-07-30T02:13:39.116Z"), "md5" : "d41d8cd98f00b204e9800998ecf8427e", "length" : 0 } ReplicaSet,Sharding での挙動
  • 18. ReplicaSet の挙動 [sharding2 の master] > db.fs.files.find({'filename':'replica.set'}) [sharding2 の slave1] > db.fs.files.find({'filename':'replica.set'}) [sharding2 の slave2] > db.fs.files.find({'filename':'replica.set'}) ReplicaSet,Sharding での挙動
  • 19. Sharding の挙動 > db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3 } shards: { "_id" : "s1", "host" : "s1/localhost:28201,localhost:28202,localhost:28203" } { "_id" : "s2", "host" : "s2/localhost:28204,localhost:28205,localhost:28206" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "s2" } test.fs.chunks chunks: s1 10 s2 10 too many chunksn to print, use verbose if you want to force print { "_id" : "fs", "partitioned" : false, "primary" : "s2" } ReplicaSet,Sharding での挙動
  • 20. Sharding の挙動 > db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3 } shards: { "_id" : "s1", "host" : "s1/localhost:28201,localhost:28202,localhost:28203" } { "_id" : "s2", "host" : "s2/localhost:28204,localhost:28205,localhost:28206" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "s2" } test.fs.chunks chunks: s1 10 s2 10 too many chunksn to print, use verbose if you want to force print { "_id" : "fs", "partitioned" : false, "primary" : "s2" } ReplicaSet,Sharding での挙動
  • 21. [PUT]… ファイルの新規登録 mongofiles --host localhost:27021 put a.txt connected to: localhost:27021 added file: { _id: ObjectId('4e3349480eed7346d277d523'), filename: "a.txt", chunkSize: 262144, uploadDate: new Date(1311983944316), md5: "d41d8cd98f00b204e9800998ecf8427e", length: 0 } Done! ※ 同じファイル名で登録すると削除時に一緒に削除される mongofiles コマンド
  • 22. [PUT]… ファイルの上書き登録 mongofiles --host localhost:27021 -r put a.txt connected to: localhost:27021 added file: { _id: ObjectId('4e3349480eed7346d277d523'), filename: "a.txt", chunkSize: 262144, uploadDate: new Date(1311983944316), md5: "d41d8cd98f00b204e9800998ecf8427e", length: 0 } done! mongofiles コマンド
  • 23. [GET]… ファイルの取得 mongofiles --host localhost:27021 get a.txt connected to: localhost:27021 done write to: a.txt mongofiles コマンド
  • 24. [LIST]… ファイルをリスト表示 mongofiles --host localhost:27021 list a.txt 1000 … ( ファイル名 ,byte 数 ) mongofiles コマンド
  • 25. [SEARCH]… ファイル検索 mongofiles --host localhost:27021 search a.txt connected to: localhost:27021 a.txt 0 mongofiles --host localhost:27021 search txt connected to: localhost:27021 a.txt 0 -> 完全一致じゃなくて良い。 mongofiles コマンド
  • 26. [DELETE]… ファイルの削除 mongofiles --host localhost:27021 delete a.txt connected to: localhost:27021 Done! ※ 同じファイル名は全て削除されます! mongofiles コマンド
  • 27. ・ ReplicaSet が設定出来ない! EC2 の root device の容量が通常 8GB しかない。 ReplicaSet の設定をすると、 8GB が直ぐ埋まります。 ファイルを vim で開く度に .swp ファイル作れないという、エラーが出て気づきました。 100GB の Volumes を追加して mount し解決。 ->100G 中 48G 程埋まる。 今回の躓いた所
  • 28. ・ Sharding されない! 完全に僕の勘違いでした。 sharding1,sharding2 を使って検証していたのですが、ファイルを追加しても sharding2 に偏って保存されてしまっていました。 しかし、これでもかと言う程ファイルを追加したら、 sharding された。 今回の躓いた所
  • 29. ReplicaSet の挙動の確認の際、 mongofies の挙動が微妙。 ・ mongofiles –host [master server] search test.txt -> ファイルが表示される。 ・ mongofiles –host [slave server] search test.txt -> ファイルが表示されない、エラーも出ない。 しかし、 db.test.fs.files.find({'filename':'test.txt'}) のコマンドは master,slave にもあるのは確認出来る。 (db.getMongo().setSlaveOk() 実行済み ) 今回の躓いた所
  • 30. ・ nginx-gridfs nginx の拡張モジュール。 スクリプトを介さず、 web サーバーから gridfs のファイルのレスポンスを返す。 [github] https://github.com/mdirolf/nginx-gridfs [ 参考 ] http://mybikejp.blogspot.com/2011/01/nginxgridfs.html もっと GridFS!
  • 31. ・ rack-gridfs 先程の nginx-gridfs の rack 版 。 [github] https://github.com/skinandbones/rack-gridfs もっと GridFS!
  • 32. GridFS を用いるのに特別な設定・使用方法等は必要無し。 通常の ReplicaSet,Sharding 設定・使用方法と変わらない! (GridFS はあくまで仕様である為、当たり前と言われれば当たり前。 ) 気軽に分散ファイルシステムが出来ると考えると嬉しいですね。 ( 運用時に潜む罠は除く ) スクリプトからの実行では無く、 web サーバーとの連携の事例が出てくるのは面白いと思います。 全体を通したまとめ