Mongo db php_shaken_not_stirred_joomlafrappe

  • 703 views
Uploaded on

My presentation on MongoDB at the 2nd Joomlafrappe in Athens. A short introduction to NoSQL, MongoDB Replica Sets, sharding and the PHP driver

My presentation on MongoDB at the 2nd Joomlafrappe in Athens. A short introduction to NoSQL, MongoDB Replica Sets, sharding and the PHP driver

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
703
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
15
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. PHP & MongoDBShaken, not stirredSpyros Passas / @spassasFriday, April 12, 13
  • 2. NoSQL | Everybody is talking about it!Friday, April 12, 13
  • 3. NoSQL | What• NoSQL ≠ SQL is dead• Not an opposite, but an alternative/complement to SQL (Not Only SQL)• Came as a need for large volumes of data and high transaction rates• Are generally based on key/value store• Are very happy with denormalized data since they have no joinsFriday, April 12, 13
  • 4. NoSQL | Why• Flexible Data Model, so no prototyping is needed• Scaling out instead of Scaling up• Performance is significantly higher• Cheaper licenses (or free)• Runs on commodity hardware• Caching layer already there• Data varietyFriday, April 12, 13
  • 5. NoSQL | Why not• well, it’s not all ACID...• Less mature than the relational systems (so the ecosystem of tools/addonsis still small)• BI & Reporting is limited• Coarse grained Security settingsFriday, April 12, 13
  • 6. NoSQL | Which• Key/Value stores• Document Databases• And more...Friday, April 12, 13
  • 7. MongoDB | Documents & Collections• Document is the equivalent of an SQL table row and is a set of key/valuepairs• Collection is the equivalent of an SQL table and is a set of documents notnecessarily of the same type• Database is the equivalent of a... database{“name” : “Spyros Passas”,“company” : “Neybox”}{“name” : “Spyros Passas”,“company” : “Neybox”}{“Event” : “JoomlaFrappe”,“location” : “Athens”}Friday, April 12, 13
  • 8. MongoDB | What can a value be?• Keys are always strings (without . and $)• Value can be• String• Number• Date• Array• Document{“name” : “Spyros Passas”}{“age” : 30}{“birthday” : Date(“1982-12-12”}{“interests” : [“Programming”, “NoSQL”]}{“address” : {“street” : “123 Pireus st.”,“city” : “Athens”,“zip_code” : 17121}}Friday, April 12, 13
  • 9. MongoDB | Example of a document{“_id” : ObjectId(“47cc67093475061e3d95369d”),“name” : “Spyros Passas”,“birthday” : Date(“1982-12-12”),“age” : 30,“interests” : [“Programming”, “NoSQL”],“address” : {“street” : “123 Pireus st.”,“city” : “Athens”,“zip_code” : 17121}“_id” : ObjectId(“47cc67093475061e3d95369d”)ObjectId is a special typeFriday, April 12, 13
  • 10. MongoDB | Indexes• Any field can be indexed• Indexes are ordered• Indexes can be unique• Compound indexes are possible (and in fact very useful)• Can be created or dropped at anytime• Indexes have a large size and an insertion overheadFriday, April 12, 13
  • 11. MongoDB | Operators & Modifiers• Comparison: $lt (<), $lte (<=), $ne (!=), $gte (>=), $gt (>)• Logical: $and, $or, $not, $nor• Array: $all, $in, $nin• Geospatial: $geoWithin, $geoIntersects, $near, $nearSphere• Fields: $inc, $rename, $set, $unset• Array: $pop, $pull, $push, $addToSetFriday, April 12, 13
  • 12. MongoDB | Data Relations• MongoDB has no joins (but you can fake them in the application level)• MongoDB supports nested data (and it’s a pretty good idea actually!)• Collections are not necessary, but greatly help data organization andperformanceFriday, April 12, 13
  • 13. MongoDB | Going from relational to NoSQL• Rethink your data and select a proper database• Rethink the relationships between your data• Rethink your query access patterns to create efficient indexes• Get to know your NoSQL database (and its limitations)• Move logic from data to application layer (but be careful)Friday, April 12, 13
  • 14. MongoDB | DeploymentMongo ServerData LayerApplication LayerApp Server + mongosFriday, April 12, 13
  • 15. MongoDB | DeploymentMongo ServerFriday, April 12, 13
  • 16. MongoDB | Replica SetPrimary (Master)Secondary (Slave)Friday, April 12, 13
  • 17. MongoDB | Replica SetPrimary (Master)Secondary (Slave)Secondary (Slave) Secondary (Slave)Friday, April 12, 13
  • 18. MongoDB | Replica Set when things go wrongPrimary (Master)Secondary (Slave)Secondary (Slave) Secondary (Slave)Friday, April 12, 13
  • 19. MongoDB | Replica Set when things go wrongPrimary (Master)Secondary (Slave) Secondary (Slave)Friday, April 12, 13
  • 20. MongoDB | Replica Set when things go wrongPrimary (Master)Secondary (Slave) Secondary (Slave)Secondary (Slave)Friday, April 12, 13
  • 21. MongoDB | Replica set tips• Physical machines should be in independent availability zones• Selecting to read from slaves significantly increases performance (but youhave to be cautious)Friday, April 12, 13
  • 22. MongoDB | ShardingA...ZFriday, April 12, 13
  • 23. MongoDB | ShardingA...J K....P Q....ZFriday, April 12, 13
  • 24. MongoDB | Sharding with replica setsA...J K....P Q....ZReplica SetReplica SetReplica SetFriday, April 12, 13
  • 25. MongoDB | Sharding with replica setsA...J K....P Q....ZConfig ServersReplica SetReplica SetReplica SetFriday, April 12, 13
  • 26. MongoDB | Things to consider when sharding• Picking the right sharding key is of paramount importance!• Rule of thumb:“the shard key must distribute reads and writes and keep thedata you’re using together”• Key must be of high cardinality• Key must not be monotonically ascending to infinity• Key must not be random• A good idea is a coarsely ascending field + a field you query a lotFriday, April 12, 13
  • 27. MongoDB | PHP | The driver• Serializes objects to BSON• Uses exceptions to handle errors• Core classes• MongoClient: Creates and manages DB connections• MongoDB: Interact with a database• MongoCollection: Represents and manages a collection• MongoCursor: Used to iterate through query resultsFriday, April 12, 13
  • 28. MongoDB | PHP | MongoClient<?php// Gets the client$mongo = new MongoClient(“mongodb://localhost:27017”);// Sets the read preferences (Primary only or primary & secondary)$mongo->setReadPreference(MongoClient::RP_SECONDARY);// If in replica set, returns hosts status$hosts_array = mongo->getHosts();// Returns an array with the database names$db_array = $mongo->listDBs();// Returns a MongoDB object$database = $mongo->selectDB(“myblog”);?>Creates a connection and sets read preferencesProvide info about hosts status and healthLists, selects or drops databasesFriday, April 12, 13
  • 29. MongoDB | PHP | MongoDB<?php// Create a collection$database->createCollection(“blogposts”);// Select a collection$blogCollection = $database->selectCollection(“blogposts”);// Drop a collection$database->dropCollection(“blogposts”)?>Handles CollectionsFriday, April 12, 13
  • 30. MongoDB | PHP | MongoCollection | Insert<?php// Fire and forget insertion$properties = array(“author”=>”spassas”, “title”=>”Hello World”);$collection->insert($properties);?>Insert<?php// Safe insertion$properties = array(“author”=>”spassas”, “title”=>”Hello World”);$collection->insert($properties, array(“safe”=>true));?>Friday, April 12, 13
  • 31. MongoDB | PHP | MongoCollection | Update<?php// Update$c->insert(array("firstname" => "Spyros", "lastname" => "Passas" ));$newdata = array($set => array("address" => "123 Pireos st"));$c->update(array("firstname" => "Spyros"), $newdata);// Upsert$c->update(    array("uri" => "/summer_pics"),    array($inc => array("page_hits" => 1)),    array("upsert" => true));?>Friday, April 12, 13
  • 32. MongoDB | PHP | MongoCollection | Delete<?php// Delete parameters$keyValue = array(“name” => “Spyros”);// Safe remove$collection->remove($keyValue, array(safe => true));// Fire and forget remove$collection->remove($keyValue);?>Friday, April 12, 13
  • 33. MongoDB | PHP | MongoCollection | Query<?php// Get the collection$posts = $mongo->selectDB(“blog”)->selectCollection(“posts”);// Find one$post = $posts->findOne(array(author => john), array(title));// Find many$allPosts = $posts->find(array(author => john));// Find using operators$commentedPosts = $posts->find(array(‘comment_count’ => array(‘$gt’=>1)));// Find in arrays$tags = array(‘technology’, ‘nosql’);// Find any$postsWithAnyTag = $posts->find(array(tags => array($in => $tags)));// Find all$postsWithAllTags = $posts->find(array(tags => array($all => $tags)));?>Friday, April 12, 13
  • 34. MongoDB | PHP | MongoCursor<?php// Iterate through results$results = $collection->find();foreach ($results as $result) {    // Do something here}// Sort$posts = $posts->sort(array(created_at=> -1));// Skip a number of results$posts = $posts->skip(5);// Limit the number of results$posts = $posts->limit(10);// Chaining$posts->sort(array(created_at=> -1))->skip(5)->limit(10);?>Friday, April 12, 13
  • 35. MongoDB | PHP | Query monitoring & Optimizationexplain()Gives data about index performance for a specific query{"n" : <num>, /* Number documents that match the query */"nscannedObjects" : <num>, /* total number of documents scanned duringthe query */"nscanned" : <num>, /* total number of documents and index entries */"millis" : <num>, /* time to complete the query in milliseconds */“millisShardTotal” : <num> /* total time to complete the query on shards*/“millisShardAvg” : <num> /* average time to complete the query on eachshard */}Friday, April 12, 13
  • 36. Thank you!{“status” : “over and out”,“mood” : “:)”,“coming_up” : “Q & A”“contact_details”: {“email”:“sp@neybox.com”,“twitter”:”@spassas”,}}Friday, April 12, 13