Azure Cosmos DB vs MongoDB Atlas

Publish date:

A comparison of features, capabilities, and costs; and an analysis of which one to choose over the other.

I have been involved in discussions around Cosmos DB vs MongoDB Atlas quite a few times, and I have realized that some of the typical questions that these discussions revolve around include:

  • Which is a better choice as document storage?
  • What factors should be considered to decide which better fits the project needs?
  • What about performance, storage capacity, and throughput scale?
  • What about backup?
  • How much is my database going to cost?

I have tried to present a concrete comparison with an analysis that can help you make an informed choice. Before we start, however, here are some notes that you should be aware of:

  • I have made a simple comparison based on criteria that mattered for projects I was involved in. The criteria might be different for you.
  • Cosmos DB is more than just document storage; it has other storage engines too, but this blog post is only about its MongoDB-API storage functionality.
  • Both databases are being actively developed and the situation is changing rapidly.
  • MongoDB Atlas works with multiple cloud providers (including Azure). The storage price differs between them. This affects both data storage and backup price for Atlas.
  • RU – request unit is a kind of IOPS in Cosmos DB terminology.

 

Criteria

MongoDB Atlas

Cosmos DB

Storage scaling Automatic storage scaling for cluster with a tier of M10 or larger.
https://docs.atlas.mongodb.com/customize-storage/#auto-scale-cluster-tier-and-storage-capacity
Automatic scaling without limit.
https://docs.microsoft.com/en-us/azure/cosmos-db/faq
Capacity (CPU/memory) scaling Automatic horizontal capacity scaling for cluster with a tier of M10 or larger.
https://docs.atlas.mongodb.com/cluster-autoscaling/#cluster-autoscaling
Horizontal scaling with sharding, available only with a tier of M30 or larger.
https://docs.atlas.mongodb.com/cluster-config/sharded-cluster/#create-cluster-sharding
Automatic scaling without limit.
Throughput scaling Limited by cluster size tier. Cluster supports vertical autoscaling starting with tier M10.
https://docs.atlas.mongodb.com/sizing-tier-selection
Manually limited by RUs. Potentially unlimited.
https://docs.microsoft.com/en-us/azure/cosmos-db/faq
https://docs.microsoft.com/en-us/azure/cosmos-db/scaling-throughput
Partitioning sharding Based on user-defined key. Key can be changed (starting from v4.0).
https://docs.atlas.mongodb.com/global-cluster-sharding
Based on user-defined key. Key can not be changed.
https://docs.microsoft.com/en-us/azure/cosmos-db/partitioning-overview
Uptime 99.995% Guaranteed only for a tier M30 or larger.
https://www.mongodb.com/cloud/atlas/sla
99.99%
https://azure.microsoft.com/en-us/support/legal/sla/cosmos-db/v1_3
Fault tolerance A minimum of three data nodes per replica set are automatically deployed across availability zones (AWS), fault domains (Azure), or zones (GCP) for continuous application uptime in the event of outages and routine maintenance.
https://www.mongodb.com/cloud/atlas/faq
Within each region, every partition is protected by a replica-set with all writes replicated and durably committed by a majority of replicas. Replicas are distributed across as many as 10-20 fault domains.
https://docs.microsoft.com/en-us/azure/cosmos-db/high-availability
Backup User-defined backup policy.
On-demand snapshots.
Only with a tier of M10 or larger.
Backup costs separately, included in common bill.
https://docs.atlas.mongodb.com/backup/cloud-backup/overview
Automatic backup. Every 4 hours, keep 2 last backup. On-demand data restore, means you need to contact Azure support.
Included in price.
https://docs.microsoft.com/en-us/azure/cosmos-db/online-backup-and-restore
Archiving Automatically moving data to a read-only archive. Only with a tier of M10 or larger
https://docs.atlas.mongodb.com/online-archive/manage-online-archive
not available out of the box.
Can be build with Azure functions, Azure Data Factory and so on.
Max document size 16MB
https://docs.mongodb.com/manual/reference/limits/
2 MB
https://docs.microsoft.com/en-us/azure/cosmos-db/concepts-limits
Tools All the tools that are compatible with MongoDB.
MongoDB in Docker container for testing and development.
All the tools that are compatible with MongoDB v3.6
Azure portal with built-in storage explorer
stand alone desktop storage explorer (Windows/MacOS/Linux)
Emulator for development and testing (Windows only)
MongoDB API support full API support, user-defined version, up to the latest.
https://docs.atlas.mongodb.com/cluster-config/mongodb-version
subset. Currently MongoDB v 3.6
https://docs.microsoft.com/en-us/azure/cosmos-db/mongodb-feature-support-36
Indexing Indexes can be created and deleted dynamically, with some limitations.
https://docs.mongodb.com/manual/reference/limits/#index-limitations
_id field only by default.
To apply a sort to a query, you must create an index on the fields used in the sort operation.
Unique indexes can be created only when the collection is empty.
https://docs.microsoft.com/en-us/azure/cosmos-db/mongodb-indexing#creating-unique-indexes
TTL yes
https://docs.mongodb.com/v4.2/tutorial/expire-data
yes. TTL consumes RUs
https://docs.microsoft.com/en-us/azure/cosmos-db/time-to-live
Consistence model https://docs.mongodb.com/manual/core/read-isolation-consistency-recency 5 levels. The higher the level, the more RUs it uses, then price is higher.
https://docs.microsoft.com/en-us/azure/cosmos-db/consistency-levels
Customer support Basic plan included, but has no response time SLA.
Developer plan 49 USD/month.
Cloud provider support is probably needed anyway.
https://www.mongodb.com/pricing
Included in Azure support plan. Standard plan is $100 per month
https://azure.microsoft.com/en-us/support/plans
Global replication Supported Can be enabled at any time with just some clicks in Azure portal.
Price model Predefined price per cluster per hour usage with predefined CPU/memory/storage capacity.
https://www.mongodb.com/pricing
Pay-as-you-go, per RUs and occupied storage.
Price critical factors cluster memory, storage capacity IOPS, document size, consistency level.
Writes are 5x times more expansive then reads.
https://docs.microsoft.com/en-us/azure/cosmos-db/optimize-cost-reads-writes
Price examples M20 (Azure)
4GB RAM • 32GB storage
– ~160 USD/month
– support 49 USD/month
– Backup 50USD/month (depends on size)
total: ~260 USD/monthM30 (Azure)
8GB RAM • 32GB storage
~408 USD/month
– support 49 USD/month
– Backup 50 USD/month (depends on size)
total: ~508 USD/month

Calculated for a single region with https://cosmos.azure.com/capacitycalculator

32GB database
Document size 1KB
IOPS: 2500 read/s + 1000 write/s
~443 USD/month

32GB database
Document size 1KB
IOPS: 2500 read/s + 2500 write/s
~877 USD/month

32GB database
Document size 1KB
IOPS: 2500 read/s + 5000 write/s
~1590 USD/month

32GB database
Document size 10KB
IOPS: 2500 read/s + 2500 write/s
~1634 USD/month

Customer considerations are key to making a choice

  1. In spite of its attractiveness as a pay-as-you-go price model for Cosmos DB and the possibility to create a budget, one customer preferred the predefined cluster price model from MongoDB Atlas. This was based on the customer’s personal requirement whereby he found the predefined pricing model of MongoDB Atlas more clear and safer for budgeting.
  2. For another project, the document limit size of 2MB in Cosmos DB was an impediment due to binary attachments inserted into documents. In such a case, the 16MB document limit for MongoDB Atlas looked much more attractive.
  3. A government customer found it difficult to use MongoDB Atlas for the simple reason that it was one more additional service supplier. Even though the customer had an agreement with Azure, in order to use MongoDB Atlas (even over Azure) the customer needed to follow bureaucratic service purchase routines and go into a new service agreement.

My conclusions so far

Cosmos DB is good:

  1. In case of small documents, preferably less than 1KB, as the cost is much cheaper for smaller documents.
  2. When you read more often than you write, because writes are 5x times more expansive in Cosmos.
  3. If you want to start small and pay-as-you-go.
  4. When you want support included in your Azure subscription, even for a small database.
  5. If you need a guaranteed latency despite of usage.

MongoDB Atlas is good:

  1. For any size of documents, and is the only choice for documents larger than 2MB.
  2. When you like to have a fixed budget for storage.
  3. When you use Mongo-API features that are not covered by Cosmos DB.
  4. When you need the freedom to create unique indexes.
  5. When you write data more often than read, MongoDB storage will be cheaper with other equal parameters.
  6. If you want to decide backup policy.

In some cases, both solutions are good for prototyping and testing.

  • It is easy and costs nothing (free tier up to 400RU/s and 5GB) to start with CosmosDB. Pay-as-you-go pricing model does not require up-front investments and local storage emulator is free.
  • MongoDB Atlas has free tier for databases up to 512MB, and it is easy to run it in container on any platform.

About the Author


Mikael Chudinov
Managing Delivery Architect – Capgemini

Mikael is a dedicated and performance-driven IT professional with over 15 years of expertise in software development, 6 years in solution architecture and cloud architecture.

Related Posts

AI ain’t cheap

Date icon July 26, 2021

AI models have become increasingly accurate, these accuracy improvements come with an...

Innovation

Adversity breeds innovation

Seth Rachlin
Date icon July 26, 2021

Out of adversity comes innovation and invention. For insurers willing to adopt a new mindset...

AI 4 Education

Pierre-Adrien Hanania
Date icon July 26, 2021

Despite the effort in the field of education towards a sustainable future and the progress in...