What's New in the PHP Driver

Post on 25-May-2015

1.104 views 2 download

Tags:

description

Interested in learning more about MongoDB? Sign up for MongoSV, the largest annual user conference dedicated to MongoDB. Learn more at MongoSV.com

Transcript of What's New in the PHP Driver

Hannes Magnusson, 10genbjori@10gen.com

@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 !bjori@10gen.com @bjori

Thursday, 15 November 12