Relational Databases at Scale

Aurora, Spanner, and Cloud-Native Distributed SQL

The Scale Dilemma for Relational Databases

Traditional relational databases (MySQL, PostgreSQL, SQL Server) excel at maintaining ACID guarantees, but they hit a wall when data grows beyond a single server's capacity. When you need to handle billions of records, thousands of transactions per second, or serve users across continents, you face a fundamental choice: regional replication with eventual consistency or global strong consistency. Cloud-native databases like Aurora, Spanner, and Azure's offerings solve scale differently, each with distinct trade-offs in consistency, latency, cost, and complexity.

Two Philosophies: Aurora (AWS) achieves scale through regional replication with read replicas and eventual consistency for cross-region reads. Spanner (Google) achieves global scale with strong consistency everywhere, using atomic clocks and a unique architecture. Azure offers both models with Cosmos DB for PostgreSQL and SQL Hyperscale.

Why Traditional Relational Databases Struggle at Scale

Traditional databases were designed when data fit on a single powerful server. As applications grow to serve millions of users globally, these databases face architectural limits that can't be solved by just adding more RAM or CPU.

Single-Server Limits

Even the largest servers have finite CPU, RAM, and I/O capacity. When your database exceeds these limits (hundreds of millions of rows, thousands of writes/second), you can't vertically scale further. Upgrading hardware becomes exponentially expensive and eventually impossible.

Multi-Region Challenges

Users in Asia shouldn't wait 200ms to query a database in Virginia. Replicating data across continents introduces consistency problems: do you prioritize low latency (eventual consistency) or strong guarantees (synchronous replication with higher latency)?

CAP Theorem Trade-offs

The CAP theorem states you can only have 2 of 3: Consistency, Availability, Partition Tolerance. Traditional databases choose CP (consistency + partition tolerance), sacrificing availability during network splits. Distributed systems must decide which guarantees to provide.

Cost of Downtime

Single-server databases have a single point of failure. Hardware failures, network issues, or maintenance windows cause complete outages. For e-commerce, financial services, or SaaS applications, even seconds of downtime costs thousands or millions of dollars.

When Do You Need Relational Databases at Scale?

✅ Use Distributed SQL When:
  • Need ACID guarantees across large datasets
  • Complex queries with JOINs and transactions
  • Existing SQL expertise and tooling
  • Schema enforcement and referential integrity required
  • Multi-region availability with failover
  • Data exceeds single-server capacity (>1 TB actively queried)
❌ Consider NoSQL Instead When:
  • Flexible schema with frequent changes
  • Key-value or document-based access patterns
  • Eventual consistency is acceptable
  • Horizontal scaling is primary requirement
  • Simple queries without complex JOINs
  • Millisecond latency is critical

AWS Aurora: Regional Replication with Global Database

Amazon Aurora is AWS's cloud-native relational database built from the ground up to take advantage of distributed storage. It's MySQL and PostgreSQL compatible, meaning existing applications work without code changes. Aurora separates compute from storage, enabling independent scaling and resilience through 6-way storage replication across 3 Availability Zones.

Architecture Highlights

Decoupled Storage

Storage layer is separate from compute, distributed across hundreds of storage nodes. Data is replicated 6 ways across 3 AZs for fault tolerance. Storage scales automatically from 10 GB to 128 TB.

Compute Layer

Database instances (1 primary + up to 15 read replicas) run queries. Compute can scale independently from storage. Aurora Serverless v2 auto-scales from 0.5 to 128 ACUs based on demand.

High Availability

Automatic failover to read replica in 30-120 seconds. Continuous backup to S3. Aurora can lose 2 copies of data without affecting write availability, 3 copies without affecting reads.

Key Features

Aurora Global Database

Replicate your database across up to 5 AWS regions for disaster recovery and low-latency global reads. Primary region handles writes, secondary regions serve read-only traffic with <1 second replication lag.

-- Create Aurora Global Database cluster
aws rds create-global-cluster \
  --global-cluster-identifier global-app-cluster \
  --engine aurora-postgresql \
  --engine-version 15.4

-- Primary cluster in us-east-1
aws rds create-db-cluster \
  --db-cluster-identifier primary-cluster \
  --engine aurora-postgresql \
  --engine-version 15.4 \
  --global-cluster-identifier global-app-cluster \
  --region us-east-1

-- Secondary cluster in eu-west-1 (read-only)
aws rds create-db-cluster \
  --db-cluster-identifier secondary-cluster-eu \
  --engine aurora-postgresql \
  --engine-version 15.4 \
  --global-cluster-identifier global-app-cluster \
  --region eu-west-1

-- Application writes to primary, reads from local region
-- Replication lag typically < 1 second
-- RPO (Recovery Point Objective): < 1 second
-- RTO (Recovery Time Objective): < 1 minute for cross-region failover
Use case: E-commerce platform serving users globally. Writes happen in primary region (us-east-1), but European users read from eu-west-1 replica with ~10ms latency instead of 100ms+ cross-Atlantic latency.
Backtrack (Time Travel)

Instantly rewind your database to any point in the past (up to 72 hours) without restoring from backup. Recover from accidental DELETE or schema changes in seconds.

-- Enable backtrack with 72-hour window
aws rds modify-db-cluster \
  --db-cluster-identifier my-cluster \
  --backtrack-window 259200 \
  --apply-immediately

-- Rewind database to 2 hours ago
aws rds backtrack-db-cluster \
  --db-cluster-identifier my-cluster \
  --backtrack-to "2026-01-30 12:00:00"

-- Database instantly reverts, no downtime
-- All data from 12:00 to 14:00 is "undone"
-- Perfect for recovering from accidental changes
Aurora Serverless v2

Automatically scales database capacity based on application demand. Scale from 0.5 ACU (Aurora Capacity Units) to 128 ACUs in fine-grained increments. Pay only for resources consumed.

-- Create Aurora Serverless v2 cluster
aws rds create-db-cluster \
  --db-cluster-identifier serverless-cluster \
  --engine aurora-postgresql \
  --engine-version 15.4 \
  --serverless-v2-scaling-configuration \
    MinCapacity=0.5,MaxCapacity=16

-- Create serverless instance
aws rds create-db-instance \
  --db-instance-identifier serverless-instance \
  --db-cluster-identifier serverless-cluster \
  --engine aurora-postgresql \
  --db-instance-class db.serverless

-- Scales automatically:
-- - Low traffic (night): 0.5-2 ACUs
-- - Medium traffic (day): 4-8 ACUs
-- - High traffic (Black Friday): 12-16 ACUs
-- Scaling happens in < 1 second without dropping connections
Clone Database (Copy-on-Write)

Create full database clones in minutes for testing, development, or analytics without copying data. Uses copy-on-write, so clones only consume storage for changed data.

-- Clone production database for testing
aws rds restore-db-cluster-to-point-in-time \
  --source-db-cluster-identifier production-cluster \
  --db-cluster-identifier test-clone \
  --restore-type copy-on-write \
  --use-latest-restorable-time

-- Clone created in ~5 minutes
-- Initial storage cost: near zero (copy-on-write)
-- Test schema changes safely on clone
-- Drop clone when done - no impact on production
Read Replicas (up to 15)

Aurora supports up to 15 read replicas in the same region with <10ms replication lag. Distribute read traffic across replicas for massive read scaling.

-- Application connection routing
# Write endpoint (primary instance)
writer_endpoint = "my-cluster.cluster-xyz.us-east-1.rds.amazonaws.com"

# Read endpoint (automatically load-balances across replicas)
reader_endpoint = "my-cluster.cluster-ro-xyz.us-east-1.rds.amazonaws.com"

# Python example with SQLAlchemy
from sqlalchemy import create_engine

# Writes go to primary
write_engine = create_engine(f"postgresql://user:pass@{writer_endpoint}/db")

# Reads use read replicas
read_engine = create_engine(f"postgresql://user:pass@{reader_endpoint}/db")

# Insert user (write operation)
with write_engine.connect() as conn:
    conn.execute("INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')")

# Query users (read operation, load-balanced across replicas)
with read_engine.connect() as conn:
    result = conn.execute("SELECT * FROM users WHERE name = 'Alice'")
    print(result.fetchall())
Pricing Model
Storage$0.10/GB/month, auto-scales, pay only for used space
Compute$0.29-$4.05/hour (instance-based) or $0.12/ACU-hour (serverless)
I/O Requests$0.20/million requests (can be significant for write-heavy workloads)
When to Choose Aurora: AWS-centric architecture, need MySQL/PostgreSQL compatibility, regional high availability is sufficient, cost-sensitive workloads, read-heavy applications that benefit from read replicas, or variable workloads that benefit from Aurora Serverless v2.

Google Cloud Spanner: Global Strong Consistency

Cloud Spanner is Google's globally-distributed relational database that achieves something most thought impossible: strong consistency across continents. Using atomic clocks (TrueTime API) and sophisticated consensus protocols, Spanner provides ACID guarantees for transactions that span the globe. It's the database powering Google's most critical services like AdWords and Google Play.

Architecture Highlights

TrueTime API

Hardware atomic clocks and GPS clocks in every datacenter provide a global time reference with bounded uncertainty. This enables external consistency - transactions commit in a globally consistent order.

Paxos Consensus

Data is automatically sharded and replicated across zones/regions using Paxos algorithm for leader election. Every write is synchronously replicated to majority of replicas before commit.

External Consistency

Stronger than ACID. If transaction T1 commits before T2 starts (in real time), all observers see T1's effects before T2's effects. No eventual consistency anomalies.

Key Features

Global ACID Transactions

Execute transactions that read/write data across multiple continents with full ACID guarantees. No eventual consistency, no conflict resolution - it just works correctly.

-- Create multi-region Spanner instance
gcloud spanner instances create global-inventory \
  --config=nam-eur-asia3 \
  --description="Multi-region inventory system" \
  --processing-units=1000

-- Schema with interleaved tables (co-located for performance)
CREATE TABLE Warehouses (
  WarehouseId INT64 NOT NULL,
  Location STRING(100),
  Region STRING(50)
) PRIMARY KEY (WarehouseId);

CREATE TABLE Inventory (
  WarehouseId INT64 NOT NULL,
  ProductId INT64 NOT NULL,
  Quantity INT64,
  LastUpdated TIMESTAMP NOT NULL OPTIONS (
    allow_commit_timestamp=true
  )
) PRIMARY KEY (WarehouseId, ProductId),
  INTERLEAVE IN PARENT Warehouses ON DELETE CASCADE;

-- Global transaction: Deduct from US warehouse, add to EU warehouse
BEGIN TRANSACTION;

-- Deduct inventory in US (nam region)
UPDATE Inventory
SET Quantity = Quantity - 100,
    LastUpdated = PENDING_COMMIT_TIMESTAMP()
WHERE WarehouseId = 1001 AND ProductId = 5000;

-- Add inventory in EU (eur region)
UPDATE Inventory
SET Quantity = Quantity + 100,
    LastUpdated = PENDING_COMMIT_TIMESTAMP()
WHERE WarehouseId = 2001 AND ProductId = 5000;

COMMIT TRANSACTION;

-- Spanner ensures:
-- 1. Both updates succeed or both fail (atomicity)
-- 2. All observers see consistent state (no partial updates visible)
-- 3. Transaction commits in globally consistent order
-- 4. Typical latency: 50-100ms (synchronous cross-region replication)
Use case: Financial trading platform where trades must be atomic across accounts in different regions. A stock sale in Asia and corresponding purchase in North America must both succeed or both fail - no partial states.
Interleaved Tables for Performance

Parent-child relationships can be physically co-located on the same servers for faster JOINs and transactions. Spanner stores related rows together.

-- Parent table: Customers
CREATE TABLE Customers (
  CustomerId INT64 NOT NULL,
  Name STRING(100),
  Email STRING(255)
) PRIMARY KEY (CustomerId);

-- Child table: Orders (interleaved in Customers)
CREATE TABLE Orders (
  CustomerId INT64 NOT NULL,
  OrderId INT64 NOT NULL,
  TotalAmount NUMERIC,
  OrderDate TIMESTAMP
) PRIMARY KEY (CustomerId, OrderId),
  INTERLEAVE IN PARENT Customers ON DELETE CASCADE;

-- Query customer with all orders (single-server operation)
SELECT c.Name, c.Email, o.OrderId, o.TotalAmount
FROM Customers c
JOIN Orders o ON c.CustomerId = o.CustomerId
WHERE c.CustomerId = 12345;

-- Because Orders is interleaved, this JOIN executes on a single
-- Spanner server without network hops. Much faster than distributed JOIN.
Strong Reads vs Stale Reads

Choose between strong reads (globally consistent, higher latency) or stale reads (eventually consistent, lower latency) based on your use case.

-- Strong read (default): Globally consistent
SELECT ProductId, Quantity FROM Inventory
WHERE WarehouseId = 1001 AND ProductId = 5000;
-- Latency: 10-50ms (waits for latest committed data)

-- Stale read: Up to 15 seconds old (lower latency)
-- Staleness is set at the session/transaction level, not per query
SET SPANNER.READ_ONLY_STALENESS = 'EXACT_STALENESS 15s';

SELECT ProductId, Quantity FROM Inventory
WHERE WarehouseId = 1001 AND ProductId = 5000;
-- Latency: 5-20ms (reads potentially stale data)

-- Use strong reads for:
-- - Financial transactions
-- - Inventory that must be exact
-- - Critical consistency requirements

-- Use stale reads for:
-- - Analytics dashboards
-- - Product catalogs
-- - Reports where slight delay is acceptable
Automatic Sharding & Scaling

Spanner automatically splits tables into shards (called "splits") and distributes them across servers. As data grows or hotspots emerge, Spanner rebalances automatically.

How it works: Spanner monitors key ranges and splits tables when a range gets too large (>4 GB) or too hot (too many requests). Splits are moved across servers to balance load. Completely transparent - no application changes needed.
99.999% Availability SLA (5 Nines)

Multi-region Spanner instances provide 99.999% uptime - that's only 5.26 minutes of downtime per year. Automatic failover is transparent with no application changes.

Regional Config99.99% SLA (4 nines)
~52 minutes downtime/year
Multi-Region Config99.999% SLA (5 nines)
~5 minutes downtime/year
Pricing Model
Node Hours$0.90-$9.00/hour/node (regional vs multi-region)
Storage$0.30/GB/month (higher than Aurora due to multi-region replication)
Network EgressStandard Google Cloud pricing (free within region)
When to Choose Spanner: Need global strong consistency (not eventual), multi-region active-active writes, financial transactions or inventory systems where consistency is critical, 99.999% uptime requirement, can justify premium pricing for unique guarantees, or horizontal scaling across continents.

Azure: Multiple Paths to Scale

Microsoft Azure offers three distinct approaches to scaling relational databases, each targeting different compatibility and scaling needs. Cosmos DB for PostgreSQL brings horizontal scaling to PostgreSQL, SQL Database Hyperscale extends SQL Server to massive scale, and the upcoming HorizonDB promises cloud-native PostgreSQL performance.

Azure Cosmos DB for PostgreSQL (Citus)

Built on the Citus open-source extension, Cosmos DB for PostgreSQL enables horizontal scaling by distributing tables across multiple worker nodes. Perfect for multi-tenant SaaS applications and real-time analytics on massive datasets.

Architecture
Coordinator NodeRoutes queries to worker nodes, maintains metadata, handles non-distributed tables
Worker NodesStore sharded data, execute queries in parallel, scale horizontally by adding nodes
-- Create distributed table for multi-tenant SaaS
CREATE TABLE events (
  tenant_id bigint,
  event_id bigserial,
  event_type text,
  event_data jsonb,
  created_at timestamptz default now()
);

-- Distribute table across worker nodes by tenant_id
-- All data for a tenant is co-located on same shard
SELECT create_distributed_table('events', 'tenant_id');

-- Create reference table (replicated to all workers)
CREATE TABLE event_types (
  type_id serial primary key,
  type_name text,
  description text
);
SELECT create_reference_table('event_types');

-- Queries are automatically routed and parallelized
-- Query for single tenant (executes on 1 worker node)
SELECT COUNT(*) FROM events
WHERE tenant_id = 12345
  AND created_at > NOW() - INTERVAL '1 day';

-- Query across all tenants (executes in parallel on all workers)
SELECT tenant_id, COUNT(*) as event_count
FROM events
WHERE created_at > NOW() - INTERVAL '1 day'
GROUP BY tenant_id
ORDER BY event_count DESC
LIMIT 100;

-- Citus parallelizes query across workers, aggregates results
Key Features
  • 100% PostgreSQL compatible (uses Citus extension)
  • Columnar storage for 10x faster analytics
  • Start with 1 node, add workers on demand
  • Up to 20 TB per worker node
  • High availability with automatic failover
  • Ideal for multi-tenant applications (tenant_id sharding)
Use case: Multi-tenant SaaS application with thousands of customers. Each customer's data is isolated on the same shard for fast single-tenant queries. Cross-tenant analytics (dashboards, reporting) leverage parallel query execution.

Azure SQL Database Hyperscale

For SQL Server workloads that need to scale beyond traditional limits. Hyperscale separates compute from storage, supports databases up to 100 TB, and provides rapid scaling with named replicas for read scale-out.

-- Create Hyperscale database
CREATE DATABASE ProductionDB
  (EDITION = 'Hyperscale', SERVICE_OBJECTIVE = 'HS_Gen5_8');

-- Create named replica for read scale-out
ALTER DATABASE ProductionDB
ADD SECONDARY ON SERVER 'replica-eastus2'
WITH (
  SERVICE_OBJECTIVE = 'HS_Gen5_4',
  SECONDARY_TYPE = 'Named'
);

-- Application connection strings
-- Primary (writes)
Server=primary.database.windows.net;
Database=ProductionDB;
ApplicationIntent=ReadWrite;

-- Named replica (reads)
Server=replica-eastus2.database.windows.net;
Database=ProductionDB;
ApplicationIntent=ReadOnly;

-- Fast database restore (point-in-time, via Azure CLI)
-- Traditional restore: Hours for 10 TB database
-- Hyperscale restore: Minutes (uses storage snapshots)
az sql db restore \
  --dest-name ProductionDB_Recovered \
  --resource-group myResourceGroup \
  --server myServer \
  --name ProductionDB \
  --time "2026-01-30T14:30:00"
Key Features
  • Up to 100 TB database size
  • Rapid backup & restore (minutes vs hours)
  • Read scale-out with up to 4 named replicas
  • T-SQL compatibility (SQL Server features)
  • Zone-redundant availability
  • Independent testing shows 68% better performance vs Aurora
Use case: Enterprise application migrating from on-premise SQL Server that has grown to 50 TB. Hyperscale provides SQL Server compatibility while handling massive scale. Named replicas serve reporting workloads without impacting OLTP performance.

Azure HorizonDB (Limited Preview)

Microsoft's upcoming cloud-native PostgreSQL engine built with Rust for performance and security. Currently in limited preview, HorizonDB promises 3x better throughput than open-source PostgreSQL with modern cloud-native features.

Highlighted Features (Preview)
  • Disaggregated compute and storage (like Aurora)
  • Scale-out compute: up to 3,072 vCores
  • Storage: up to 128 TB
  • Rust-based storage engine for security & performance
  • Native AI capabilities (vector search, model management)
  • Sub-millisecond multi-zone commit latencies
  • PostgreSQL 19 contributions by Microsoft
Note: HorizonDB is not yet generally available (as of early 2026). It shows promise as a future competitor to Aurora and AlloyDB, but production use should wait for GA release.

Feature Comparison & Decision Guide

Complete Feature Matrix

FeatureAWS AuroraGoogle SpannerCosmos DB PostgreSQLAzure SQL Hyperscale
Max Database Size128 TB (auto-scaling)Unlimited (petabytes)20 TB per node100 TB
Consistency ModelEventually consistent (cross-region)Globally strong (external consistency)Eventually consistentEventually consistent (replicas)
Multi-Region WritesNo (1 primary region)Yes (active-active)No (1 primary)No (1 primary)
Availability SLA99.99% (4 nines)99.999% (5 nines, multi-region)99.99%99.99%
Failover Time30-120 secondsTransparent (no downtime)60-120 seconds30-120 seconds
SQL CompatibilityMySQL, PostgreSQLPostgreSQL, GoogleSQLPostgreSQL (Citus extension)SQL Server (T-SQL)
Auto-Scaling StorageYes (10 GB - 128 TB)Yes (unlimited)Manual (add worker nodes)Yes (up to 100 TB)
Serverless OptionAurora Serverless v2Autoscaling computeNoServerless tier available
Read ReplicasUp to 15 (same region)Unlimited read-only replicasHorizontal scaling with workersUp to 4 named replicas
Point-in-Time RestoreUp to 35 daysUp to 7 daysUp to 35 daysUp to 35 days
Backtrack / Time TravelYes (up to 72 hours)Version history (7 days)NoNo
Clone DatabaseYes (copy-on-write)NoNoDatabase copy (not instant)

Performance Characteristics

MetricAuroraSpannerCosmos DB PGSQL Hyperscale
Write Latency (regional)5-10ms10-20ms5-15ms5-10ms
Write Latency (global)100-200ms (cross-region replication)50-100ms (synchronous global)N/A (single region writes)N/A
Read Latency (local)1-5ms (from replica)5-20ms (strong consistency)1-5ms1-5ms
Throughput (per node)~100K queries/sec~10K queries/sec~50K queries/sec~80K queries/sec
Horizontal ScalingRead replicas onlyFull (read & write)Add worker nodesRead replicas only

Pricing Comparison

AWS Aurora
  • Storage: $0.10/GB/month
  • Compute: $0.29-$4.05/hour (instance) or $0.12/ACU-hour (serverless)
  • I/O: $0.20/million requests
  • Example: 1 TB storage + db.r6g.xlarge 24/7 = $100 + $263 + ~$50 I/O = ~$413/month
Google Spanner
  • Compute: $0.90/hour/node (regional) or $3.00/hour/node (multi-region)
  • Storage: $0.30/GB/month
  • Network: Standard egress charges
  • Example: 1 TB storage + 3 nodes multi-region 24/7 = $300 + $6,480 = $6,780/month
Cosmos DB PostgreSQL
  • Compute: $0.24-$1.92/vCore-hour (depends on tier)
  • Storage: $0.20/GB/month
  • High Availability: +100% for standby
  • Example: 1 TB storage + 4 vCore coordinator + 2x 8 vCore workers = ~$500/month
Azure SQL Hyperscale
  • Compute: $1.00-$14.00/vCore-hour
  • Storage: $0.119/GB/month
  • Backup storage: $0.20/GB/month
  • Example: 1 TB storage + Gen5 8 vCore 24/7 = $119 + $1,400 = $1,519/month
Cost Observation: Aurora is most cost-effective for regional workloads. Spanner is premium-priced for global consistency guarantees. Azure options fall in between, with Cosmos DB PostgreSQL competitive for horizontal scaling needs.

Decision Guide

Choose AWS Aurora if:
  • Your infrastructure is primarily on AWS
  • Need MySQL or PostgreSQL compatibility
  • Regional high availability is sufficient
  • Cost-sensitive workload (best price/performance for regional)
  • Read-heavy applications that benefit from 15 read replicas
  • Variable workloads that benefit from Aurora Serverless v2
  • Need instant database cloning or backtrack for testing
Choose Google Cloud Spanner if:
  • Need global strong consistency (not eventual)
  • Multi-region active-active writes are required
  • Financial transactions, inventory, or other use cases where consistency is critical
  • 99.999% uptime requirement (5 nines SLA)
  • Can justify premium pricing for unique global consistency guarantees
  • Horizontal scaling across continents with ACID guarantees
  • Need transparent failover with zero downtime
Choose Azure Cosmos DB for PostgreSQL if:
  • Your infrastructure is primarily on Azure
  • Multi-tenant SaaS application (tenant-based sharding)
  • Need PostgreSQL compatibility with horizontal scaling
  • Real-time analytics dashboards on operational data
  • Want open-source foundation (Citus) to avoid lock-in
  • Time-series data or event logging at scale
Choose Azure SQL Database Hyperscale if:
  • Your infrastructure is primarily on Azure
  • SQL Server compatibility is required (T-SQL, CLR, SQL Agent)
  • Need massive single database (>10 TB)
  • Migrating from on-premise SQL Server
  • Fast backup & restore is critical (snapshot-based)
  • Need zone redundancy for regional high availability

Key Trade-offs to Consider

Consistency vs Latency

Spanner's global consistency comes with higher latency (50-100ms for writes). Aurora's eventual consistency provides lower latency (<10ms) but cross-region reads may be stale. Choose based on whether correctness or speed matters more.

Cost vs Features

Aurora is most economical for regional workloads. Spanner costs 10-15x more but provides unique global guarantees. Cosmos DB PostgreSQL offers middle ground with horizontal scaling. Consider whether premium features justify premium pricing.

Complexity vs Capabilities

Aurora and SQL Hyperscale are simpler to operate (single primary, read replicas). Spanner and Cosmos DB PostgreSQL require understanding sharding, distribution keys, and global replication. More capability means more complexity.

Vendor Lock-in vs Best-of-Breed

Aurora (AWS), Spanner (GCP), and Azure options tie you to a cloud provider. Cosmos DB PostgreSQL uses Citus (open source) for easier migration. Consider whether best-in-class features justify potential lock-in.

Key Takeaways

  • Scaling relational databases requires trade-offs. Aurora prioritizes regional performance and cost-effectiveness. Spanner prioritizes global consistency at premium pricing. Azure offers multiple paths based on compatibility needs.
  • Aurora excels for AWS-centric regional workloads. Decoupled storage, 15 read replicas, Aurora Serverless v2, backtrack, and clone features make it ideal for cost-sensitive applications needing MySQL/PostgreSQL compatibility.
  • Spanner is unique for global strong consistency. TrueTime and Paxos consensus enable ACID transactions across continents. Worth the premium price when correctness matters more than cost (financial services, inventory systems).
  • Cosmos DB for PostgreSQL shines for multi-tenant SaaS. Citus-based horizontal sharding with tenant isolation. Open-source foundation reduces lock-in. Ideal for real-time analytics on operational data.
  • SQL Hyperscale extends SQL Server to massive scale. Best for Azure workloads needing T-SQL compatibility with fast backups, named replicas, and up to 100 TB databases. Zone redundancy provides regional high availability.
  • Choose based on requirements, not hype. Most applications don't need global consistency - Aurora's regional replication suffices. Only pay for Spanner's guarantees if you truly need them. Consider cloud ecosystem, compatibility, and cost.
  • Industry adoption: Aurora dominates AWS ecosystems, Spanner powers Google's critical services and high-consistency use cases, Azure options serve enterprise migrations and PostgreSQL/SQL Server workloads at scale.