mongodb at-gilt-groupe-seattle-2012-09-14-final

77
September 2012 Sean Sullivan @

Upload: mongodb

Post on 10-May-2015

1.276 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Mongodb at-gilt-groupe-seattle-2012-09-14-final

September 2012Sean Sullivan

@

Page 2: Mongodb at-gilt-groupe-seattle-2012-09-14-final

• software engineer

• ~18 months at Gilt

• work in Gilt’s Portland office

• back office applications

About me

Page 3: Mongodb at-gilt-groupe-seattle-2012-09-14-final

• Gilt Groupe

• Gilt’s technology stack

• MongoDB at Gilt

• Q&A

Agenda

Page 4: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Gilt Groupehttp://www.gilt.com

Page 5: Mongodb at-gilt-groupe-seattle-2012-09-14-final

flash sales

Page 6: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Everyday at 12 noon

Page 7: Mongodb at-gilt-groupe-seattle-2012-09-14-final

what does Gilt sell?

Page 8: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Apparel

Page 9: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 10: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 11: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Kids merchandise

Page 12: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 13: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Home furnishings

Page 14: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 15: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Food

Page 16: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 17: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Local deals

Page 18: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 19: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Travel

Page 20: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 21: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 22: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Gilt technology stack

Page 23: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 24: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Gilt architecture

Page 25: Mongodb at-gilt-groupe-seattle-2012-09-14-final

monolithicapplication

service-oriented approach

2007 2012

Page 26: Mongodb at-gilt-groupe-seattle-2012-09-14-final

2007

Page 27: Mongodb at-gilt-groupe-seattle-2012-09-14-final

2012

service A

service B

service C

service D

service E

legacyweb app

gilt.com

Page 28: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Data storage @ Gilt

Page 29: Mongodb at-gilt-groupe-seattle-2012-09-14-final

@

Page 30: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Why MongoDB?

• Ease of use

• Horizontal scaling

• High availability

• Automatic failover

Page 31: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Why MongoDB?

• Stability

• Support

• Drivers

Page 32: Mongodb at-gilt-groupe-seattle-2012-09-14-final

• MongoDB 2.0

• sharded and non-sharded data

• Solid State Drives

• MMS for monitoring

Page 33: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Use case #1: user profiles

Page 34: Mongodb at-gilt-groupe-seattle-2012-09-14-final

• user data in Postgres

• legacy Rails app expects to find user data in Postgres

• we want Gilt’s customer facing application code to retrieve user data from MongoDB

Challenges

Page 35: Mongodb at-gilt-groupe-seattle-2012-09-14-final

• keep user data in both MongoDB and Postgres

• replicate table changes from Postgres to MongoDB

Solution

Page 36: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Replicating data

user service

legacyweb app

replication

Page 37: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Use case #2: feature configuration

Goal

manage the release of new features on gilt.com

How

feature configuration persisted in MongoDB

Page 38: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Rolling out a new feature

1. deploy new application code to production

2. enable feature for Gilt Tech employees

3. ... then enable for all Gilt employees

4. ... then enable for a subset of users

5. gradually ramp up to 100% of users

Page 39: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Feature configservice

Feature configuration

gilt.com

Page 40: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Use case #3: favorite brands

Page 41: Mongodb at-gilt-groupe-seattle-2012-09-14-final

userpreference

service

AJAX

Favorite brands

Page 42: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Application development

Page 43: Mongodb at-gilt-groupe-seattle-2012-09-14-final

mongo-java-driver

Morphia

Casbah

Page 44: Mongodb at-gilt-groupe-seattle-2012-09-14-final

MongoDB Java driver

• main class: com.mongodb.Mongo

• Mongo object maintains a pool of connections

• Latest version: 2.9.1

Page 45: Mongodb at-gilt-groupe-seattle-2012-09-14-final

MongoDB Java driver connection pool tuning

MongoOptions opts = new MongoOptions();

// example values

opts.connectionsPerHost = 50;

opts.threadsAllowedToBlockForConnectionMultiplier = 5;

Page 46: Mongodb at-gilt-groupe-seattle-2012-09-14-final

com.mongodb.WriteConcern

• NORMAL

• SAFE

• REPLICAS_SAFE

• MAJORITY

• FSYNC_SAFE

• JOURNAL_SAFE

Page 47: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Morphia library

Page 48: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Morphia

• object-document mapper for Java

• built on top of mongo-java-driver

• map fields using Java annotations

Page 49: Mongodb at-gilt-groupe-seattle-2012-09-14-final

// Morphia example

import com.google.code.morphia.annotations.*;

@Entity(value="features", noClassnameStored = true)

public class Feature {

@Id

ObjectId featureId;

@Property("feature_key") @Indexed(unique=true)

String featureKey;

@Property("release_to_percentage")

int releaseToPercentage;

}

Page 50: Mongodb at-gilt-groupe-seattle-2012-09-14-final

http://code.google.com/p/morphia/

Page 51: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Casbah library

Page 52: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Casbah

• Scala toolkit for MongoDB

• built on top of the mongo-java-driver

Page 53: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Casbah

• Scala idioms

• Scala collections

• fluid query syntax

Page 55: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Gilt Scala code

Page 56: Mongodb at-gilt-groupe-seattle-2012-09-14-final

trait MongoWriteConcern {

def withSession[T](f: => T)(implicit mongoDb: MongoDB) {

mongoDb.requestStart()

mongoDb.requestEnsureConnection()

try {

f

} finally {

mongoDb.requestDone()

}

}

}

Page 57: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Best Practices

Page 58: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Best practices

Connection tuning

explicitly configure Mongo Java Driver connection pool size

Page 59: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Best practices

Use caution when creating new indexes

“creating a new index on a production mongo server can basically cause it to stop working while it builds the index”

(source: Gilt production incident report)

Page 60: Mongodb at-gilt-groupe-seattle-2012-09-14-final

http://docs.mongodb.org/manual/administration/indexes/#index-building-replica-sets

Minimizing impact of building a new index

• remove one secondary from replica set

• create/rebuild index on this instance

• rejoin replica set

• repeat on all remaining secondaries

• run rs.stepDown() on primary member

Page 61: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Best practicesuse short names for fields to avoid wasted space

http://christophermaier.name/blog/2011/05/22/MongoDB-key-names

{

city: “Portland”,

state: “Oregon”,

country: “US”

}

{

ci: “Portland”,

st: “Oregon”,

co: “US”

}

vs

Page 62: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Best practices

use explain() during development

db.collection.find(query).explain()

Page 63: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Best practices

use caution when choosing a shard key

“It is generally not a good idea to use the default ObjectId as the shard key”

source: http://stackoverflow.com/questions/9164356/sharding-by-objectid-is-it-the-right-way

Page 64: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Future

• standardized read preferences

• tag aware sharding

MongoDB 2.2

Mongo Java driver 2.9.x

• enhanced read preference support

(see: com.mongodb.ReadPreference)

Page 65: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Gilt Groupe is hiring!http://techjobs.gilt.com

Page 66: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Questions?

Page 67: Mongodb at-gilt-groupe-seattle-2012-09-14-final

[email protected]@tinyrobots

Page 68: Mongodb at-gilt-groupe-seattle-2012-09-14-final

The end

Page 69: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Bonus slides

Page 70: Mongodb at-gilt-groupe-seattle-2012-09-14-final

Gilt tech talks

• Apache Camel and MongoDB @ Gilt http://bit.ly/OYO37K

• Deploying new features @ Gilt http://slidesha.re/OoCYfd

• Voldemort @ Gilt

http://bit.ly/b9Qhib

Page 71: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 72: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 73: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 74: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 75: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 76: Mongodb at-gilt-groupe-seattle-2012-09-14-final
Page 77: Mongodb at-gilt-groupe-seattle-2012-09-14-final