Non-Relational Databases

36
Non-Relational Databases San Francisco Perl Mongers Kristina Chodorow September 3, 2009

description

San Francisco Perl Mongers presentation, September 3rd, 2009.

Transcript of Non-Relational Databases

Page 1: Non-Relational Databases

Non-Relational Databases

San Francisco Perl MongersKristina ChodorowSeptember 3, 2009

Page 2: Non-Relational Databases

Who am I?

• Software Engineer at 10gen• Perl, PHP, Java drivers

Page 3: Non-Relational Databases
Page 4: Non-Relational Databases

Scaling

Page 5: Non-Relational Databases

Scaling

Page 6: Non-Relational Databases

Technique #1: literally scale

Page 7: Non-Relational Databases

Technique #1: literally scale

$3,200 $4,000,000x 1250 =

(Courtesy of Ask Bjorn Hansen)

Page 8: Non-Relational Databases

Technique #2: shard

now-yesterday yesterday-the day before

the day before-the day before that

Page 9: Non-Relational Databases

Technique #3: master-slave replication

R/W?W

W

W

R

R

Valued Acer Customer
Single point of failure
Page 10: Non-Relational Databases

Cassandra

• Designed by Facebook• Distributed - eventually

consistent• Column-oriented

Page 11: Non-Relational Databases

Cassandra

• Writes ALWAYS work• Two types of reads: – high performance– guaranteed correct

• R/W atomic within column family

Page 12: Non-Relational Databases

Cassandra

Row-oriented: joe, 34, karen, 25, bob, 50

Column-oriented:joe, karen, bob, 34, 25, 50

Page 13: Non-Relational Databases

Project Voldemort

• Key/value store• Automatic replication/partitioning• 75 Github forks

“It is basically a just a big, distributed, persistent, fault-tolerant hash table.”

Valued Acer Customer
Written in Java75 forks on Github
Page 14: Non-Relational Databases

Tokyo Cabinet

• Another key/value store• Blazing fast… theoretically• Lua for server-side scripting

Page 15: Non-Relational Databases

Tokyo Cabinet

• Key/value pairs• Array store• Index-able Hash

{ name : “Chris” age : 27, DOB : “January 1”}

Page 16: Non-Relational Databases

CouchDB

• Master-Master Replication• Map/Reduce• REST API

Page 17: Non-Relational Databases

CouchDB Futon

Page 18: Non-Relational Databases

MongoDB

Page 19: Non-Relational Databases

MongoDB

• Ease of use• Scalable• Dynamic queries - similar “feel” to

SQL• Speed of key/value stores (almost)• Power of RDBMSs (almost)

Page 20: Non-Relational Databases

The Perl Driver

Available at Github: www.github.com/mongodb/mongo-perl-driver/

Install the Perl driver $ perl Makefile.PL && sudo make install

Available on CPAN (but old):http://search.cpan.org/~flora/MongoDB-0.01/

Page 21: Non-Relational Databases

Downloading MongoDB

www.mongodb.org

Binaries available for Linux, Mac, Windows, Solaris

Page 22: Non-Relational Databases

Start the DB Server

$ mkdir ~/db$$ tar zxvf mongodb-<OS>-1.0.0.tgz$ cd mongodb-<OS>-1.0.0$ bin/mongod --dbpath ~/db

Page 23: Non-Relational Databases

Connecting to the Database

use MongoDB;

my $connection = MongoDB::Connection->new;

my $db = $connection->get_database(‘test’);

my $collection = $db->get_collection(‘foo’);

Page 24: Non-Relational Databases

Inserting

my $id = $collection->insert( { title => ‘My first blog post’, author => ‘Joe’, content => ‘Hello, world!’

comments => [] });

Page 25: Non-Relational Databases

MongoDB::OIDan autogenerated primary key

my $id = $collection->insert({whatever});

print Dumper($id);--------------------------------------------

$VAR1 = bless( { 'value' => '4a9700dba5f9107c5cbc9a9c' }, 'MongoDB::OID' )

Page 26: Non-Relational Databases

Updating

$collection->update({_id => $id}, {‘$push’ => {comments => {

‘author’ => ‘Fred’,‘comment’ => ‘Dumb post.”

}}});

Page 27: Non-Relational Databases

…which gives us:

print Dumper($collection->find_one());--------------------------------------------{

title : ‘My first blog post’, author : ‘Joe’, content : ‘Hello, world!’ comments : [{ ‘author’ : ‘Fred’, ‘comment’ : ‘Dumb post’ }]}

Page 28: Non-Relational Databases

Magic (not the Perl kind)

$gt, $gte, $lt, $lte, $eq, $neq, $exists, $set, $mod, $where, $in, $nin, $inc$push, $pull, $pop, $pushAll, $popAll

$c->query({ x => {‘$gt’ => 4}})

Page 29: Non-Relational Databases

Querying

my $commented_by_fred = $collection->query({ “comments.author” : “Fred” });

my $commented_by_fred = $collection->query({ “comments.author” : qr/fred/i });

Page 30: Non-Relational Databases

$where

$collection->find_one({‘$where’ : ‘this.y == (this.x + this.z)’});

Will work:{x => 1, y => 4, z => 3}{x => “hi”, y => “hibye”, z => “bye”}

Won’t work:{x => 1, y => 1}

Page 31: Non-Relational Databases

Optimizing $where

$collection->find_one({ ‘name’ => ‘Sally’, ‘age’ => {‘$gt’ => 18}, ‘$where’ => ‘Array.sort(this.interests)[2] == “volleyball”’});

Page 32: Non-Relational Databases

Speaking of indexing…

$collection->ensure_index({“age” => “ascending”});

$collection->ensure_index({ “name” => “descending”, “ts” => “descending”, “comments.author” => “ascending”});

Page 33: Non-Relational Databases

Cursors

my $cursor = $coll->query({“foo” => “bar”});

my $obj;while (my $obj = $cursor->next) { ...}

my @all = $cursor->all;

Page 34: Non-Relational Databases

Paging

my $cursor = $coll->query-> sort({ts => -1})-> skip($page_num * $results_per_page)-> limit($results_per_page);

my @page = $cursor->all;

Page 35: Non-Relational Databases

Logging

• insert/update/remove is fast• Capped collections• Schemaless• $inc for counts

Page 36: Non-Relational Databases

Thank you!

[email protected]@kchodorow

@mongodbirc.freenode.net#mongodb

www.mongodb.org