confessions of a relational addict

55
Confessions of a relational addict Chandra Patni

Upload: chandra-patni

Post on 18-May-2015

1.729 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Confessions of a relational addict

Confessions of a relational addict

Chandra Patni

Page 2: Confessions of a relational addict

Twitter @cpatni

Page 3: Confessions of a relational addict

Architecture

Page 4: Confessions of a relational addict

http://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf

Volume 13 / Number 6 / June 1970

Page 5: Confessions of a relational addict

Promise of ACID

Atomicity

Consistency

Isolation

Durability

Page 6: Confessions of a relational addict

READ COMMITTED may block

Page 7: Confessions of a relational addict

ANSI/ISO SQL...

READ UNCOMMITTED to allow for non-blocking reads

Page 8: Confessions of a relational addict

But allowed dirty reads...

Page 9: Confessions of a relational addict

Isolation. Really?

Page 10: Confessions of a relational addict

Locking

Locking

Lock Lock

Escalation

Escalation

Read Lock

Read Lock

Write Lock

Write Lock

Table Lock

Table Lock

Page 11: Confessions of a relational addict

MVCCFor transactional memory

Page 12: Confessions of a relational addict

Readers don’t block readers

Readers don’t block writers

Writers don’t block writers

Writers block writers (serialized)

Page 13: Confessions of a relational addict

Living in a bliss

Page 14: Confessions of a relational addict

Until...

Page 15: Confessions of a relational addict

need redundancy

Page 16: Confessions of a relational addict

scale reads

Page 17: Confessions of a relational addict

scale writes

Page 18: Confessions of a relational addict

horizontally

Page 19: Confessions of a relational addict

Solutions...

Page 20: Confessions of a relational addict

replication to scale reads

Page 21: Confessions of a relational addict

cache through writes

Page 22: Confessions of a relational addict

expensive solution for redundancy

Page 23: Confessions of a relational addict

mongodb

Page 24: Confessions of a relational addict

Distributed database from ground up

Page 25: Confessions of a relational addict

replication in a minute (HA)

Page 26: Confessions of a relational addict

built-in cache through writes

Page 27: Confessions of a relational addict

replicate if you care about your data

Page 28: Confessions of a relational addict

sharding (scale out)

Page 29: Confessions of a relational addict

Effective Design

Page 30: Confessions of a relational addict

Domain objects rarely fit in a table row

Page 31: Confessions of a relational addict
Page 32: Confessions of a relational addict
Page 33: Confessions of a relational addict

join to assemble domain objects

Page 34: Confessions of a relational addict

mongo documents as pre-assembled domain objects

Page 35: Confessions of a relational addict

in place updates ($set, $push)

Page 36: Confessions of a relational addict

New hotness

Page 37: Confessions of a relational addict

Multikeys

Page 38: Confessions of a relational addict

Map reduce

map = function () { for (var i = 0; i < this.tags.length; i++) { emit(this.tags[i], this.state == "published" ? 1 : 0); } }reduce = function (key, values) { var total = 0; for (var i = 0; i < values.length; i++) { total += values[i]; } return total; }

Page 39: Confessions of a relational addict

Capped collections

Page 40: Confessions of a relational addict

Geospatial

Page 41: Confessions of a relational addict

GridFS

Page 42: Confessions of a relational addict

Rubber meets the road

Page 43: Confessions of a relational addict

Realtime Dashboard

Page 44: Confessions of a relational addict

Realtime Dashboard

Realtime stats for 1 sec, 5 secs, 15 secs

4K updates per second

pywebsocket

Page 45: Confessions of a relational addict

IGN Media: Editorial Generated Content

Page 46: Confessions of a relational addict

Content in MongodbMaster/slave over filer for instant backups

100 ops

Ruby on Rails backend

MongoMapper

Integrate Solr Search with MongoMapper: http://github.com/tsxn26/customized-mongomapper-search

XML/JSON serialization: http://github.com/rubyorchard/mongomapper

Page 47: Confessions of a relational addict
Page 48: Confessions of a relational addict

RESTful API

Page 49: Confessions of a relational addict

Game Schema DesignRapid Schema Revision

Optimize canonical use-case

Page 50: Confessions of a relational addict

IGN Social: User Generated Content

Manish Pandit

Page 51: Confessions of a relational addict

Activity Streams

3M documents @10-15 qps, @5 updates/sec

Moving to activity propagation: 4 documents for every user, i.e. a total of 2M documents with arrays of 500 activities each

Move to replica sets on 1.7

Page 52: Confessions of a relational addict

Meta+Level Games

Page 53: Confessions of a relational addict

Shadelight

Data in MongoDB and Redis

Replicated in real-time to slave servers

Master and slave are in different colo

Ben Myles wrote awesome library called MongoMatic http://mongomatic.com/

Page 54: Confessions of a relational addict

Mongomatic

Ruby datamapper for MongoDB

Simple and embraces MongoDB

Shadelight and Mongo Machine (http://mongomachine.com/) use it

Page 55: Confessions of a relational addict

We’re hiringhttp://corp.ign.com/http://labs.ign.com/