提 供LOCAL PHP部<br />
PHPとMongoDBで学ぶ次世代データストア<br />佐藤琢哉<br />LOCAL PHP部<br />
自己紹介<br />佐藤琢哉 aka nazo<br />旭川出身 東京在住<br />株式会社RYUS所属(http://ryus.co.jp)<br />3月末まで<br />LOCAL PHP部<br />Hatena : nazone<...
突然ですが<br />
4月から札幌市民になります!!!!!<br />
友達が少ないので皆さん遊んでやってください<br />
アジェンダ<br />MongoDBって何?<br />使い方<br />他のDBMSとの比較<br />MapReduce<br />まとめ<br />
そもそも何の話?<br />
MongoDBすごいよ!<br />
MongoDBって何?<br />
http://www.mongodb.org/<br />
MongoDB (from "humongous") is a scalable, high-performance, open source, schema-free, document-oriented database.<br />
ドキュメント指向データベース<br />スキーマがない<br />データ定義自体が各ドキュメントに入っている<br />
RDBMS<br />行と列に<br />データを<br />当てはめていくのが<br />RDBMS<br />
ドキュメントの集合<br />ドキュメント指向<br />ID:1<br />名前:hokkai<br />性別:男<br />ID:3<br />名前:reath<br />ID:2<br />名前:onodes<br />電話番号:xxx-...
AGPLライセンス<br />Webからのみアクセスするものでもソースコードを公開しないといけないGPL<br />普通のGPLは、Webサイトとして使う分にはプログラムを配布するわけじゃないからソースコード公開する必要がないが、それが気にくわ...
AGPLライセンス<br />MongoDB自体をカスタマイズするなら例えWebサイト内部だけで使ってても公開要求に応じないと駄目よー<br />各言語からアクセスするドライバはApache Licenseだから大丈夫よー<br />社内からし...
特長<br />
データをBSONで保存<br />BSON is a binary-encoded serialization of JSON-like documents<br />{ hoge: "fuga", foo: [bar, baz] }<br /...
JavaScript処理系内蔵<br />MongoDB単体でJavaScriptでデータを操作することが可能<br />JSONで記録されたデータをそのまま処理できる<br />ストアドプロシージャ的な使い方<br />MapReduce<b...
スケーラブル<br />MapReduce搭載<br />Master-Slave構成<br />ペアDB<br />Master-Master構成(制限あり)<br />Sharding<br />
なんでMongoDBなの?<br />
日本だとCouchDBのほうが情報が圧倒的に多いのになんでMongoDBとかマイナーそうなのを…<br />
提 供LOCAL PHP部<br />
http://php.net/mongo<br />
そりゃMongoDBしかない!<br />
ちなみに世界的には<br />青:CouchDB<br />赤:MongoDB<br />
使い方[インストール]<br />
インストール<br />いろんなプラットフォームのバイナリが配布されているので好きなのを入れる。<br />
インストール<br />データフォルダをデフォルトで/data/dbに作るので、面倒であればフォルダを作っておく<br />起動時の設定でもちろん変更可能<br />
インストール<br />mongodを実行するだけで起動<br />面倒な人はinitスクリプト<br />init.d for MongoDB<br />http://gist.github.com/232227<br />
インストール<br />pecl install mongo<br />あとphp.iniにextension=mongo.soと書くだけ<br />PHPer歓喜<br />
使い方[PHPコード]<br />
接続<br />$mongo = new Mongo();<br />$mongo = new Mongo("example.com:65432");<br />
データベースとコレクションの取得<br />$db = $mongo->selectDB( "dbname" );<br />$col = $db->selectCollection( "collectionname" );<br />
データベースとコレクション<br />
INSERT<br />$doc = array( "name" => "MongoDB",<br />   "type" => "database",<br />   "count" => 1,<br />   "info" => (obje...
INSERT<br />PHPの配列がそのままデータとして入る<br />複雑な階層でももちろんそのまま入る<br />1コレクション内の構造が統一されていなくてもいい(ただしインデックスを張る場合はその項目は必須)<br />
INSERT<br />$doc = array( "name" => "Apple",<br />   "color" => "Red",<br />);<br />$col->insert( $doc );<br />$doc = arra...
SELECT<br />1件取得<br />$obj = $col->findOne();<br />条件指定取得<br />$obj = $col->findOne(array("name"=>"MongoDB"));<br />全件取得<b...
SELECT<br />$cursor = $col->find(array('num' => array('$gt' => 1)));<br />$cursor = $col->find(array('name' => new MongoRe...
Update<br />$obj = $col->findOne(array("name"=>"MongoDB"));<br />$obj["value"] = 2;<br />$col->save($obj);<br />
Delete<br />$col->remove(array("name" => "MongoDB"));<br />$obj = $col->findOne();<br />$col->remove($obj);<br />$col->dro...
Count<br />$col->count();<br />$col->count(array('x'=>1));<br />
Index作成<br />$col->ensureIndex( array( "name" => 1 ) );<br />$col->ensureIndex( array( "name" => 1 , "count" => -1 ) );<br...
MapReduceとは?<br />大量のサーバ上で分散処理をするために考案された手法<br />Key-Valueの組み合わせを単純な方法で分散して再計算することによって、複雑な計算に対応する<br />MapフェーズとReduceフェーズの...
MapReduceとは?<br />Map<br />ある大量のデータを、一連のKey-Valueの形式にして、システムに渡す<br />システム<br />Mapで渡されたデータを、同一のKeyで束ねる<br />Reduce<br />シス...
例:ユーザーごとの買い物金額の合計<br />MapReduceを使う必要があるかは謎<br />そもそも設計も怪しい<br />
データ例<br />※名前は実在の人物とは一切関係ありません<br />
Map<br />reath=300<br />元データ<br />Map関数<br />hokkai=100<br />元データ<br />onodes=100<br />元データ<br />hokkai=100<br />元データ<br /...
Reduce<br />hokkai=[100,100]<br />hokkai=200<br />Reduce関数<br />onodes=[100,200]<br />onodes=300<br />reath=[100, 300]<br ...
MongoDBでMapReduce<br />MapReduceに与えるMap/Reduce関数をJavaScriptで記述<br />PHPで使う場合はMongoDB-MapReduce-PHPライブラリを使うと少し楽<br />でも処理自体...
基本データ<br />$col->insert( array("user" => "hokkai", "item" => "apple", "price" => 100 ) );<br />$col->insert( array("user" ...
Map<br />$map = <<<MAP<br />function() {<br />   emit(this.user, this.price);<br />}<br />MAP;<br />
Reduce<br />$reduce = <<<REDUCE<br />function(key, values) {<br />var total = 0;<br />    for(vari in values) total += val...
PHP側(insert済みな前提)<br /><?php<br />require_once('./MongoDB-MapReduce-PHP/lib/MongoMapReduce.php');<br />require_once('./Mon...
結果<br />name: hokkai / price: 200<br />name: onodes / price: 300<br />name: reath / price: 400<br />
ほかのデータストアと比較<br />
RDBMSとの違い<br />分散が楽!<br />様々な分散方法を標準搭載<br />MapReduce<br />テーブル定義不要<br />動的に構造を付け足したりできる<br />プログラミング言語の構造に密着<br />JOINはでき...
KVSとの違い<br />KVS=Key-Value Store<br />Memcached、Tokyo Cabinet/Tyrant、Flared、ROMA、BigTable、etc…<br />KVSよりは分散は大変<br />KVSは置...
CouchDBとの違い<br />基本的には同じ<br />まだ比較できるほどの事例が存在しない<br />PHPで使うならMongoDBのほうが楽<br />若干用語とかが違う<br />
高速<br />KVS<br />MongoDB<br />高機能<br />RDBMS<br />
まとめ<br />
実用的にMongoDBをPHPで使うなら<br />Lithium( http://li3.rad-dev.org/)<br />PHP5.3専用フレームワーク<br />MongoDB推奨で設計されている<br />チュートリアルももちろんM...
実際使えるのか?<br />もちろんレンタルサーバの類では不可<br />RDBMSより圧倒的に高速なので、高負荷に耐えれるサービスを作るなら重要<br />トランザクションが重要になるサービスでは使えない<br />テーブル定義とか書かなくて...
日本語の情報が少なくて…<br />概念とかはCouchDB関係で調べれば近いものが出てくる<br />情報がないなら自分たちで発信しよう!<br />CakePHP用datastoreの作者は日本人だし日本語の情報しか存在しないが、公式に掲載...
おわり<br />
PHPとMongoDBで学ぶ次世代データストア
Upcoming SlideShare
Loading in …5
×

PHPとMongoDBで学ぶ次世代データストア

9,599 views

Published on

ドキュメント指向データベースのMongoDBをPHPで扱う方法を説明しながら、RDBやKVSとの違いやメリットを紹介します。
at LOCAL DEVELOPER DAY '10 /Winter

http://labs.nazone.info/

Published in: Technology
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,599
On SlideShare
0
From Embeds
0
Number of Embeds
58
Actions
Shares
0
Downloads
40
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide

PHPとMongoDBで学ぶ次世代データストア

  1. 1. 提 供LOCAL PHP部<br />
  2. 2. PHPとMongoDBで学ぶ次世代データストア<br />佐藤琢哉<br />LOCAL PHP部<br />
  3. 3. 自己紹介<br />佐藤琢哉 aka nazo<br />旭川出身 東京在住<br />株式会社RYUS所属(http://ryus.co.jp)<br />3月末まで<br />LOCAL PHP部<br />Hatena : nazone<br />twitter : nazo<br />
  4. 4. 突然ですが<br />
  5. 5. 4月から札幌市民になります!!!!!<br />
  6. 6. 友達が少ないので皆さん遊んでやってください<br />
  7. 7. アジェンダ<br />MongoDBって何?<br />使い方<br />他のDBMSとの比較<br />MapReduce<br />まとめ<br />
  8. 8. そもそも何の話?<br />
  9. 9. MongoDBすごいよ!<br />
  10. 10. MongoDBって何?<br />
  11. 11. http://www.mongodb.org/<br />
  12. 12. MongoDB (from "humongous") is a scalable, high-performance, open source, schema-free, document-oriented database.<br />
  13. 13. ドキュメント指向データベース<br />スキーマがない<br />データ定義自体が各ドキュメントに入っている<br />
  14. 14. RDBMS<br />行と列に<br />データを<br />当てはめていくのが<br />RDBMS<br />
  15. 15. ドキュメントの集合<br />ドキュメント指向<br />ID:1<br />名前:hokkai<br />性別:男<br />ID:3<br />名前:reath<br />ID:2<br />名前:onodes<br />電話番号:xxx-xxx-xxxx<br />ID:4<br />名前:riaf<br />ライブラリ:rhaco<br />※名前は実在の人物とは一切関係ありません<br />
  16. 16. AGPLライセンス<br />Webからのみアクセスするものでもソースコードを公開しないといけないGPL<br />普通のGPLは、Webサイトとして使う分にはプログラムを配布するわけじゃないからソースコード公開する必要がないが、それが気にくわないために作られたライセンス<br />
  17. 17. AGPLライセンス<br />MongoDB自体をカスタマイズするなら例えWebサイト内部だけで使ってても公開要求に応じないと駄目よー<br />各言語からアクセスするドライバはApache Licenseだから大丈夫よー<br />社内からしかアクセスできないような場所で使う分には平気よー<br />
  18. 18. 特長<br />
  19. 19. データをBSONで保存<br />BSON is a binary-encoded serialization of JSON-like documents<br />{ hoge: "fuga", foo: [bar, baz] }<br />構造が自由<br />XMLデータベースがJSONになったような感じ<br />JSONなので操作も簡単<br />ちょっとした構造でJOINとかする必要がない<br />
  20. 20. JavaScript処理系内蔵<br />MongoDB単体でJavaScriptでデータを操作することが可能<br />JSONで記録されたデータをそのまま処理できる<br />ストアドプロシージャ的な使い方<br />MapReduce<br />
  21. 21. スケーラブル<br />MapReduce搭載<br />Master-Slave構成<br />ペアDB<br />Master-Master構成(制限あり)<br />Sharding<br />
  22. 22. なんでMongoDBなの?<br />
  23. 23. 日本だとCouchDBのほうが情報が圧倒的に多いのになんでMongoDBとかマイナーそうなのを…<br />
  24. 24. 提 供LOCAL PHP部<br />
  25. 25. http://php.net/mongo<br />
  26. 26. そりゃMongoDBしかない!<br />
  27. 27. ちなみに世界的には<br />青:CouchDB<br />赤:MongoDB<br />
  28. 28. 使い方[インストール]<br />
  29. 29. インストール<br />いろんなプラットフォームのバイナリが配布されているので好きなのを入れる。<br />
  30. 30. インストール<br />データフォルダをデフォルトで/data/dbに作るので、面倒であればフォルダを作っておく<br />起動時の設定でもちろん変更可能<br />
  31. 31. インストール<br />mongodを実行するだけで起動<br />面倒な人はinitスクリプト<br />init.d for MongoDB<br />http://gist.github.com/232227<br />
  32. 32. インストール<br />pecl install mongo<br />あとphp.iniにextension=mongo.soと書くだけ<br />PHPer歓喜<br />
  33. 33. 使い方[PHPコード]<br />
  34. 34. 接続<br />$mongo = new Mongo();<br />$mongo = new Mongo("example.com:65432");<br />
  35. 35. データベースとコレクションの取得<br />$db = $mongo->selectDB( "dbname" );<br />$col = $db->selectCollection( "collectionname" );<br />
  36. 36. データベースとコレクション<br />
  37. 37. INSERT<br />$doc = array( "name" => "MongoDB",<br /> "type" => "database",<br /> "count" => 1,<br /> "info" => (object)array( "x" => 203,<br /> "y" => 102),<br /> "versions" => array("0.9.7", "0.9.8", "0.9.9")<br />);<br />$col->insert( $doc );<br />
  38. 38. INSERT<br />PHPの配列がそのままデータとして入る<br />複雑な階層でももちろんそのまま入る<br />1コレクション内の構造が統一されていなくてもいい(ただしインデックスを張る場合はその項目は必須)<br />
  39. 39. INSERT<br />$doc = array( "name" => "Apple",<br /> "color" => "Red",<br />);<br />$col->insert( $doc );<br />$doc = array( "name" => "Beer",<br /> "price" => 300,<br />);<br />$col->insert( $doc );<br />
  40. 40. SELECT<br />1件取得<br />$obj = $col->findOne();<br />条件指定取得<br />$obj = $col->findOne(array("name"=>"MongoDB"));<br />全件取得<br />$cursor = $col->find();<br />
  41. 41. SELECT<br />$cursor = $col->find(array('num' => array('$gt' => 1)));<br />$cursor = $col->find(array('name' => new MongoRegex('/ba/i')));<br />$cursor = $col->find(array('$where' => 'this.num > Math.abs(-1)'));<br />
  42. 42. Update<br />$obj = $col->findOne(array("name"=>"MongoDB"));<br />$obj["value"] = 2;<br />$col->save($obj);<br />
  43. 43. Delete<br />$col->remove(array("name" => "MongoDB"));<br />$obj = $col->findOne();<br />$col->remove($obj);<br />$col->drop();<br />$db->drop();<br />
  44. 44. Count<br />$col->count();<br />$col->count(array('x'=>1));<br />
  45. 45. Index作成<br />$col->ensureIndex( array( "name" => 1 ) );<br />$col->ensureIndex( array( "name" => 1 , "count" => -1 ) );<br /><ul><li>Indexに対応するデータは一意であり、全てのドキュメントで必須である必要がある</li></li></ul><li>使い方[MapReduce]<br />
  46. 46. MapReduceとは?<br />大量のサーバ上で分散処理をするために考案された手法<br />Key-Valueの組み合わせを単純な方法で分散して再計算することによって、複雑な計算に対応する<br />MapフェーズとReduceフェーズの処理を与えてあげるだけで、後の処理はシステムが自動的に分散して行ってくれる<br />
  47. 47. MapReduceとは?<br />Map<br />ある大量のデータを、一連のKey-Valueの形式にして、システムに渡す<br />システム<br />Mapで渡されたデータを、同一のKeyで束ねる<br />Reduce<br />システムから渡ってきたデータを加工し、出力する<br />
  48. 48. 例:ユーザーごとの買い物金額の合計<br />MapReduceを使う必要があるかは謎<br />そもそも設計も怪しい<br />
  49. 49. データ例<br />※名前は実在の人物とは一切関係ありません<br />
  50. 50. Map<br />reath=300<br />元データ<br />Map関数<br />hokkai=100<br />元データ<br />onodes=100<br />元データ<br />hokkai=100<br />元データ<br />元データ<br />onodes=200<br />reath=100<br />元データ<br />
  51. 51. Reduce<br />hokkai=[100,100]<br />hokkai=200<br />Reduce関数<br />onodes=[100,200]<br />onodes=300<br />reath=[100, 300]<br />reath=400<br />
  52. 52. MongoDBでMapReduce<br />MapReduceに与えるMap/Reduce関数をJavaScriptで記述<br />PHPで使う場合はMongoDB-MapReduce-PHPライブラリを使うと少し楽<br />でも処理自体は結局JavaScriptで書かないといけない<br />
  53. 53. 基本データ<br />$col->insert( array("user" => "hokkai", "item" => "apple", "price" => 100 ) );<br />$col->insert( array("user" => "hokkai", "item" => "orange", "price" => 100 ) );<br />$col->insert( array("user" => "onodes", "item" => "bread", "price" => 100 ) );<br />$col->insert( array("user" => "onodes", "item" => "beef", "price" => 200 ) );<br />$col->insert( array("user" => "reath", "item" => "book", "price" => 300 ) );<br />$col->insert( array("user" => "reath", "item" => "pen", "price" => 100 ) );<br />
  54. 54. Map<br />$map = <<<MAP<br />function() {<br /> emit(this.user, this.price);<br />}<br />MAP;<br />
  55. 55. Reduce<br />$reduce = <<<REDUCE<br />function(key, values) {<br />var total = 0;<br /> for(vari in values) total += values[i];<br /> return total;<br />}<br />REDUCE;<br />
  56. 56. PHP側(insert済みな前提)<br /><?php<br />require_once('./MongoDB-MapReduce-PHP/lib/MongoMapReduce.php');<br />require_once('./MongoDB-MapReduce-PHP/lib/MongoMapReduceResponse.php');<br />$mongo = new Mongo();<br />$db = $mongo->selectDB( 'mydb' );<br />$col = $db->selectCollection( 'shop' );<br />// $mapと$reduceは省略<br />$map_reduce = new MongoMapReduce($map, $reduce);<br />$response = $map_reduce->invoke($db, "shop");<br />if ($response->valid()) {<br />foreach($response->getResultSet() as $result) {<br /> echo "name: ", $result["_id"] , " / price: ", $result["value"], PHP_ EOL;<br /> }<br />}<br />
  57. 57. 結果<br />name: hokkai / price: 200<br />name: onodes / price: 300<br />name: reath / price: 400<br />
  58. 58. ほかのデータストアと比較<br />
  59. 59. RDBMSとの違い<br />分散が楽!<br />様々な分散方法を標準搭載<br />MapReduce<br />テーブル定義不要<br />動的に構造を付け足したりできる<br />プログラミング言語の構造に密着<br />JOINはできない<br />MapReduceでカバー<br />トランザクションはない<br />銀行のシステムとか作りたいならRDBMSでいいんじゃね?<br />
  60. 60. KVSとの違い<br />KVS=Key-Value Store<br />Memcached、Tokyo Cabinet/Tyrant、Flared、ROMA、BigTable、etc…<br />KVSよりは分散は大変<br />KVSは置くだけで分散できるものが多い<br />KVSよりはデータ構造が存在する<br />KVSは単純にKey-Valueの構造しかない(キーでの検索しかできない)<br />MongoDBは大体RDBMSに近い設計手法で操作ができる<br />
  61. 61. CouchDBとの違い<br />基本的には同じ<br />まだ比較できるほどの事例が存在しない<br />PHPで使うならMongoDBのほうが楽<br />若干用語とかが違う<br />
  62. 62. 高速<br />KVS<br />MongoDB<br />高機能<br />RDBMS<br />
  63. 63. まとめ<br />
  64. 64. 実用的にMongoDBをPHPで使うなら<br />Lithium( http://li3.rad-dev.org/)<br />PHP5.3専用フレームワーク<br />MongoDB推奨で設計されている<br />チュートリアルももちろんMongoDB<br />CakePHP用DataSource<br />http://d.hatena.ne.jp/cakephper/20100122/1264140610<br />単体ライブラリ<br />Mongodloid、Morph<br />
  65. 65. 実際使えるのか?<br />もちろんレンタルサーバの類では不可<br />RDBMSより圧倒的に高速なので、高負荷に耐えれるサービスを作るなら重要<br />トランザクションが重要になるサービスでは使えない<br />テーブル定義とか書かなくていいので、立ち上げ時とか試行錯誤する時とかはものすごく簡単に書ける<br />
  66. 66. 日本語の情報が少なくて…<br />概念とかはCouchDB関係で調べれば近いものが出てくる<br />情報がないなら自分たちで発信しよう!<br />CakePHP用datastoreの作者は日本人だし日本語の情報しか存在しないが、公式に掲載された<br />翻訳も積極的に!<br />
  67. 67. おわり<br />

×