SlideShare a Scribd company logo
1 of 39
@comerford #MongoDBLondon 
Tales from the Field 
Adam Comerford 
Senior Solutions Engineer, MongoDB
Or: 
● Cautionary Tales 
● Don’t solve the wrong problems 
● Bad schemas hurt ops too 
● etc.
The Stories 
● Are (mostly) true, and (mostly) actually happened 
● Names have been changed to protect the (mostly) 
innocent 
● No animals were harmed during the making of this 
presentation 
○ Perhaps a few DBAs and engineers had light 
emotional scarring 
● Some of the people that inspired the stories may well be 
here today at MongoDB London
Story #1: Bill the Bulk Updater 
● Bill built a system that tracked status information for 
entities in his business domain 
● State changes for this system happened in batches: 
o Sometimes 10% of entities get updated 
o Sometimes 100% get updated 
● Essentially, lots of random updates
Bill’s Initial Architecture 
Application / mongos 
mongod
What about production? 
● Bill’s system was a success! 
● The product grew, and the number of entities increased 
by a factor of 5 
● Not a problem - add more shards!
Bill’s Eventual Architecture 
Application / mongos 
mongod 
…16 more shards…
Linear Scaling 
● Bill’s cluster scaled linearly, as intended 
● But, Bill’s TCO scaled linearly too 
● More growth was forecast
Large Cluster, Large Expense 
● Entity growth predicted at 10x 
● Rough calculations called for ~200 shards 
● Linear scaling of cost
What problem did Bill overlook? 
● Horizontal Scaling = Linear Scaling 
● Not necessarily the most efficient option
The “Golden Hammer” Tendency
What did we recommend? 
● Scale the random I/O vertically, not horizontally 
● Sometimes a combination of vertical & horizontal 
scaling is the best approach
Bill’s Final Architecture 
Application / mongos 
mongod SSD
Story #2: Gary the Game Developer 
● Gary was launching a AAA game title 
● MongoDB would provide the backend for the player’s 
online experience 
● Launched worldwide, same day, midnight launches
Complex Cloud Deployment 
● Deploying in the cloud, but very beefy instances 
● 32 vCPU, 244GiB RAM, 8 x SSD 
● Single mongod unable to stress instances 
● Hence “Micro-Sharding” required to get most out of 
instances
Micro-What? 
Micro-Sharding is the practice of deploying multiple relatively small (hence “micro”) shards on 
large hosts to better take advantage of available resources which are difficult to utilise with a 
single mongod instance. 
HOST1 
Primary1 
Primary2 
Primary3 
Secondary4 
Secondary5 
Secondary6 
Secondary7 
Secondary8 
Secondary9 
HOST2 
Secondary1 
Secondary2 
Secondary3 
Primary4 
Primary5 
Primary6 
Secondary7 
Secondary8 
Secondary9 
HOST3 
Secondary1 
Secondary2 
Secondary3 
Secondary4 
Secondary5 
Secondary6 
Primary7 
Primary8 
Primary9 
For example, 9 shards evenly distributed across 3 hosts, as below:
Extensive Pre-Production Testing 
● Load tested 
● Failover and Backups tested 
● Procedures, architecture reviewed 
● Basically, lots of testing/reviewing was done (all 
passed)
However……. 
The production layout of mongod processes actually was 8 shards on 3 host, reproduced below. 
This layout caused a problem in production. But, it was tested and had no issues, right? 
Almost: the backup process was tested, and load was tested, but not together….. 
HOST1 
Primary1 
Primary2 
Primary3 
Secondary4 
Secondary5 
Secondary6 
Secondary7 
Secondary8 
HOST2 
Secondary1 
Secondary2 
Secondary3 
Primary4 
Primary5 
Primary6 
Secondary7 
Secondary8 
HOST3 
Secondary1 
Secondary2 
Secondary3 
Secondary4 
Secondary5 
Secondary6 
Primary7 
Primary8
The Backup Process 
HOST1 
Primary1 
Primary2 
Primary3 
Secondary4 
Secondary5 
Secondary6 
Secondary7 
Secondary8 
HOST2 
Secondary1 
Secondary2 
Secondary3 
Primary4 
Primary5 
Primary6 
Secondary7 
Secondary8 
HOST3 
Secondary1 
Secondary2 
Secondary3 
Secondary4 
Secondary5 
Secondary6 
Primary7 
Primary8 
Backups took place on a single host (host 2 below). 
The databases were locked, then an LVM snapshot was taken, the lock was released. 
This was almost instantaneous in pre-prod testing (no load), not so in production.
Backup Under Load 
Once load was introduced to the equation, the snapshots were no longer instantaneous. This 
essentially caused the primaries to become unresponsive but not fail over on the host taking the 
backup 
Which eventually caused a cascading failure, bringing the whole cluster down 
HOST1 
Primary1 
Primary2 
Primary3 
Secondary4 
Secondary5 
Secondary6 
Secondary7 
Secondary8 
HOST2 
Secondary1 
Secondary2 
Secondary3 
Primary4 
Primary5 
Primary6 
Secondary7 
Secondary8 
HOST3 
Secondary1 
Secondary2 
Secondary3 
Secondary4 
Secondary5 
Secondary6 
Primary7 
Primary8
What did we recommend? 
HOST1 
Primary1 
Primary2 
Primary3 
Primary4 
Secondary5 
Secondary6 
Secondary7 
Secondary8 
HOST2 
Secondary1 
Secondary2 
Secondary3 
Secondary4 
Secondary5 
Secondary6 
Secondary7 
Secondary8 
HOST3 
Secondary1 
Secondary2 
Secondary3 
Secondary4 
Primary5 
Primary6 
Primary7 
Primary8 
New process layout proposed, as below, backups still taken on Host2. 
The database lock was not necessary because LVM snapshot gives point in time, removed. 
Also put some limits on max connections, just in case
Summary 
No one single cause: 
● Small issue with deployment layout 
● Small error with backup process 
● Lack of integration with testing plan 
● Relatively new system 
● Some bad luck 
Led to: 
● Large outage, slow cautious recovery
Story #3: Rita the Retailer 
Rita the Retailer had an ecommerce site, selling 
diverse goods in 20+ countries.
Product Catalog: Original 
Schema 
{ 
_id: 375 
en_US : { name : ..., description : ..., <etc...> }, 
en_GB : { name : ..., description : ..., <etc...> }, 
fr_FR : { name : ..., description : ..., <etc...> }, 
de_DE : ..., 
de_CH : ..., 
<... and so on for other locales... > 
}
What’s good about this schema? 
● Each document contains all the data about a given 
product, across all languages/locales 
● Very efficient way to retrieve the English, French, 
German, etc. translations of a single product’s 
information in one query
However…… 
That is not how the product data is 
actually used 
(except perhaps by translation staff)
Dominant Query Pattern 
db.catalog.find( { _id : 375 } , { en_US : true } ); 
db.catalog.find( { _id : 375 } , { fr_FR : true } ); 
db.catalog.find( { _id : 375 } , { de_DE : true } ); 
... and so forth for other locales ...
Which means…… 
The Product Catalog’s data model 
did not fit the way the data was 
accessed.
Consequences 
● Each document contained ~20x more data than any 
common use case needed 
● MongoDB lets you request just a subset of a 
document’s contents (using a projection), but… 
o Typically the whole document will get loaded into 
RAM to serve the request 
● There are other overheads for reading from disk into 
memory (like readahead)
Therefore….. 
Less than 5% of data loaded into RAM from disk is 
actually required at the time - highly inefficient
Visualising the problem 
{ _id: 42, 
en_US : { name : ..., description : ..., <etc...> }, 
en_GB : { name : ..., description : ..., <etc...> }, 
fr_FR : { name : ..., description : ..., <etc...> }, 
de_DE : ..., 
de_CH : ..., 
<... and so on for other locales... > } 
<READAHEAD OVERHEAD> 
{ _id: 709, 
en_US : { name : ..., description : ..., <etc...> }, 
en_GB : { name : ..., description : ..., <etc...> }, 
fr_FR : { name : ..., description : ..., <etc...> }, 
de_DE : ..., 
de_CH : ..., 
<... and so on for other locales... > } 
<READAHEAD OVERHEAD> 
{ _id: 3600, 
en_US : { name : ..., description : ..., <etc...> }, 
en_GB : { name : ..., description : ..., <etc...> }, 
fr_FR : { name : ..., description : ..., <etc...> }, 
de_DE : ..., 
de_CH : ..., 
<... and so on for other locales... > } 
- Data in RED are loaded into RAM and used. 
- Data in BLUE take up memory but are not required. 
- Readahead padding in GREEN makes things even 
more inefficient
More RAM? It’s not that simple
What did we recommend? 
● Design for your use case, your dominant query pattern 
o In this case: 99.99% of queries want the product 
data for exactly one locale at a time 
o Hence, alter schema appropriately 
● Eliminate inefficiencies on the system 
o Make reading from disk less wasteful, maximise I/O 
capabilities: reduce readahead settings
Schema: Before & After 
Schema After (document per-locale): 
{ _id: "375-en_US", 
name : ..., description : ..., <etc...> } 
{ _id: "375-en_GB", 
name : ..., description : ..., <etc...> } 
{ _id: "375-fr_FR", 
name : ..., description : ..., <etc...> } 
... and so on for other locales ... 
Query After: 
db.catalog.find( { _id : "375-en_US" }; 
db.catalog.find( { _id : "375-fr_FR" }; 
db.catalog.find( { _id : "375-de_DE" }; 
Schema Before (embedded): 
{ _id: 375 
en_US : { name : ..., description : ..., 
<etc...> }, 
en_GB : { name : ..., description : ..., 
<etc...> }, 
fr_FR : { name : ..., description : ..., 
<etc...> }, 
<... and so on for other locales... > 
} 
Query Before: 
db.catalog.find( { _id : 375 } , { en_US : true } ); 
db.catalog.find( { _id : 375 } , { fr_FR : true } ); 
db.catalog.find( { _id : 375 } , { de_DE : true } );
Consequences of Changes 
● Queries induced minimal overhead 
● Greater than 20x distinct products fit in memory at once 
● Disk I/O utilization reduced 
● UI latency decreased 
● Happier Customers 
● Profit (well, we hope)
Conclusions 
● MongoDB can be used to for a wide range of 
(sometimes pretty cool) use cases 
● A small problem can seem much bigger 
when it happens in production 
● We are here to help - if you hit a problem, it’s 
likely you are not the first to hit it 
● We can provide a fresh perspective, advice 
based on experience to prevent and solve 
issues
@comerford #MongoDBLondon 
Questions? 
Adam Comerford 
Senior Solutions Engineer, MongoDB
Further Reading for 
Retail/Catalogs 
● Antoine Girbal (my team mate) has produced a full reference architecture 
for this type of application 
o Blog part 1: http://tmblr.co/ZiOADx1RRsAWe 
o Blog part 2: http://tmblr.co/ZiOADx1LfVmfm 
● Detailed presentations and talks from MongoDB World: 
o http://www.mongodb.com/presentations/retail-reference-architecture-part- 
1-flexible-searchable-low-latency-product-catalog 
o http://www.mongodb.com/presentations/retail-reference-architecture-part- 
2-real-time-geo-distributed-inventory 
o http://www.mongodb.com/presentations/retail-reference-architecture-part- 
3-scalable-insight-component-providing-user-history

More Related Content

What's hot

MongoDB Memory Management Demystified
MongoDB Memory Management DemystifiedMongoDB Memory Management Demystified
MongoDB Memory Management DemystifiedMongoDB
 
Geek Sync | Why is the Same Query Sometimes Slow?
Geek Sync | Why is the Same Query Sometimes Slow?Geek Sync | Why is the Same Query Sometimes Slow?
Geek Sync | Why is the Same Query Sometimes Slow?IDERA Software
 
MongoDB memory management demystified
MongoDB memory management demystifiedMongoDB memory management demystified
MongoDB memory management demystifiedAlon Horev
 
An introduction to column store indexes and batch mode
An introduction to column store indexes and batch modeAn introduction to column store indexes and batch mode
An introduction to column store indexes and batch modeChris Adkin
 
Harrison fisk masteringinnodb-diagnostics
Harrison fisk masteringinnodb-diagnosticsHarrison fisk masteringinnodb-diagnostics
Harrison fisk masteringinnodb-diagnosticsguest8212a5
 
Linux Kernel Extension for Databases / Александр Крижановский (Tempesta Techn...
Linux Kernel Extension for Databases / Александр Крижановский (Tempesta Techn...Linux Kernel Extension for Databases / Александр Крижановский (Tempesta Techn...
Linux Kernel Extension for Databases / Александр Крижановский (Tempesta Techn...Ontico
 
Zero to 1 Billion+ Records: A True Story of Learning & Scaling GameChanger
Zero to 1 Billion+ Records: A True Story of Learning & Scaling GameChangerZero to 1 Billion+ Records: A True Story of Learning & Scaling GameChanger
Zero to 1 Billion+ Records: A True Story of Learning & Scaling GameChangerMongoDB
 
Autovacuum, explained for engineers, new improved version PGConf.eu 2015 Vienna
Autovacuum, explained for engineers, new improved version PGConf.eu 2015 ViennaAutovacuum, explained for engineers, new improved version PGConf.eu 2015 Vienna
Autovacuum, explained for engineers, new improved version PGConf.eu 2015 ViennaPostgreSQL-Consulting
 
Super scaling singleton inserts
Super scaling singleton insertsSuper scaling singleton inserts
Super scaling singleton insertsChris Adkin
 
Webinar - Approaching 1 billion documents with MongoDB
Webinar - Approaching 1 billion documents with MongoDBWebinar - Approaching 1 billion documents with MongoDB
Webinar - Approaching 1 billion documents with MongoDBBoxed Ice
 
Coding for multiple cores
Coding for multiple coresCoding for multiple cores
Coding for multiple coresLee Hanxue
 
MongoUK - Approaching 1 billion documents with MongoDB1 Billion Documents
MongoUK - Approaching 1 billion documents with MongoDB1 Billion DocumentsMongoUK - Approaching 1 billion documents with MongoDB1 Billion Documents
MongoUK - Approaching 1 billion documents with MongoDB1 Billion DocumentsBoxed Ice
 
Lockless Programming GDC 09
Lockless Programming GDC 09Lockless Programming GDC 09
Lockless Programming GDC 09Lee Hanxue
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Alexey Lesovsky
 
Advanced Postgres Monitoring
Advanced Postgres MonitoringAdvanced Postgres Monitoring
Advanced Postgres MonitoringDenish Patel
 
Cassandra Community Webinar | Data Model on Fire
Cassandra Community Webinar | Data Model on FireCassandra Community Webinar | Data Model on Fire
Cassandra Community Webinar | Data Model on FireDataStax
 
Out of the box replication in postgres 9.4
Out of the box replication in postgres 9.4Out of the box replication in postgres 9.4
Out of the box replication in postgres 9.4Denish Patel
 

What's hot (20)

MongoDB Memory Management Demystified
MongoDB Memory Management DemystifiedMongoDB Memory Management Demystified
MongoDB Memory Management Demystified
 
Geek Sync | Why is the Same Query Sometimes Slow?
Geek Sync | Why is the Same Query Sometimes Slow?Geek Sync | Why is the Same Query Sometimes Slow?
Geek Sync | Why is the Same Query Sometimes Slow?
 
MongoDB memory management demystified
MongoDB memory management demystifiedMongoDB memory management demystified
MongoDB memory management demystified
 
An introduction to column store indexes and batch mode
An introduction to column store indexes and batch modeAn introduction to column store indexes and batch mode
An introduction to column store indexes and batch mode
 
7 Ways To Crash Postgres
7 Ways To Crash Postgres7 Ways To Crash Postgres
7 Ways To Crash Postgres
 
Harrison fisk masteringinnodb-diagnostics
Harrison fisk masteringinnodb-diagnosticsHarrison fisk masteringinnodb-diagnostics
Harrison fisk masteringinnodb-diagnostics
 
Linux Kernel Extension for Databases / Александр Крижановский (Tempesta Techn...
Linux Kernel Extension for Databases / Александр Крижановский (Tempesta Techn...Linux Kernel Extension for Databases / Александр Крижановский (Tempesta Techn...
Linux Kernel Extension for Databases / Александр Крижановский (Tempesta Techn...
 
Zero to 1 Billion+ Records: A True Story of Learning & Scaling GameChanger
Zero to 1 Billion+ Records: A True Story of Learning & Scaling GameChangerZero to 1 Billion+ Records: A True Story of Learning & Scaling GameChanger
Zero to 1 Billion+ Records: A True Story of Learning & Scaling GameChanger
 
Fail over fail_back
Fail over fail_backFail over fail_back
Fail over fail_back
 
Autovacuum, explained for engineers, new improved version PGConf.eu 2015 Vienna
Autovacuum, explained for engineers, new improved version PGConf.eu 2015 ViennaAutovacuum, explained for engineers, new improved version PGConf.eu 2015 Vienna
Autovacuum, explained for engineers, new improved version PGConf.eu 2015 Vienna
 
Super scaling singleton inserts
Super scaling singleton insertsSuper scaling singleton inserts
Super scaling singleton inserts
 
Shootout at the PAAS Corral
Shootout at the PAAS CorralShootout at the PAAS Corral
Shootout at the PAAS Corral
 
Webinar - Approaching 1 billion documents with MongoDB
Webinar - Approaching 1 billion documents with MongoDBWebinar - Approaching 1 billion documents with MongoDB
Webinar - Approaching 1 billion documents with MongoDB
 
Coding for multiple cores
Coding for multiple coresCoding for multiple cores
Coding for multiple cores
 
MongoUK - Approaching 1 billion documents with MongoDB1 Billion Documents
MongoUK - Approaching 1 billion documents with MongoDB1 Billion DocumentsMongoUK - Approaching 1 billion documents with MongoDB1 Billion Documents
MongoUK - Approaching 1 billion documents with MongoDB1 Billion Documents
 
Lockless Programming GDC 09
Lockless Programming GDC 09Lockless Programming GDC 09
Lockless Programming GDC 09
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
 
Advanced Postgres Monitoring
Advanced Postgres MonitoringAdvanced Postgres Monitoring
Advanced Postgres Monitoring
 
Cassandra Community Webinar | Data Model on Fire
Cassandra Community Webinar | Data Model on FireCassandra Community Webinar | Data Model on Fire
Cassandra Community Webinar | Data Model on Fire
 
Out of the box replication in postgres 9.4
Out of the box replication in postgres 9.4Out of the box replication in postgres 9.4
Out of the box replication in postgres 9.4
 

Similar to Tales from the Field

Webinar: Avoiding Sub-optimal Performance in your Retail Application
Webinar: Avoiding Sub-optimal Performance in your Retail ApplicationWebinar: Avoiding Sub-optimal Performance in your Retail Application
Webinar: Avoiding Sub-optimal Performance in your Retail ApplicationMongoDB
 
MongoDB Days UK: Tales from the Field
MongoDB Days UK: Tales from the FieldMongoDB Days UK: Tales from the Field
MongoDB Days UK: Tales from the FieldMongoDB
 
Webinar: Choosing the Right Shard Key for High Performance and Scale
Webinar: Choosing the Right Shard Key for High Performance and ScaleWebinar: Choosing the Right Shard Key for High Performance and Scale
Webinar: Choosing the Right Shard Key for High Performance and ScaleMongoDB
 
How to Achieve Scale with MongoDB
How to Achieve Scale with MongoDBHow to Achieve Scale with MongoDB
How to Achieve Scale with MongoDBMongoDB
 
Tales from the Field
Tales from the FieldTales from the Field
Tales from the FieldMongoDB
 
BDM37: Hadoop in production – the war stories by Nikolaï Grigoriev, Principal...
BDM37: Hadoop in production – the war stories by Nikolaï Grigoriev, Principal...BDM37: Hadoop in production – the war stories by Nikolaï Grigoriev, Principal...
BDM37: Hadoop in production – the war stories by Nikolaï Grigoriev, Principal...Big Data Montreal
 
Gopher in performance_tales_ms_go_cracow
Gopher in performance_tales_ms_go_cracowGopher in performance_tales_ms_go_cracow
Gopher in performance_tales_ms_go_cracowMateuszSzczyrzyca
 
Webinar: Scaling MongoDB
Webinar: Scaling MongoDBWebinar: Scaling MongoDB
Webinar: Scaling MongoDBMongoDB
 
MongoDB at Scale
MongoDB at ScaleMongoDB at Scale
MongoDB at ScaleMongoDB
 
Slices Of Performance in Java - Oleksandr Bodnar
Slices Of Performance in Java - Oleksandr BodnarSlices Of Performance in Java - Oleksandr Bodnar
Slices Of Performance in Java - Oleksandr BodnarGlobalLogic Ukraine
 
MongoDB 3.2 - a giant leap. What’s new?
MongoDB 3.2 - a giant leap. What’s new?MongoDB 3.2 - a giant leap. What’s new?
MongoDB 3.2 - a giant leap. What’s new?Binary Studio
 
Sql on hadoop the secret presentation.3pptx
Sql on hadoop  the secret presentation.3pptxSql on hadoop  the secret presentation.3pptx
Sql on hadoop the secret presentation.3pptxPaulo Alonso
 
PyGrunn2013 High Performance Web Applications with TurboGears
PyGrunn2013  High Performance Web Applications with TurboGearsPyGrunn2013  High Performance Web Applications with TurboGears
PyGrunn2013 High Performance Web Applications with TurboGearsAlessandro Molina
 
Data oriented design and c++
Data oriented design and c++Data oriented design and c++
Data oriented design and c++Mike Acton
 
What SQL should actually be...
What SQL should actually be...What SQL should actually be...
What SQL should actually be...Open Academy
 
Testing Persistent Storage Performance in Kubernetes with Sherlock
Testing Persistent Storage Performance in Kubernetes with SherlockTesting Persistent Storage Performance in Kubernetes with Sherlock
Testing Persistent Storage Performance in Kubernetes with SherlockScyllaDB
 
Etl confessions pg conf us 2017
Etl confessions   pg conf us 2017Etl confessions   pg conf us 2017
Etl confessions pg conf us 2017Corey Huinker
 
Bogdan Kecman INIT Presentation
Bogdan Kecman INIT PresentationBogdan Kecman INIT Presentation
Bogdan Kecman INIT Presentationarhismece
 
MySQL Oslayer performace optimization
MySQL  Oslayer performace optimizationMySQL  Oslayer performace optimization
MySQL Oslayer performace optimizationLouis liu
 

Similar to Tales from the Field (20)

Webinar: Avoiding Sub-optimal Performance in your Retail Application
Webinar: Avoiding Sub-optimal Performance in your Retail ApplicationWebinar: Avoiding Sub-optimal Performance in your Retail Application
Webinar: Avoiding Sub-optimal Performance in your Retail Application
 
MongoDB Days UK: Tales from the Field
MongoDB Days UK: Tales from the FieldMongoDB Days UK: Tales from the Field
MongoDB Days UK: Tales from the Field
 
Webinar: Choosing the Right Shard Key for High Performance and Scale
Webinar: Choosing the Right Shard Key for High Performance and ScaleWebinar: Choosing the Right Shard Key for High Performance and Scale
Webinar: Choosing the Right Shard Key for High Performance and Scale
 
How to Achieve Scale with MongoDB
How to Achieve Scale with MongoDBHow to Achieve Scale with MongoDB
How to Achieve Scale with MongoDB
 
Tales from the Field
Tales from the FieldTales from the Field
Tales from the Field
 
BDM37: Hadoop in production – the war stories by Nikolaï Grigoriev, Principal...
BDM37: Hadoop in production – the war stories by Nikolaï Grigoriev, Principal...BDM37: Hadoop in production – the war stories by Nikolaï Grigoriev, Principal...
BDM37: Hadoop in production – the war stories by Nikolaï Grigoriev, Principal...
 
Gopher in performance_tales_ms_go_cracow
Gopher in performance_tales_ms_go_cracowGopher in performance_tales_ms_go_cracow
Gopher in performance_tales_ms_go_cracow
 
Webinar: Scaling MongoDB
Webinar: Scaling MongoDBWebinar: Scaling MongoDB
Webinar: Scaling MongoDB
 
MongoDB at Scale
MongoDB at ScaleMongoDB at Scale
MongoDB at Scale
 
Slices Of Performance in Java - Oleksandr Bodnar
Slices Of Performance in Java - Oleksandr BodnarSlices Of Performance in Java - Oleksandr Bodnar
Slices Of Performance in Java - Oleksandr Bodnar
 
MongoDB 3.2 - a giant leap. What’s new?
MongoDB 3.2 - a giant leap. What’s new?MongoDB 3.2 - a giant leap. What’s new?
MongoDB 3.2 - a giant leap. What’s new?
 
Sql on hadoop the secret presentation.3pptx
Sql on hadoop  the secret presentation.3pptxSql on hadoop  the secret presentation.3pptx
Sql on hadoop the secret presentation.3pptx
 
PyGrunn2013 High Performance Web Applications with TurboGears
PyGrunn2013  High Performance Web Applications with TurboGearsPyGrunn2013  High Performance Web Applications with TurboGears
PyGrunn2013 High Performance Web Applications with TurboGears
 
Data oriented design and c++
Data oriented design and c++Data oriented design and c++
Data oriented design and c++
 
Big data nyu
Big data nyuBig data nyu
Big data nyu
 
What SQL should actually be...
What SQL should actually be...What SQL should actually be...
What SQL should actually be...
 
Testing Persistent Storage Performance in Kubernetes with Sherlock
Testing Persistent Storage Performance in Kubernetes with SherlockTesting Persistent Storage Performance in Kubernetes with Sherlock
Testing Persistent Storage Performance in Kubernetes with Sherlock
 
Etl confessions pg conf us 2017
Etl confessions   pg conf us 2017Etl confessions   pg conf us 2017
Etl confessions pg conf us 2017
 
Bogdan Kecman INIT Presentation
Bogdan Kecman INIT PresentationBogdan Kecman INIT Presentation
Bogdan Kecman INIT Presentation
 
MySQL Oslayer performace optimization
MySQL  Oslayer performace optimizationMySQL  Oslayer performace optimization
MySQL Oslayer performace optimization
 

More from MongoDB

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump StartMongoDB
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB
 

More from MongoDB (20)

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
 

Recently uploaded

A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 

Recently uploaded (20)

A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 

Tales from the Field

  • 1. @comerford #MongoDBLondon Tales from the Field Adam Comerford Senior Solutions Engineer, MongoDB
  • 2. Or: ● Cautionary Tales ● Don’t solve the wrong problems ● Bad schemas hurt ops too ● etc.
  • 3. The Stories ● Are (mostly) true, and (mostly) actually happened ● Names have been changed to protect the (mostly) innocent ● No animals were harmed during the making of this presentation ○ Perhaps a few DBAs and engineers had light emotional scarring ● Some of the people that inspired the stories may well be here today at MongoDB London
  • 4. Story #1: Bill the Bulk Updater ● Bill built a system that tracked status information for entities in his business domain ● State changes for this system happened in batches: o Sometimes 10% of entities get updated o Sometimes 100% get updated ● Essentially, lots of random updates
  • 5. Bill’s Initial Architecture Application / mongos mongod
  • 6. What about production? ● Bill’s system was a success! ● The product grew, and the number of entities increased by a factor of 5 ● Not a problem - add more shards!
  • 7. Bill’s Eventual Architecture Application / mongos mongod …16 more shards…
  • 8. Linear Scaling ● Bill’s cluster scaled linearly, as intended ● But, Bill’s TCO scaled linearly too ● More growth was forecast
  • 9. Large Cluster, Large Expense ● Entity growth predicted at 10x ● Rough calculations called for ~200 shards ● Linear scaling of cost
  • 10. What problem did Bill overlook? ● Horizontal Scaling = Linear Scaling ● Not necessarily the most efficient option
  • 12. What did we recommend? ● Scale the random I/O vertically, not horizontally ● Sometimes a combination of vertical & horizontal scaling is the best approach
  • 13. Bill’s Final Architecture Application / mongos mongod SSD
  • 14. Story #2: Gary the Game Developer ● Gary was launching a AAA game title ● MongoDB would provide the backend for the player’s online experience ● Launched worldwide, same day, midnight launches
  • 15. Complex Cloud Deployment ● Deploying in the cloud, but very beefy instances ● 32 vCPU, 244GiB RAM, 8 x SSD ● Single mongod unable to stress instances ● Hence “Micro-Sharding” required to get most out of instances
  • 16. Micro-What? Micro-Sharding is the practice of deploying multiple relatively small (hence “micro”) shards on large hosts to better take advantage of available resources which are difficult to utilise with a single mongod instance. HOST1 Primary1 Primary2 Primary3 Secondary4 Secondary5 Secondary6 Secondary7 Secondary8 Secondary9 HOST2 Secondary1 Secondary2 Secondary3 Primary4 Primary5 Primary6 Secondary7 Secondary8 Secondary9 HOST3 Secondary1 Secondary2 Secondary3 Secondary4 Secondary5 Secondary6 Primary7 Primary8 Primary9 For example, 9 shards evenly distributed across 3 hosts, as below:
  • 17. Extensive Pre-Production Testing ● Load tested ● Failover and Backups tested ● Procedures, architecture reviewed ● Basically, lots of testing/reviewing was done (all passed)
  • 18. However……. The production layout of mongod processes actually was 8 shards on 3 host, reproduced below. This layout caused a problem in production. But, it was tested and had no issues, right? Almost: the backup process was tested, and load was tested, but not together….. HOST1 Primary1 Primary2 Primary3 Secondary4 Secondary5 Secondary6 Secondary7 Secondary8 HOST2 Secondary1 Secondary2 Secondary3 Primary4 Primary5 Primary6 Secondary7 Secondary8 HOST3 Secondary1 Secondary2 Secondary3 Secondary4 Secondary5 Secondary6 Primary7 Primary8
  • 19. The Backup Process HOST1 Primary1 Primary2 Primary3 Secondary4 Secondary5 Secondary6 Secondary7 Secondary8 HOST2 Secondary1 Secondary2 Secondary3 Primary4 Primary5 Primary6 Secondary7 Secondary8 HOST3 Secondary1 Secondary2 Secondary3 Secondary4 Secondary5 Secondary6 Primary7 Primary8 Backups took place on a single host (host 2 below). The databases were locked, then an LVM snapshot was taken, the lock was released. This was almost instantaneous in pre-prod testing (no load), not so in production.
  • 20. Backup Under Load Once load was introduced to the equation, the snapshots were no longer instantaneous. This essentially caused the primaries to become unresponsive but not fail over on the host taking the backup Which eventually caused a cascading failure, bringing the whole cluster down HOST1 Primary1 Primary2 Primary3 Secondary4 Secondary5 Secondary6 Secondary7 Secondary8 HOST2 Secondary1 Secondary2 Secondary3 Primary4 Primary5 Primary6 Secondary7 Secondary8 HOST3 Secondary1 Secondary2 Secondary3 Secondary4 Secondary5 Secondary6 Primary7 Primary8
  • 21.
  • 22. What did we recommend? HOST1 Primary1 Primary2 Primary3 Primary4 Secondary5 Secondary6 Secondary7 Secondary8 HOST2 Secondary1 Secondary2 Secondary3 Secondary4 Secondary5 Secondary6 Secondary7 Secondary8 HOST3 Secondary1 Secondary2 Secondary3 Secondary4 Primary5 Primary6 Primary7 Primary8 New process layout proposed, as below, backups still taken on Host2. The database lock was not necessary because LVM snapshot gives point in time, removed. Also put some limits on max connections, just in case
  • 23. Summary No one single cause: ● Small issue with deployment layout ● Small error with backup process ● Lack of integration with testing plan ● Relatively new system ● Some bad luck Led to: ● Large outage, slow cautious recovery
  • 24. Story #3: Rita the Retailer Rita the Retailer had an ecommerce site, selling diverse goods in 20+ countries.
  • 25. Product Catalog: Original Schema { _id: 375 en_US : { name : ..., description : ..., <etc...> }, en_GB : { name : ..., description : ..., <etc...> }, fr_FR : { name : ..., description : ..., <etc...> }, de_DE : ..., de_CH : ..., <... and so on for other locales... > }
  • 26. What’s good about this schema? ● Each document contains all the data about a given product, across all languages/locales ● Very efficient way to retrieve the English, French, German, etc. translations of a single product’s information in one query
  • 27. However…… That is not how the product data is actually used (except perhaps by translation staff)
  • 28. Dominant Query Pattern db.catalog.find( { _id : 375 } , { en_US : true } ); db.catalog.find( { _id : 375 } , { fr_FR : true } ); db.catalog.find( { _id : 375 } , { de_DE : true } ); ... and so forth for other locales ...
  • 29. Which means…… The Product Catalog’s data model did not fit the way the data was accessed.
  • 30. Consequences ● Each document contained ~20x more data than any common use case needed ● MongoDB lets you request just a subset of a document’s contents (using a projection), but… o Typically the whole document will get loaded into RAM to serve the request ● There are other overheads for reading from disk into memory (like readahead)
  • 31. Therefore….. Less than 5% of data loaded into RAM from disk is actually required at the time - highly inefficient
  • 32. Visualising the problem { _id: 42, en_US : { name : ..., description : ..., <etc...> }, en_GB : { name : ..., description : ..., <etc...> }, fr_FR : { name : ..., description : ..., <etc...> }, de_DE : ..., de_CH : ..., <... and so on for other locales... > } <READAHEAD OVERHEAD> { _id: 709, en_US : { name : ..., description : ..., <etc...> }, en_GB : { name : ..., description : ..., <etc...> }, fr_FR : { name : ..., description : ..., <etc...> }, de_DE : ..., de_CH : ..., <... and so on for other locales... > } <READAHEAD OVERHEAD> { _id: 3600, en_US : { name : ..., description : ..., <etc...> }, en_GB : { name : ..., description : ..., <etc...> }, fr_FR : { name : ..., description : ..., <etc...> }, de_DE : ..., de_CH : ..., <... and so on for other locales... > } - Data in RED are loaded into RAM and used. - Data in BLUE take up memory but are not required. - Readahead padding in GREEN makes things even more inefficient
  • 33. More RAM? It’s not that simple
  • 34. What did we recommend? ● Design for your use case, your dominant query pattern o In this case: 99.99% of queries want the product data for exactly one locale at a time o Hence, alter schema appropriately ● Eliminate inefficiencies on the system o Make reading from disk less wasteful, maximise I/O capabilities: reduce readahead settings
  • 35. Schema: Before & After Schema After (document per-locale): { _id: "375-en_US", name : ..., description : ..., <etc...> } { _id: "375-en_GB", name : ..., description : ..., <etc...> } { _id: "375-fr_FR", name : ..., description : ..., <etc...> } ... and so on for other locales ... Query After: db.catalog.find( { _id : "375-en_US" }; db.catalog.find( { _id : "375-fr_FR" }; db.catalog.find( { _id : "375-de_DE" }; Schema Before (embedded): { _id: 375 en_US : { name : ..., description : ..., <etc...> }, en_GB : { name : ..., description : ..., <etc...> }, fr_FR : { name : ..., description : ..., <etc...> }, <... and so on for other locales... > } Query Before: db.catalog.find( { _id : 375 } , { en_US : true } ); db.catalog.find( { _id : 375 } , { fr_FR : true } ); db.catalog.find( { _id : 375 } , { de_DE : true } );
  • 36. Consequences of Changes ● Queries induced minimal overhead ● Greater than 20x distinct products fit in memory at once ● Disk I/O utilization reduced ● UI latency decreased ● Happier Customers ● Profit (well, we hope)
  • 37. Conclusions ● MongoDB can be used to for a wide range of (sometimes pretty cool) use cases ● A small problem can seem much bigger when it happens in production ● We are here to help - if you hit a problem, it’s likely you are not the first to hit it ● We can provide a fresh perspective, advice based on experience to prevent and solve issues
  • 38. @comerford #MongoDBLondon Questions? Adam Comerford Senior Solutions Engineer, MongoDB
  • 39. Further Reading for Retail/Catalogs ● Antoine Girbal (my team mate) has produced a full reference architecture for this type of application o Blog part 1: http://tmblr.co/ZiOADx1RRsAWe o Blog part 2: http://tmblr.co/ZiOADx1LfVmfm ● Detailed presentations and talks from MongoDB World: o http://www.mongodb.com/presentations/retail-reference-architecture-part- 1-flexible-searchable-low-latency-product-catalog o http://www.mongodb.com/presentations/retail-reference-architecture-part- 2-real-time-geo-distributed-inventory o http://www.mongodb.com/presentations/retail-reference-architecture-part- 3-scalable-insight-component-providing-user-history

Editor's Notes

  1. Field/Trenches
  2. We also try to make it about interesting systems Generally, MongoDB works well, but like all complex systems, it has its foibles, pitfalls and preferences Despite the blurb, will not be talking about binary shard keys
  3. Some borrowed, some merged into a single narrative More ops focused take on borrowed stories
  4. Sensor data, say from a trucking fleet, some real time data, rest uploaded in batches
  5. He set up a sharded collection across 4 shards, all using locally-attached, commodity storage. Everything worked well in the test environment…
  6. Bill's Bulk Updates randomly affected an ever larger data set. In order to cope with the database size, Bill added more shards. The cluster scaled linearly, as intended.
  7. Imagine that the sample rate was going to go from once a minute to once every 5 seconds
  8. You can run 200 shards, we have customers that have been doing so for years But, if already worried about the TCO at 20 shards, 200 is a significant problem
  9. Just because you can add horizontal capacity, does not mean it is the optimum solution
  10. When you have identified your scaling driver (I/O, memory, CPU, locking), always consider alternatives to simply adding more of the same Spinning rust (commodity hard disks) are generally poor for random I/O, but are cheap. SSDs are expensive but an order of magnitude faster for random I/O Another alternative would be a high performance SAN, RAID of commodity spinning disks, but that was not an option here.
  11. Fewer, beefier shards. Bill went with SSDs. Ultimately, Bill only needed about 4 shards, so cost savings overall. Bill, and Bill's boss was very relieved.
  12. Lots of hype, so Gary’s load was going to go from zero to insane in a matter of minutes/hours when the game launched
  13. Taking story 1 to an extreme
  14. Usually sharding = one host per data bearing node. Good for scaling horizontally on hosts with modest capabilities. Micro sharding deploys more than one mongod process on a host. In this case 8 data bearing processes per host for a total of 24 = 8 “micro” shards on 3 hosts
  15. Taking story 1 to an extreme
  16. Individual tests were OK, but not combined
  17. The process followed our reference documentation, for the general use case: Lock the database, take a backup (snapshot), release the lock Generally you would do this on a host running a secondary, not on a host running 8 mongod processes, some of them primary
  18. Connections built up on the clients, more were opened, hosts began to run out of resources (open files, ephemeral ports, memory in general)
  19. Which boils down to…… Well, not quite, the dev people were on the call trying to fix this too
  20. No recurrence, still running without an issue
  21. Taking story 1 to an extreme
  22. In fact, this is how the data was used because of the current schema
  23. Which means lots of I/O, lots of page faults, low cache hit rate, slowness – even though rough calculations say it should fit in RAM
  24. Out of RAM, no problem, just download more! With the cloud, VMs, containers this is close to being true, but there is still a cost It might fix things, but it’s expensive and the real problem is the efficiency, or lack thereof
  25. Not the only approach, but allowed for minimal changes on the client side
  26. Disk accessed more efficiently and less often, actually allows the readahead to potentially go lower too by freeing up IOPS capacity
  27. For example, at the “Ask The Experts” table which I will be at for the next hour following this presentation
  28. Field/Trenches