Download - What's New in the PHP Driver
Hannes Magnusson, [email protected]
@bjoriNovember 15th, 2012
What’s new in thePHP Driver (1.3.0)
Thursday, 15 November 12
• Hannes / @bjori• Icelandic
– Oslo, Norway– London, England– San Francisco, USA
• PHP Contributor • PHP Driver Engineer
» @10gen
About me
3
Thursday, 15 November 12
Agenda
• Removed not-so-cool stuff• New cool stuff
• Connection handling / Replica Sets– Write Concerns– Read Preferences
Thursday, 15 November 12
Removed stuff
Thursday, 15 November 12
Pooling
• Bye bye!• MongoPool::*()• Mongo->poolDebug();• Mongo->get/setPoolSize();
– Replaced by one persistent connection per• host:port;replicaSetName;credentials;pid combo
6
Thursday, 15 November 12
Deprecated
• Mongo->connectUtil()• Mongo->get/setSlaveOkay()• Mongo->last/prev/reset/forceError()• Mongo->switchSlave()
7
Thursday, 15 November 12
New stuff
Thursday, 15 November 12
MongoClient !!
• Acknowledged writes by default! \o/\o/• No deprecated methods
– Old Mongo class now extends MongoClient and adds back the old behaviour and methods
9
Thursday, 15 November 12
• $mongoCollection->aggregate()• $mongoCollection->findAndModify()• TTL Collections
10
$mongoCollection->ensureIndex( array("dateField" => 1), array("expireAfterSeconds" => 3600));
Thursday, 15 November 12
Aggregation Framework
11
$ops = array( array( '$project' => array( "author" => 1, "tags" => 1, ) ), array('$unwind' => '$tags'), array( '$group' => array( "_id" => array("tags" => '$tags'), "authors" => array('$addToSet' => '$author'), ), ),);$results = $collection->aggregate($ops);
Thursday, 15 November 12
New cool stuff
• ReadPreferences• WriteConcerns• Connection handling
12
Thursday, 15 November 12
What does the driver do?
Its responsibilitiesConnection handling/failover
Thursday, 15 November 12
The Driver
• Full C level client library, no external dependencies– Connection handling– Memory usage reported by PHP (almost)– Connection handling– MongoDB Wire protocol (OP_[CRUD], KILL_CURSOR)– Connection handling– Authentication– Connection handling
• BSON serialization• Connection handling• Command wrappers/helpers• Connection handling
14
Thursday, 15 November 12
Replica Sets
Establishing connections
Thursday, 15 November 12
Replica Set – Configuration Options
> conf = { _id : "mySet", members : [ {_id : 0, host : "Node1”, tags : {"dc": "us"}}, {_id : 1, host : "Node2", priority : 20, tags : {"dc": "is"}}, {_id : 2, host : "Node3”, priority : 30, tags : {"dc": "is"}}, {_id : 3, host : "Node4", hidden : true}, {_id : 4, host : "Node5", hidden : true, slaveDelay : 3600} ]}
> rs.initiate(conf)
Thursday, 15 November 12
Replica Set – Configuration Options
> conf = { _id : "mySet", members : [ {_id : 0, host : "Node1”, tags : {"dc": "us"}}, {_id : 1, host : "Node2", priority : 20, tags : {"dc": "is"}}, {_id : 2, host : "Node3”, priority : 30, tags : {"dc": "is"}}, {_id : 3, host : "Node4", hidden : true}, {_id : 4, host : "Node5", hidden : true, slaveDelay : 3600} ]}
> rs.initiate(conf)
Primary DC
Thursday, 15 November 12
Replica Set – Configuration Options
> conf = { _id : "mySet", members : [ {_id : 0, host : "Node1”, tags : {"dc": "us"}}, {_id : 1, host : "Node2", priority : 20, tags : {"dc": "is"}}, {_id : 2, host : "Node3”, priority : 30, tags : {"dc": "is"}}, {_id : 3, host : "Node4", hidden : true}, {_id : 4, host : "Node5", hidden : true, slaveDelay : 3600} ]}
> rs.initiate(conf)
Secondary DCDefault priority = 1
Thursday, 15 November 12
Replica Set – Configuration Options
> conf = { _id : "mySet", members : [ {_id : 0, host : "Node1”, tags : {"dc": "us"}}, {_id : 1, host : "Node2", priority : 20, tags : {"dc": "is"}}, {_id : 2, host : "Node3”, priority : 30, tags : {"dc": "is"}}, {_id : 3, host : "Node4", hidden : true}, {_id : 4, host : "Node5", hidden : true, slaveDelay : 3600} ]}
> rs.initiate(conf)
Analytics node
Thursday, 15 November 12
Replica Set – Configuration Options
> conf = { _id : "mySet", members : [ {_id : 0, host : "Node1”, tags : {"dc": "us"}}, {_id : 1, host : "Node2", priority : 20, tags : {"dc": "is"}}, {_id : 2, host : "Node3”, priority : 30, tags : {"dc": "is"}}, {_id : 3, host : "Node4", hidden : true}, {_id : 4, host : "Node5", hidden : true, slaveDelay : 3600} ]}
> rs.initiate(conf)
Backup node
Thursday, 15 November 12
Replica Set - Creation
Node 1 Node 2
Node 3Node 4 Node 5
Thursday, 15 November 12
Replica Set - Initialize
Node 1 Node 2
Node 3
RS Init
Node 4 Node 5
Thursday, 15 November 12
Replica Set - Initializing
Node 1 Node 2
Node 3
HeartbeatElection
Node 4 Node 5
Thursday, 15 November 12
Replica Set - Initialized
Node 1Secondary
Node 2Secondary
Node 3Primary
Node 4(hidden)
Node 5(hidden)
Thursday, 15 November 12
Replica Set - Driver view
Node 1Secondary
Node 2Secondary
Node 3Primary
Driver
Thursday, 15 November 12
Connecting to Replica Set
• Connect to Node1– send `ismaster` then `ping`
• Connect to Node3...• Topology discovery
– Match hostnames & Replica Set names
– Verify the seedlist
– Discover more nodes
– Connect to Node2...26
<?php$servers = "mongodb://Node1,Node3";$options = array( "replicaSet" => "mySet",);$m = new MongoClient($servers, $options);?>
Thursday, 15 November 12
Connections
• Each unique connection string• host:port;replicaSetName;user/pass/db;pid
• Once per process• Closed & Cleaned up during shutdown
– Please don’t close connections manually :)
27
Thursday, 15 November 12
Read Preference
Secondary readsPrioritise servers / datacenters
Thursday, 15 November 12
Replica Set - Default only primary
Node 1Secondary
Node 2Secondary
Node 3Primary
Driver
Thursday, 15 November 12
Read Preferences
• Only read from primary• Read from secondaries• Read from specific secondaries• Only read from secondaries when primary
down• Don’t care, just the nearest one• Preferably node with a given tag
30
Thursday, 15 November 12
Read Preferences
• Modes (readPreference)– primary, primaryPreferred– secondary, secondaryPreferred– nearest
• Tag Sets (readPreferenceTags)– Uses Replica Set tags– Passed Tag is used to find matching members
31
Thursday, 15 November 12
Detecting failures / failovers
• Runs `ping` every 5 seconds (mongo.ping_interval)
• Runs `ismaster` every 60 seconds (mongo.is_master_interval)
• Server/connection failure/force close– rs.stepDown()– service mongod stop– Query failure– ...
32
Thursday, 15 November 12
Read Preference +
Failovers
No primary available
Thursday, 15 November 12
Replica Set - all well
Node 1Secondary
Node 2Secondary
Node 3Primary
Driver
Thursday, 15 November 12
Replica Set
Node 1Secondary
Node 2Secondary
Node 3Primary
Driver
Thursday, 15 November 12
Read Preferences
<?php$servers = "mongodb://Node1,Node2,Node3";$options = array( "replicaSet" => "mySet", "readPreference" => "primaryPreferred", "readPreferenceTagS" => "dc:is",);$m = new MongoClient($servers, $options);?>
36
• Read from Primary if available• Otherwise from a secondary in Iceland
Thursday, 15 November 12
WriteConcerns
How much do you love your data?(not actually new, but still cool)
Thursday, 15 November 12
Write Preference
• Unacknowledged (w=0)• Acknowledged (w=1) • Wait for replication (w=2+)• Wait for replication to tagset (w=string) • Wait for journal sync (j=1)
Thursday, 15 November 12
Write Preference
<?php
$examples = $mongo->test->example;$data = array("Hello" => "World");$examples->insert($data, array("w" => 2));$examples->insert($data, array("w" => "is"));
?>
• w=majority• (replicate to the majority of the RS)
Thursday, 15 November 12
New Connection handlingRead Preferences
Acknowledged writes by default
RC2 released last Monday...RC3 this coming Monday...Final .. 2weeks?
Thursday, 15 November 12
@mongodb
conferences, appearances, and meetupshttp://www.10gen.com/events
http://bit.ly/mongofb Facebook | Twitter | LinkedIn
http://linkd.in/joinmongo
download at mongodb.org
We’re Hiring [email protected] @bjori
Thursday, 15 November 12