SlideShare a Scribd company logo
Rick Copeland @rick446
Arborian Consulting, LLC
   Now a consultant, but formerly…

     Software engineer at SourceForge, early adopter of
     MongoDB (version 0.8)

     Wrote the SQLAlchemy book (I love SQL when it’s
     used well)

     Mainly write Python now, but have done C++, C#,
     Java, Javascript, VHDL, Verilog, …
   You can do it with an RDBMS as long as you…
     Don’t use joins
     Don’t use transactions
     Use read-only slaves
     Use memcached
     Denormalize your data
     Use custom sharding/partitioning
     Do a lot of vertical scaling
      ▪ (we’re going to need a bigger box)
+1
Year
Scaling with MongoDB
   Use documents to improve locality

   Optimize your indexes

   Be aware of your working set

   Scaling your disks

   Replication for fault-tolerance and read scaling

   Sharding for read and write scaling
Relational (SQL)   MongoDB
Database           Database              Dynamic
                                          Typing
Table              Collection            B-tree
                                     (range-based)
Index              Index
Row                Document
                                          Think JSON
Column             Field
                                 Primitive types +
                                arrays, documents
{
    title: "Slides for Scaling with MongoDB",
    author: "Rick Copeland",
    date: ISODate("20012-02-29T19:30:00Z"),
    text: "My slides are available on speakerdeck.com",
    comments: [
      { author: "anonymous",
         date: ISODate("20012-02-29T19:30:01Z"),
        text: "Fristpsot!" },
      { author: "mark”,
        date: ISODate("20012-02-29T19:45:23Z"),
        text: "Nice slides" } ] }
                                                 Embed comment data in
                                                  blog post document
Seek = 5+ ms   Read = really really fast
Post
                Comment
Author
Post

Author

Comment
Comment
 Comment
 Comment
  Comment
Find where x equals 7

1   2    3   4   5   6   7




        Looked at 7 objects
Find where x
equals 7         4



        2                6



    1        3       5       7




            Looked at 3 objects
Entire index
must fit in
RAM
Only small
 portion in
      RAM
   Working set =
     sizeof(frequently used data)
     + sizeof(frequently used indexes)

   Right-aligned indexes reduce working set size

   Working set should fit in available RAM for best
    performance

   Page faults are the biggest cause of performance
    loss in MongoDB
>db.foo.stats()
                                      Data Size
{
  "ns" : "test.foo",
  "count" : 1338330,
  "size" : 46915928,                                 Average doc size
  "avgObjSize" : 35.05557523181876,
  "storageSize" : 86092032,
  "numExtents" : 12,
  "nindexes" : 2,                        Size on disk (or RAM!)
  "lastExtentSize" : 20872960,
  "paddingFactor" : 1,
  "flags" : 0,                                    Size of all indexes
  "totalIndexSize" : 99860480,
  "indexSizes" : {
    "_id_" : 55877632,
    "x_1" : 43982848},
  "ok" : 1                                        Size of each index
}
~200 seeks / second
~200 seeks / second   ~200 seeks / second   ~200 seeks / second


   Faster, but less reliable
~400 seeks / second   ~400 seeks / second   ~400 seeks / second


   Faster and more reliable ($$$ though)
   Old and busted  master/slave replication

   The new hotness  replica sets with automatic
    failover
                 Read / Write       Primary




                       Read       Secondary




                       Read       Secondary
   Primary handles all
    writes

   Application optionally
    sends reads to slaves

   Heartbeat manages
    automatic failover
   Special collection (the oplog) records operations
    idempotently

   Secondaries read from primary oplog and replay
    operations locally

   Space is preallocated and fixed for the oplog
{
"ts" : Timestamp(1317653790000, 2),
                                     Insert
"h" : -6022751846629753359,
"op" : "i",
"ns" : "confoo.People",                  Collection name
"o" : {
"_id" : ObjectId("4e89cd1e0364241932324269"),
"first" : "Rick",
"last" : "Copeland”
   }
}                                                   Object to insert
   Use heartbeat signal to detect failure

   When primary can’t be reached, elect a new one

   Replica that’s the most up-to-date is chosen

   If there is skew, changes not on new primary are
    saved to a .bson file for manual reconciliation

   Application can require data to be replicated to a
    majority to ensure this doesn’t happen
   Priority
     Slower nodes with lower priority
     Backup or read-only nodes to never be primary

   slaveDelay
     Fat-finger protection

   Data center awareness and tagging
     Application can ensure complex replication
     guarantees
   Reads scale nicely
     As long as the working set fits in RAM
     … and you don’t mind eventual consistency


   Sharding to the rescue!
     Automatically partitioned data sets
     Scale writes and reads
     Automatic load balancing between the shards
Configuration
             MongoS        MongoS
                                           Config 1    Config 2             Config 3




Shard 1               Shard 2       Shard 3               Shard 4
 0..10                 10..20        20..30                30..40


   Primary               Primary       Primary                    Primary




 Secondary             Secondary     Secondary              Secondary




 Secondary             Secondary     Secondary              Secondary
   Sharding is per-collection and range-based

   The highest-impact choice (and hardest to
    change decision) you make is the shard key
     Random keys: good for writes, bad for reads
     Right-aligned index: bad for writes
     Small # of discrete keys: very bad
     Ideal: balance writes, make reads routable by mongos
     Optimal shard key selection is hard
Primary Data Center               Secondary Data Center


 Shard 1           Shard 1                    Shard 1
Priority 1        Priority 1                 Priority 0



 Shard 2           Shard 2                    Shard 2
Priority 1        Priority 1                 Priority 0



 Shard 3           Shard 3                    Shard 3
                             RS3
Priority 1        Priority 1                 Priority 0



Config 1          Config 2                   Config 3
   Writes and reads both scale (with good choice of
    shard key)

   Reads scale while remaining strongly consistent

   Partitioning ensures you get more usable RAM

   Pitfall: don’t wait too long to add capacity
Rick Copeland @rick446
Arborian Consulting, LLC

More Related Content

PPTX
MongoDB at Scale
KEY
MongoDB Best Practices in AWS
PPTX
Ops Jumpstart: MongoDB Administration 101
PPTX
Scaling MongoDB
PPTX
Webinar: Performance Tuning + Optimization
PDF
Mongodb - Scaling write performance
PPTX
Webinar: Scaling MongoDB
PPTX
MongoDB Capacity Planning
MongoDB at Scale
MongoDB Best Practices in AWS
Ops Jumpstart: MongoDB Administration 101
Scaling MongoDB
Webinar: Performance Tuning + Optimization
Mongodb - Scaling write performance
Webinar: Scaling MongoDB
MongoDB Capacity Planning

What's hot (20)

PPT
MongoDB Pros and Cons
PDF
MongoDB Capacity Planning
PPTX
Running MongoDB 3.0 on AWS
PPT
Migrating to MongoDB: Best Practices
PPTX
Sharding Methods for MongoDB
PPTX
3 scenarios when to use MongoDB!
PPTX
Webinar: Deploying MongoDB to Production in Data Centers and the Cloud
PPTX
Benchmarking Top NoSQL Databases: Apache Cassandra, Apache HBase and MongoDB
PPTX
Introduction to Sharding
PDF
A New MongoDB Sharding Architecture for Higher Availability and Better Resour...
PPTX
MongoDB Deployment Checklist
PPT
Everything You Need to Know About Sharding
KEY
Strengths and Weaknesses of MongoDB
PDF
Evolution of MonogDB Sharding and Its Best Practices - Ranjith A - Mydbops Team
PDF
Efficient in situ processing of various storage types on apache tajo
PPTX
Mongo db
PPTX
Capacity Planning
PPTX
Hardware Provisioning for MongoDB
PDF
Challenges with MongoDB
PDF
Sharding
MongoDB Pros and Cons
MongoDB Capacity Planning
Running MongoDB 3.0 on AWS
Migrating to MongoDB: Best Practices
Sharding Methods for MongoDB
3 scenarios when to use MongoDB!
Webinar: Deploying MongoDB to Production in Data Centers and the Cloud
Benchmarking Top NoSQL Databases: Apache Cassandra, Apache HBase and MongoDB
Introduction to Sharding
A New MongoDB Sharding Architecture for Higher Availability and Better Resour...
MongoDB Deployment Checklist
Everything You Need to Know About Sharding
Strengths and Weaknesses of MongoDB
Evolution of MonogDB Sharding and Its Best Practices - Ranjith A - Mydbops Team
Efficient in situ processing of various storage types on apache tajo
Mongo db
Capacity Planning
Hardware Provisioning for MongoDB
Challenges with MongoDB
Sharding
Ad

Viewers also liked (11)

PPTX
Custom Courseware Development
PDF
2017 Volvo S60 Brochure | Orange County Volvo
PPT
Containerization and palletization
DOCX
How to configure static nat on cisco routers
PPT
Assessment for learning meeting april 29th 2014
PPTX
Global IT Consulting Market
PDF
Best practices multichannel-integration
DOCX
Dantes Inferno Study Guide
PDF
Finding the best Radio Network Planning and Radio Network Optimization software
PPT
Temperature Transducer
 
PPTX
Camels approach
Custom Courseware Development
2017 Volvo S60 Brochure | Orange County Volvo
Containerization and palletization
How to configure static nat on cisco routers
Assessment for learning meeting april 29th 2014
Global IT Consulting Market
Best practices multichannel-integration
Dantes Inferno Study Guide
Finding the best Radio Network Planning and Radio Network Optimization software
Temperature Transducer
 
Camels approach
Ad

Similar to Scaling with MongoDB (20)

PPTX
Scaling with MongoDB
PDF
Optimizing MongoDB: Lessons Learned at Localytics
PPTX
Python mongo db-training-europython-2011
PPTX
MongoDB 3.0
PPT
MongoDB Knowledge Shareing
PPT
Intro to mongo db
KEY
2012 phoenix mug
PPTX
MongoDB Auto-Sharding at Mongo Seattle
PPTX
Webinar: Understanding Storage for Performance and Data Safety
PPTX
MongoDB for Time Series Data Part 3: Sharding
PDF
MongoDB is the MashupDB
PPTX
DBVersity MongoDB Online Training Presentations
PPTX
MongoDB for Time Series Data: Sharding
PDF
Mongo db japan
PPTX
2014 05-07-fr - add dev series - session 6 - deploying your application-2
PDF
Cassandra for Sysadmins
PDF
MongoDB: Optimising for Performance, Scale & Analytics
PPTX
Deployment Preparedness
PDF
OSDC 2012 | Scaling with MongoDB by Ross Lawley
PPT
Sedna XML Database: Memory Management
Scaling with MongoDB
Optimizing MongoDB: Lessons Learned at Localytics
Python mongo db-training-europython-2011
MongoDB 3.0
MongoDB Knowledge Shareing
Intro to mongo db
2012 phoenix mug
MongoDB Auto-Sharding at Mongo Seattle
Webinar: Understanding Storage for Performance and Data Safety
MongoDB for Time Series Data Part 3: Sharding
MongoDB is the MashupDB
DBVersity MongoDB Online Training Presentations
MongoDB for Time Series Data: Sharding
Mongo db japan
2014 05-07-fr - add dev series - session 6 - deploying your application-2
Cassandra for Sysadmins
MongoDB: Optimising for Performance, Scale & Analytics
Deployment Preparedness
OSDC 2012 | Scaling with MongoDB by Ross Lawley
Sedna XML Database: Memory Management

More from Rick Copeland (12)

PDF
Python Functions (PyAtl Beginners Night)
KEY
Schema Design at Scale
KEY
Building Your First MongoDB Application
PPTX
Rapid and Scalable Development with MongoDB, PyMongo, and Ming
PPTX
Chef on MongoDB and Pyramid
PDF
Chef on Python and MongoDB
PPT
Real-Time Python Web: Gevent and Socket.io
PPT
Rapid and Scalable Development with MongoDB, PyMongo, and Ming
PPT
Realtime Analytics Using MongoDB, Python, Gevent, and ZeroMQ
PPT
Rapid, Scalable Web Development with MongoDB, Ming, and Python
PPT
Allura - an Open Source MongoDB Based Document Oriented SourceForge
PPT
MongoATL: How Sourceforge is Using MongoDB
Python Functions (PyAtl Beginners Night)
Schema Design at Scale
Building Your First MongoDB Application
Rapid and Scalable Development with MongoDB, PyMongo, and Ming
Chef on MongoDB and Pyramid
Chef on Python and MongoDB
Real-Time Python Web: Gevent and Socket.io
Rapid and Scalable Development with MongoDB, PyMongo, and Ming
Realtime Analytics Using MongoDB, Python, Gevent, and ZeroMQ
Rapid, Scalable Web Development with MongoDB, Ming, and Python
Allura - an Open Source MongoDB Based Document Oriented SourceForge
MongoATL: How Sourceforge is Using MongoDB

Recently uploaded (20)

PPT
Teaching material agriculture food technology
PDF
Getting Started with Data Integration: FME Form 101
PDF
Encapsulation theory and applications.pdf
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
Tartificialntelligence_presentation.pptx
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
1. Introduction to Computer Programming.pptx
PDF
Empathic Computing: Creating Shared Understanding
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Electronic commerce courselecture one. Pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
NewMind AI Weekly Chronicles - August'25-Week II
Teaching material agriculture food technology
Getting Started with Data Integration: FME Form 101
Encapsulation theory and applications.pdf
Building Integrated photovoltaic BIPV_UPV.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Tartificialntelligence_presentation.pptx
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Group 1 Presentation -Planning and Decision Making .pptx
Programs and apps: productivity, graphics, security and other tools
1. Introduction to Computer Programming.pptx
Empathic Computing: Creating Shared Understanding
Spectral efficient network and resource selection model in 5G networks
Unlocking AI with Model Context Protocol (MCP)
Electronic commerce courselecture one. Pdf
Big Data Technologies - Introduction.pptx
Encapsulation_ Review paper, used for researhc scholars
Mobile App Security Testing_ A Comprehensive Guide.pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
NewMind AI Weekly Chronicles - August'25-Week II

Scaling with MongoDB

  • 2. Now a consultant, but formerly…  Software engineer at SourceForge, early adopter of MongoDB (version 0.8)  Wrote the SQLAlchemy book (I love SQL when it’s used well)  Mainly write Python now, but have done C++, C#, Java, Javascript, VHDL, Verilog, …
  • 3. You can do it with an RDBMS as long as you…  Don’t use joins  Don’t use transactions  Use read-only slaves  Use memcached  Denormalize your data  Use custom sharding/partitioning  Do a lot of vertical scaling ▪ (we’re going to need a bigger box)
  • 6. Use documents to improve locality  Optimize your indexes  Be aware of your working set  Scaling your disks  Replication for fault-tolerance and read scaling  Sharding for read and write scaling
  • 7. Relational (SQL) MongoDB Database Database Dynamic Typing Table Collection B-tree (range-based) Index Index Row Document Think JSON Column Field Primitive types + arrays, documents
  • 8. { title: "Slides for Scaling with MongoDB", author: "Rick Copeland", date: ISODate("20012-02-29T19:30:00Z"), text: "My slides are available on speakerdeck.com", comments: [ { author: "anonymous", date: ISODate("20012-02-29T19:30:01Z"), text: "Fristpsot!" }, { author: "mark”, date: ISODate("20012-02-29T19:45:23Z"), text: "Nice slides" } ] } Embed comment data in blog post document
  • 9. Seek = 5+ ms Read = really really fast
  • 10. Post Comment Author
  • 12. Find where x equals 7 1 2 3 4 5 6 7 Looked at 7 objects
  • 13. Find where x equals 7 4 2 6 1 3 5 7 Looked at 3 objects
  • 16. Working set =  sizeof(frequently used data)  + sizeof(frequently used indexes)  Right-aligned indexes reduce working set size  Working set should fit in available RAM for best performance  Page faults are the biggest cause of performance loss in MongoDB
  • 17. >db.foo.stats() Data Size { "ns" : "test.foo", "count" : 1338330, "size" : 46915928, Average doc size "avgObjSize" : 35.05557523181876, "storageSize" : 86092032, "numExtents" : 12, "nindexes" : 2, Size on disk (or RAM!) "lastExtentSize" : 20872960, "paddingFactor" : 1, "flags" : 0, Size of all indexes "totalIndexSize" : 99860480, "indexSizes" : { "_id_" : 55877632, "x_1" : 43982848}, "ok" : 1 Size of each index }
  • 18. ~200 seeks / second
  • 19. ~200 seeks / second ~200 seeks / second ~200 seeks / second  Faster, but less reliable
  • 20. ~400 seeks / second ~400 seeks / second ~400 seeks / second  Faster and more reliable ($$$ though)
  • 21. Old and busted  master/slave replication  The new hotness  replica sets with automatic failover Read / Write Primary Read Secondary Read Secondary
  • 22. Primary handles all writes  Application optionally sends reads to slaves  Heartbeat manages automatic failover
  • 23. Special collection (the oplog) records operations idempotently  Secondaries read from primary oplog and replay operations locally  Space is preallocated and fixed for the oplog
  • 24. { "ts" : Timestamp(1317653790000, 2), Insert "h" : -6022751846629753359, "op" : "i", "ns" : "confoo.People", Collection name "o" : { "_id" : ObjectId("4e89cd1e0364241932324269"), "first" : "Rick", "last" : "Copeland” } } Object to insert
  • 25. Use heartbeat signal to detect failure  When primary can’t be reached, elect a new one  Replica that’s the most up-to-date is chosen  If there is skew, changes not on new primary are saved to a .bson file for manual reconciliation  Application can require data to be replicated to a majority to ensure this doesn’t happen
  • 26. Priority  Slower nodes with lower priority  Backup or read-only nodes to never be primary  slaveDelay  Fat-finger protection  Data center awareness and tagging  Application can ensure complex replication guarantees
  • 27. Reads scale nicely  As long as the working set fits in RAM  … and you don’t mind eventual consistency  Sharding to the rescue!  Automatically partitioned data sets  Scale writes and reads  Automatic load balancing between the shards
  • 28. Configuration MongoS MongoS Config 1 Config 2 Config 3 Shard 1 Shard 2 Shard 3 Shard 4 0..10 10..20 20..30 30..40 Primary Primary Primary Primary Secondary Secondary Secondary Secondary Secondary Secondary Secondary Secondary
  • 29. Sharding is per-collection and range-based  The highest-impact choice (and hardest to change decision) you make is the shard key  Random keys: good for writes, bad for reads  Right-aligned index: bad for writes  Small # of discrete keys: very bad  Ideal: balance writes, make reads routable by mongos  Optimal shard key selection is hard
  • 30. Primary Data Center Secondary Data Center Shard 1 Shard 1 Shard 1 Priority 1 Priority 1 Priority 0 Shard 2 Shard 2 Shard 2 Priority 1 Priority 1 Priority 0 Shard 3 Shard 3 Shard 3 RS3 Priority 1 Priority 1 Priority 0 Config 1 Config 2 Config 3
  • 31. Writes and reads both scale (with good choice of shard key)  Reads scale while remaining strongly consistent  Partitioning ensures you get more usable RAM  Pitfall: don’t wait too long to add capacity

Editor's Notes

  • #5: You’d like to just ‘add capacity’ but you end up having to buy a bigger serverBuild your own infrastructure and you pay more for less as you scaleThe cloud can help with this, but only up to a point; what happens when you’re using the largest instance? Time to rearchitect.
  • #6: There are a lot of features that make RDBMSs attractiveBut as we scale we need to turn off a lot of them to get performance increasesWe end up with something that scales, but it’s hard to use
  • #28: RAM functions as a cacheReplication ends up caching documents in multiple locationsSharding makes sure documents only have one ‘home’
  • #29: A single shard is a replica setMongoS is a router that determines where reads and writes goDocuments is ‘chunked’ into ranges. Chunks can be split and migrated to other servers based on load.Configuration servers persist location of particular shard key ranges Cluster is alive when one or more config servers are down, but there can be no migration