Download - MongoDB: Optimising for Performance, Scale & Analytics

Transcript
Page 1: MongoDB: Optimising for Performance, Scale & Analytics

Optimising for performance, scale, analytics

Page 2: MongoDB: Optimising for Performance, Scale & Analytics

~3333 write ops/s 0.07 - 0.05 ms response

Page 3: MongoDB: Optimising for Performance, Scale & Analytics

David Mytton

Woop Japan!

Page 4: MongoDB: Optimising for Performance, Scale & Analytics
Page 5: MongoDB: Optimising for Performance, Scale & Analytics

MongoDB at Server Density

Page 6: MongoDB: Optimising for Performance, Scale & Analytics

•27 nodes

MongoDB at Server Density

Page 7: MongoDB: Optimising for Performance, Scale & Analytics

• June 2009 - +3yrs

•27 nodes

MongoDB at Server Density

Page 8: MongoDB: Optimising for Performance, Scale & Analytics

•MySQL -> MongoDB

•27 nodes

MongoDB at Server Density

• June 2009 - +3yrs

Page 9: MongoDB: Optimising for Performance, Scale & Analytics

•MySQL -> MongoDB

•17TB data per month

•27 nodes

MongoDB at Server Density

• June 2009 - +3yrs

Page 10: MongoDB: Optimising for Performance, Scale & Analytics

MongoDB at Server Density

Queues

Primary data store

Time series

Page 11: MongoDB: Optimising for Performance, Scale & Analytics

Why?

Page 12: MongoDB: Optimising for Performance, Scale & Analytics

Why?

• Replication

Page 13: MongoDB: Optimising for Performance, Scale & Analytics

Why?

• Replication

• Official drivers

Page 14: MongoDB: Optimising for Performance, Scale & Analytics

Why?

• Replication

• Official drivers

• Easy deployment

Page 15: MongoDB: Optimising for Performance, Scale & Analytics

Why?

• Replication

• Official drivers

• Easy deployment

• Fast out of the box (sort of)

Page 16: MongoDB: Optimising for Performance, Scale & Analytics

Fast out of the box?

Photo: dannychoo.com

Page 17: MongoDB: Optimising for Performance, Scale & Analytics

~3333 write ops/s 0.07 - 0.05 ms response

Page 18: MongoDB: Optimising for Performance, Scale & Analytics

Fast out of the box?

Photo: dannychoo.com

• Softlayer cloud (1 core, 8GB)

Page 19: MongoDB: Optimising for Performance, Scale & Analytics

Fast out of the box?

Photo: dannychoo.com

• Local instance storage

• Softlayer cloud (1 core, 8GB)

Page 20: MongoDB: Optimising for Performance, Scale & Analytics

Fast out of the box?

Photo: dannychoo.com

• Local instance storage

• Ubuntu 10/12.04 LTS

• Softlayer cloud (1 core, 8GB)

Page 21: MongoDB: Optimising for Performance, Scale & Analytics
Page 22: MongoDB: Optimising for Performance, Scale & Analytics

Fast out of the box?

Photo: dannychoo.com

• Journaling

Page 23: MongoDB: Optimising for Performance, Scale & Analytics

Fast out of the box?

Photo: dannychoo.com

• Journaling

• Replication

Page 24: MongoDB: Optimising for Performance, Scale & Analytics

Picture is unrelated! Mmm, ice cream.

Fast out of the box?

Page 25: MongoDB: Optimising for Performance, Scale & Analytics

Picture is unrelated! Mmm, ice cream.

Fast out of the box?

• Fast network

Page 26: MongoDB: Optimising for Performance, Scale & Analytics

Picture is unrelated! Mmm, ice cream.

Fast out of the box?

• Fast network

• Working set in RAM

Page 27: MongoDB: Optimising for Performance, Scale & Analytics

mongos> db.metrics_20120508_15_1m.stats(){ "sharded" : true, "flags" : 1, "ns" : "metrics.metrics_20120508_15_1m", "count" : 2752934, "numExtents" : 46,

"size" : 746837640, "storageSize" : 823717888,

"totalIndexSize" : 517581680, "indexSizes" : { "_id_" : 130358144, "a_1_i_1" : 155711920, "a_1_i_1_m_1_t_1" : 231511616 }, "avgObjSize" : 271.2878841265355, "nindexes" : 3, "nchunks" : 61,

Page 28: MongoDB: Optimising for Performance, Scale & Analytics

"size" : 746837640, "totalIndexSize" : 517581680

Indexes = 493MB Data = 712MB

Page 29: MongoDB: Optimising for Performance, Scale & Analytics

"size" : 746837640, "totalIndexSize" : 517581680

Indexes = 493MB Data = 712MB

Page 30: MongoDB: Optimising for Performance, Scale & Analytics

"size" : 746837640, "totalIndexSize" : 517581680

Indexes = 493MB Data = 712MB

Total = 1205MB

Page 31: MongoDB: Optimising for Performance, Scale & Analytics

http://www.flickr.com/photos/comedynose/4388430444/

Where should it go?

What? Should it be in memory?

Indexes Always

Data If you can

Page 32: MongoDB: Optimising for Performance, Scale & Analytics

How you’ll know

1) Slow queries

Thu Oct 14 17:01:11 [conn7410] update sd.apiLog query: { c: "android/setDeviceToken", a: 1466, u: "blah", ua: "Server Density Android" } 51926ms

www.flickr.com/photos/tonivc/2283676770/

Page 33: MongoDB: Optimising for Performance, Scale & Analytics

How you’ll know

2) Timeouts

cursor timed out (20000 ms)

Page 34: MongoDB: Optimising for Performance, Scale & Analytics

How you’ll know

3) Disk i/o spikes

www.flickr.com/photos/daddo83/3406962115/

Page 35: MongoDB: Optimising for Performance, Scale & Analytics

Picture is unrelated! Mmm, ice cream.

Fast out of the box?

• Fast network

• Working set in RAM

Page 36: MongoDB: Optimising for Performance, Scale & Analytics

Picture is unrelated! Mmm, ice cream.

Fast out of the box?

• Fast network

• Working set in RAM

• Fast disks (optional)

Page 37: MongoDB: Optimising for Performance, Scale & Analytics
Page 38: MongoDB: Optimising for Performance, Scale & Analytics
Page 39: MongoDB: Optimising for Performance, Scale & Analytics

Growing documents is bad

Page 40: MongoDB: Optimising for Performance, Scale & Analytics

Updates in place

db.my_collection.update( { _id : ... }, { $inc : { y : 2 } } )

Page 41: MongoDB: Optimising for Performance, Scale & Analytics

BSON

Page 42: MongoDB: Optimising for Performance, Scale & Analytics

BSON

Page 43: MongoDB: Optimising for Performance, Scale & Analytics

Growing documents is bad

> db.coll.stats(){ "ns" : "...", ..., "paddingFactor" : 1, ..., "ok" : 1}

Page 44: MongoDB: Optimising for Performance, Scale & Analytics

• Global DB lock

Scaling writes

Page 45: MongoDB: Optimising for Performance, Scale & Analytics

• Concurrency

Scaling writes

• Global DB lock

Page 48: MongoDB: Optimising for Performance, Scale & Analytics

http://bit.ly/mongolock

Page 49: MongoDB: Optimising for Performance, Scale & Analytics

Picture is unrelated! Mmm, ice cream.

Fast out of the box?

• Fast network

• Working set in RAM

• Fast disks (optional)

• Sharding (optional)

Page 50: MongoDB: Optimising for Performance, Scale & Analytics

• Sharding

• Concurrency

Scaling writes

• Global DB lock

Page 51: MongoDB: Optimising for Performance, Scale & Analytics

Scaling writes

Page 52: MongoDB: Optimising for Performance, Scale & Analytics
Page 53: MongoDB: Optimising for Performance, Scale & Analytics

• Collection location

Scaling writes

Page 54: MongoDB: Optimising for Performance, Scale & Analytics

• Collection location

Scaling writes

• Pre-split / moveChunk

Page 55: MongoDB: Optimising for Performance, Scale & Analytics

• Collection location

Scaling writes

• Hashing (v2.4)

• Pre-split / moveChunk

Page 56: MongoDB: Optimising for Performance, Scale & Analytics

Failover

•Replica sets

Page 57: MongoDB: Optimising for Performance, Scale & Analytics

Failover

•Replica sets

•Master/slave

Page 58: MongoDB: Optimising for Performance, Scale & Analytics

Failover

•Replica sets

•Min 3 nodes

•Master/slave

Page 59: MongoDB: Optimising for Performance, Scale & Analytics

Failover

•Replica sets

•Min 3 nodes

•Master/slave

•Automatic failover

Page 60: MongoDB: Optimising for Performance, Scale & Analytics

rs.status()

www.ex-astris-scientia.org/inconsistencies/ent_vs_tng.htm (yes it’s a replicator from Star Trek)

{! "_id" : 1,! "name" : "rs3b:27018",! "health" : 1,! "state" : 2,! "stateStr" : "SECONDARY",! "uptime" : 1886098,! "optime" : {! ! "t" : 1291252178000,! ! "i" : 13! },! "optimeDate" : ISODate("2010-12-02T01:09:38Z"), "lastHeartbeat" : ISODate("2010-12-02T01:09:38Z")},

Page 61: MongoDB: Optimising for Performance, Scale & Analytics

1) myState

rs.status()

Value Meaning0 Starting up (phase 1)1 Primary2 Secondary3 Recovering4 Fatal error5 Starting up (phase 2)6 Unknown state7 Arbiter8 Down

Page 62: MongoDB: Optimising for Performance, Scale & Analytics

2) Optime

rs.status()

www.flickr.com/photos/robbie73/4244846566/

"optimeDate" : ISODate("2010-12-02T01:09:38Z")

Page 63: MongoDB: Optimising for Performance, Scale & Analytics

3) Heartbeat

rs.status()

www.flickr.com/photos/drawblindfaith/3400981091/

"lastHeartbeat" : ISODate("2010-12-02T01:09:38Z")

Page 64: MongoDB: Optimising for Performance, Scale & Analytics

Scaling reads

Page 65: MongoDB: Optimising for Performance, Scale & Analytics

Scaling reads

•Replica slaves

Page 66: MongoDB: Optimising for Performance, Scale & Analytics

Scaling reads

•Replica slaves

•Consistency

Page 67: MongoDB: Optimising for Performance, Scale & Analytics

•Replica slaves

Scaling reads

•Consistency

•w flag / tags

Page 68: MongoDB: Optimising for Performance, Scale & Analytics

WriteConcern

Changed Nov 27 2012

Page 69: MongoDB: Optimising for Performance, Scale & Analytics

• Safe by default

WriteConcern

>>> from pymongo import MongoClient>>> connection = MongoClient()

Page 70: MongoDB: Optimising for Performance, Scale & Analytics

• Safe by default

WriteConcern

>>> from pymongo import MongoClient>>> connection = MongoClient(w=int/str)

Value Meaning

0 Unsafe

1 Primary

2 Primary + x1 secondary

3 Primary + x2 secondaries

Page 71: MongoDB: Optimising for Performance, Scale & Analytics

Tags

{ _id : "someSet", members : [ {_id : 0, host : "A", tags : {"dc": "ny"}}, {_id : 1, host : "B", tags : {"dc": "ny"}}, {_id : 2, host : "C", tags : {"dc": "sf"}}, {_id : 3, host : "D", tags : {"dc": "sf"}}, {_id : 4, host : "E", tags : {"dc": "cloud"}} ] settings : { getLastErrorModes : { veryImportant : {"dc" : 3}, sortOfImportant : {"dc" : 2} } }}> db.foo.insert({x:1})> db.runCommand({getLastError : 1, w : "veryImportant"})

Page 72: MongoDB: Optimising for Performance, Scale & Analytics

{ _id : "someSet", members : [ {_id : 0, host : "A", tags : {"dc": "ny"}}, {_id : 1, host : "B", tags : {"dc": "ny"}}, {_id : 2, host : "C", tags : {"dc": "sf"}}, {_id : 3, host : "D", tags : {"dc": "sf"}}, {_id : 4, host : "E", tags : {"dc": "cloud"}} ] settings : { getLastErrorModes : { veryImportant : {"dc" : 3}, sortOfImportant : {"dc" : 2} } }}> db.foo.insert({x:1})> db.runCommand({getLastError : 1, w : "veryImportant"})

(A or B) + (C or D) + E

Tags

Page 73: MongoDB: Optimising for Performance, Scale & Analytics

{ _id : "someSet", members : [ {_id : 0, host : "A", tags : {"dc": "ny"}}, {_id : 1, host : "B", tags : {"dc": "ny"}}, {_id : 2, host : "C", tags : {"dc": "sf"}}, {_id : 3, host : "D", tags : {"dc": "sf"}}, {_id : 4, host : "E", tags : {"dc": "cloud"}} ] settings : { getLastErrorModes : { veryImportant : {"dc" : 3}, sortOfImportant : {"dc" : 2} } }}> db.foo.insert({x:1})> db.runCommand({getLastError : 1, w : "sortOfImportant"})

(A + C) or (D + E) ...

Tags

Page 74: MongoDB: Optimising for Performance, Scale & Analytics

• J

WriteConcern

• Safe by default

Page 75: MongoDB: Optimising for Performance, Scale & Analytics

• J

• fsync

WriteConcern

• Safe by default

Page 76: MongoDB: Optimising for Performance, Scale & Analytics

Bottlenecks

•EC2

Page 77: MongoDB: Optimising for Performance, Scale & Analytics

Bottlenecks

•EC2

•Local storage

Page 78: MongoDB: Optimising for Performance, Scale & Analytics

Bottlenecks

•EC2

•EBS: RAID10 4-8 volumes

•Local storage

Page 79: MongoDB: Optimising for Performance, Scale & Analytics

Bottlenecks

•EC2

•EBS: RAID10 4-8 volumes

•Local storage

•i/o: rand but not sequential

Page 82: MongoDB: Optimising for Performance, Scale & Analytics

Bottlenecks

•CPU

•Index building

Page 83: MongoDB: Optimising for Performance, Scale & Analytics

Tips: rand()

•_id

Page 84: MongoDB: Optimising for Performance, Scale & Analytics

Tips: rand()

•_id

•Field names

Page 85: MongoDB: Optimising for Performance, Scale & Analytics

Tips: rand()

•_id

•Field names

•Covered indexes

Page 86: MongoDB: Optimising for Performance, Scale & Analytics

Tips: rand()

•_id

•Field names

•Covered indexes

•Collections / databases

Page 87: MongoDB: Optimising for Performance, Scale & Analytics

mongostat

Page 88: MongoDB: Optimising for Performance, Scale & Analytics

Locks/Queues

mongostat

Page 89: MongoDB: Optimising for Performance, Scale & Analytics

Diagnostics

mongostat

Page 90: MongoDB: Optimising for Performance, Scale & Analytics

Current operations

www.flickr.com/photos/jeffhester/2784666811/

db.currentOp();{! ! ! "opid" : "shard1:299939199",! ! ! "active" : true,! ! ! "lockType" : "write",! ! ! "waitingForLock" : false,! ! ! "secs_running" : 15419,! ! ! "op" : "remove",! ! ! "ns" : "sd.metrics",! ! ! "query" : {! ! ! ! "accId" : 1391,! ! ! ! "tA" : {! ! ! ! ! "$lte" : ISODate("2010-11-24T19:53:00Z")! ! ! ! }! ! ! },! ! ! "client" : "10.121.12.228:44426",! ! ! "desc" : "conn"! ! },

Page 91: MongoDB: Optimising for Performance, Scale & Analytics

Monitoring tools

Run yourself

Ganglia

Page 92: MongoDB: Optimising for Performance, Scale & Analytics

Monitoring tools

Server Density

Page 93: MongoDB: Optimising for Performance, Scale & Analytics

Picture is unrelated! Mmm, ice cream.

Fast out of the box?

• Fast network

• Working set in RAM

Page 94: MongoDB: Optimising for Performance, Scale & Analytics

Picture is unrelated! Mmm, ice cream.

Fast out of the box?

• Fast network

• Working set in RAM

• bit.ly/benchrun

Page 95: MongoDB: Optimising for Performance, Scale & Analytics

Woop Japan!

www.serverdensity.com/mdb

Page 96: MongoDB: Optimising for Performance, Scale & Analytics

David Mytton

[email protected]

@davidmytton

Woop Japan!

www.serverdensity.com