Top Banner
Optimising for performance, scale, analytics
96

MongoDB: Optimising for Performance, Scale & Analytics

Jun 27, 2015

Download

Technology

Server Density

MongoDB is easy to download and run locally but requires some thought and further understanding when deploying to production. At scale, schema design, indexes and query patterns really matter. So does data structure on disk, sharding, replication and data centre awareness. This talk will examine these factors in the context of analytics, and more generally, to help you optimise MongoDB for any scale.

Presented at MongoDB Days London 2013 by David Mytton.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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