MongoDB, PHP and the cloud - php cloud summit 2011
Upcoming SlideShare
Loading in...5
×
 

MongoDB, PHP and the cloud - php cloud summit 2011

on

  • 11,805 views

An introduction to using MongoDB with PHP. ...

An introduction to using MongoDB with PHP.
Walking through the basics of schema design, connecting to a DB, performing CRUD operations and queries in PHP.
MongoDB runs great in the cloud, but there are some things you should know. In this session we'll explore scaling and performance characteristics of running Mongo in the cloud as well as best practices for running on platforms like Amazon EC2.

Statistics

Views

Total Views
11,805
Views on SlideShare
11,272
Embed Views
533

Actions

Likes
11
Downloads
106
Comments
1

8 Embeds 533

http://spf13.com 480
http://feeds.feedburner.com 32
http://www.newsblur.com 7
http://a0.twimg.com 4
http://localhost 4
http://www.linkedin.com 4
http://paper.li 1
http://translate.googleusercontent.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • Another quality presentation and a must-see for anyone using PHP and not already convinced that they should be using it with mongoDB
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Remember in 1995 there were around 10,000 websites. Mosiac, Lynx, Mozilla (pre netscape) and IE 2.0 were the only web browsers. \nApache (Dec ’95), Java (’96), PHP (June ’95), and .net didn’t exist yet. Linux just barely (1.0 in ’94)\n
  • Remember in 1995 there were around 10,000 websites. Mosiac, Lynx, Mozilla (pre netscape) and IE 2.0 were the only web browsers. \nApache (Dec ’95), Java (’96), PHP (June ’95), and .net didn’t exist yet. Linux just barely (1.0 in ’94)\n
  • Remember in 1995 there were around 10,000 websites. Mosiac, Lynx, Mozilla (pre netscape) and IE 2.0 were the only web browsers. \nApache (Dec ’95), Java (’96), PHP (June ’95), and .net didn’t exist yet. Linux just barely (1.0 in ’94)\n
  • \n
  • \n
  • \n
  • \n
  • By reducing transactional semantics the db provides, one can still solve an interesting set of problems where performance is very important, and horizontal scaling then becomes easier.\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

MongoDB, PHP and the cloud - php cloud summit 2011 MongoDB, PHP and the cloud - php cloud summit 2011 Presentation Transcript

  • MongoDB, PHP & the Cloud
  • My name isSteve Francia @spf13
  • • 15+ years building the internet• Father, husband, skateboarder• Chief Solutions Architect @ 10gen• Author of upcoming O’Reilly publication “MongoDB and PHP”
  • Introduction to MongoDB
  • Why MongoDB?
  • MongoDB Goals• Open source• Designed for today • Today’s hardware / environments • Today’s challenges• Great developer experience• Reliable• Scalable
  • • Company behind MongoDB • AGPL license, own copyrights, engineering team • support, consulting, commercial license revenue• Management • Google/DoubleClick, Oracle, Apple, NetApp • Funding: Sequoia, Union Square, Flybridge • Offices in NYC, Redwood Shores & London • 60+ employees
  • A bit of history
  • 1974The relational database is created
  • 1979
  • 1979 1982-1996
  • 1979 1982-1996 1995
  • Computers in 1995•Pentium 100 mhz•10base T•16 MB ram•200 MB HD
  • Cloud in 1995(Windows 95 cloud wallpaper)
  • Cell Phones in 2011•Dual core 1.5 Ghz•WiFi 802.11n (300+ Mbps)•1 GB ram•64GB Solid State
  • How about a DBdesigned for today?
  • MongoDB philosophy• Keep functionality when we can (key/ value stores are great, but we need more)• Non-relational (no joins) makes scaling horizontally practical• Document data models are good• Database technology should run anywhere VMs, cloud, metal, etc
  • MongoDB is: Application Document Oriented { author: “steve”, High date: new Date(), text: “About MongoDB...”,Performance tags: [“tech”, “database”]} Fully Consistent Horizontally Scalable
  • Under the hood•Written in C++•Runs on nearly anything•Data serialized to BSON•Extensive use of memory-mapped files
  • Database Landscape
  • This has led some to say“MongoDB has the bestfeatures of key/ valuesstores, document databasesand relational databases inone. John Nunemaker
  • Use Cases
  • CMS / BlogNeeds:• Business needed modern data store for rapid development and scaleSolution:• Use PHP & MongoDBResults:• Real time statistics• All data, images, etc stored together, easy access, easy deployment, easy high availability• No need for complex migrations• Enabled very rapid development and growth
  • Photo Meta-DataProblem:• Business needed more flexibility than Oracle could deliverSolution:• Use MongoDB instead of OracleResults:• Developed application in one sprint cycle• 500% cost reduction compared to Oracle• 900% performance improvement compared to Oracle
  • Customer AnalyticsProblem:• Deal with massive data volume across all customer sitesSolution:• Use MongoDB to replace Google Analytics / Omniture optionsResults:• Less than one week to build prototype and prove business case• Rapid deployment of new features
  • Online DictionaryProblem:• MySQL could not scale to handle their 5B+ documentsSolution:• Switched from MySQL to MongoDBResults:• Massive simplification of code base• Eliminated need for external caching system• 20x performance improvement over MySQL
  • E-commerceProblem:• Multi-vertical E-commerce impossible to model (efficiently) in RDBMSSolution:• Switched from MySQL to MongoDBResults:• Massive simplification of code base• Rapidly build, halving time to market (and cost)• Eliminated need for external caching system• 50x+ improvement over MySQL
  • Tons morePretty much if you can use a RDMBS or Key/Value MongoDB is a great fit
  • In Good Company
  • MongoDB in PHP
  • Relational made normalized data look like this
  • Document databases makenormalized data look like this
  • Terminology RDBMS MongoTable, View ➜ CollectionRow ➜ JSON DocumentIndex ➜ IndexJoin ➜ Embedded DocumentPartition ➜ ShardPartition Key ➜ Shard Key
  • Tables to Documents { title: ‘MongoDB’, contributors: [ { name: ‘Eliot Horowitz’, email: ‘eh@10gen.com’ }, { name: ‘Dwight Merriman’, email: ‘dm@10gen.com’ } ], model: { relational: false, awesome: true } }
  • Documents to Arrays{ array( title: ‘MongoDB’, "title" => MongoDB, "contributors" => array( contributors: [ array( { name: ‘Eliot Horowitz’, name => Eliot Horowitz, email: ‘eh@10gen.com’ }, email => eh@10gen.com ), { name: ‘Dwight Merriman’, array( email: ‘dm@10gen.com’ } name => Dwight Merriman, email => dm@10gen.com ], ) model: { ), relational: false, "model" => array( relational => false, awesome: true awesome => true } )} )
  • Documents to Objects{ PostObject Object( title: ‘MongoDB’, [title] => MongoDB [contributors] => Array( contributors: [ [0] => PersonObject Object( { name: ‘Eliot Horowitz’, [name] => Eliot Horowitz email: ‘eh@10gen.com’ }, [email] => eh@10gen.com ) { name: ‘Dwight Merriman’, [1] => PersonObject Object( email: ‘dm@10gen.com’ } [name] => Dwight Merriman [email] => dm@10gen.com ], ) model: { ) relational: false, [model] => ModelObject Object( [relational] => awesome: true [awesome] => 1 } )} )
  • MongoDB speaks PHP
  • This has led Matt to say“The single best interface(API) of any phpextension.   Matthew Weier OPhinney
  • PHP DriverInstalling the driver $ pecl install mongoAdd to php.ini extension = mongo.so
  • Connecting to the DB$connection = new Mongo();$db = $connection->selectDB(blog);$posts = $db->post;If the DB or collection doesn’t exist,mongoDB will create it on connect.
  • DocumentsBlog Post Document$p1 = array("author" => "roger", "date" => new MongoDate(), "text" => "about mongoDB...", "tags" => array(tech, databases) );$posts->save($p1);
  • Queryingprint_r($posts->findOne());Array( [_id] => MongoId Object( [$id] => 4e9796764a18173a17000000 ) [author] => roger [date] => MongoDate Object( [sec] => 1318557302 [usec] => 581000 ) [text] => about mongoDB... [tags] => Array( [0] => tech Note: _id is unique, but can be anything [1] => databasesyou’d like) )
  • Querying> db.posts.findOne()> { _id : ObjectId("4c4ba5c0672c685e5e8aabf3"), author : "roger", date : "Sat Jul 24 2010 19:47:11", text : "About MongoDB...", tags : [ "tech", "databases" ] } Note: _id is unique, but can be anythingyou’d like
  • Inserting Objectsclass PostObj { public $comments = array(); public function __construct($author, $title, $content){ $this->author = $author; $this->title = $title; $this->content = $content; }}$posts->insert(new PostObj("Steve", "My first blog post", "Hello, World!"));
  • MongoIdAn autogenerated primary key$x = array("foo" => 1, "bar" => 2);$db->baz->save($x);var_dump($x[_id]);Result:object(MongoId)#4 (1) { ["$id"]=> string(24) "4e9cc76a4a1817fd21000000"}
  • MongoIdAn autogenerated primary keyobject(MongoId)#4 (1) { ["$id"]=> string(24) "4e9cc76a4a1817fd21000000"} 4e9cc76a4a1817fd21000000 |------||----||--||----| ts mac pid inc
  • Update Operations $set, $unset, $inc, $push, $pushAll, $pull, $pullAll, $bit$change = array($push => array(comments => array( author => Fred, created => new MongoDate(), comment => Best post ever!. ) ) );$posts->update(array("_id" => $id), $change);
  • Nested Documents { _id : ObjectId("4c4ba5c0672c685e5e8aabf3"), author : "roger", date : "Sat Apr 24 2011 19:47:11", text : "About MongoDB...", tags : [ "tech", "databases" ], comments : [ { author : "Fred", date : "Sat Apr 25 2010 20:51:03 GMT-0700", text : "Best Post Ever!" } ]}
  • Nested Documents { _id : ObjectId("4c4ba5c0672c685e5e8aabf3"), author : "roger", date : "Sat Apr 24 2011 19:47:11", text : "About MongoDB...", tags : [ "tech", "databases" ], comments : [ { author : "Fred", date : "Sat Apr 25 2010 20:51:03 GMT-0700", text : "Best Post Ever!" } ]}
  • Nested DocumentsArray( [_id] => MongoId Object ( [$id] => 4e9796764a18173a17000000 ) [author] => roger [comments] => Array( [0] => Array( [author] => Fred [created] => MongoDate Object( [sec] => 1318899392 [usec] => 176000 ) [comment] => Dumb post. ) ) [date] => MongoDate Object( [sec] => 1318557302 [usec] => 581000 ) [tags] => Array( [0] => tech [1] => databases ) [text] => about mongoDB...)
  • Querying$posts = $blog->find(array( "author" => "Roger"));$commentsByFred = $blog->find(array( "comments.author" => "Fred"));$commentsByFred = $blog->find(array( "comments.author" => new MongoRegex("/fred/i")));
  • It’s all about the $ $ instead of >, <, =, etc. $gt, $gte, $lt, $lte, $eq, $neq, $exists, $set, $mod, $where, $in, $nin, $inc $push, $pull, $pop, $pushAll, $popAll$c->find(array("x" => array($gt => 4)));$c->find(array("x" => array(“$gt” => 4)));
  • Adjust the behavior in php.ini or using ini_set()php.ini---------------mongo.cmd = ":"$c->find(array("x" => array(:gt => 4))); orini_set("mongo.cmd", ".");$c->find(array("x" => array(.gt => 4)));
  • Indexing including secondary and compound indexes$people->ensureIndex(array("age" => 1));$people->ensureIndex(array( "name" => -1, "ts" => -1, "comments.author" => 1));
  • Cursors$cursor = $c->find(array("foo" => "bar"))foreach ($cursor as $id => $value) { echo "$id: "; var_dump( $value );}$a = iterator_to_array($cursor);
  • Paging$page_num = 3;$results_per_page = 10;$cursor = $results->find() ->sort(array("ts" => -1)) ->skip($page_num * $results_per_page) ->limit($results_per_page);
  • Grid FS
  • Storing FilesUnder 16mb
  • Storing Big Files>16mb stored in 16mb chunks
  • Storing Big FilesWorks with replicatedand sharded systems
  • A better network FS• GridFS files are seamlessly sharded & replicated.• No OS constraints... • No file size limits • No naming constraints • No folder limits • Standard across different OSs• MongoDB automatically generate the MD5 hash of the file
  • MongoDB for the Cloud
  • Cloud vs Metal•Commodity •Customizable•Horizontal scale •Scale up or out•RAM + CPU •Disk, RAM + CPU•Multi-tenant •Dedicated
  • IaaS
  • PaaS
  • MongoDBComponents
  • Replica SetsPrimary Primary PrimarySecondary Secondary SecondarySecondary Arbiter Secondary Secondary Secondary
  • Sharding App App App Server Server Server MongoS MongoS MongoS ConfigD ConfigD ConfigDMongoD MongoD MongoD MongoDMongoD MongoD MongoD MongoDMongoD MongoD MongoD MongoD
  • MongoDB on EC2
  • Amazon EC2Instance Types 32-bit = Don’t Use Typical MongoD ConfigD / Arbiter Big MongoD 32-bit = Don’t Use High CPU not necessary
  • OS• Amazon OS now an option• Turn off atime• Raise file descriptor limits cat >> /etc/security/limits.conf << EOF * hard nofile 65536 * soft nofile 65536 EOF• DO NOT use large VM pages• Use ext4, xfs• Use RAID– RAID10 on MongoD– RAID1 on ConfigDB• Warning! Known problems with Ubuntu 10.04 & EBS• https://bugs.launchpad.net/ubuntu/+source/linux-ec2/+bug/ 614853– https://bugzilla.kernel.org/show_bug.cgi?id=16991
  • http://spf13.com http://github.com/spf13 @spf13 Questions? download at mongodb.orgPS: We’re hiring!! Contact us at jobs@10gen.com