High-Performing Databases
Aurora vs RDS: feature-by-feature breakdown
Aurora commits every write to six storage nodes across three AZs before it acknowledges; RDS writes to one EBS volume and ships a copy to a passive standby. That single split in the storage layer is where the whole Aurora-versus-RDS answer lives, and almost every scenario stem (sub-100 ms replica lag, ~1 minute failover, backtrack, cloning) traces straight back to it. Aurora is RDS's cloud-native cousin, MySQL- and PostgreSQL-compatible at the wire level, but the engine underneath is a different machine, and the exam tests when that machine earns its keep and when plain RDS suffices.
Storage architecture (the one difference everything else follows from; the figure below shows both topologies):
- RDS: traditional engine with EBS storage. Multi-AZ = synchronous physical replication of the EBS storage[19] to a passive standby in another AZ, block-level, not the engine's binlog; binlog (logical) replication is the async path RDS Read Replicas use.
- Aurora: distributed storage layer. Each write commits to 6 storage nodes across 3 AZs[11] before acknowledging. Storage auto-scales from 10 GB up to 256 TiB on current engine versions[11] (128 TiB on older versions). Replicas read from the shared storage (no log shipping).
HA and failover:
- RDS Multi-AZ: 60-120 sec failover. Standby NOT readable.
- RDS Multi-AZ DB cluster (newer for MySQL/PostgreSQL): 1 writer + 2 readable standbys across 3 AZs. ~35 sec failover.
- Aurora: 1 writer + up to 15 readers. Reader can auto-promote on writer failure (~1 min). All readers are read-only but accessible.
Replication lag:
- RDS Read Replicas: async; lag from seconds to minutes under heavy writes.
- Aurora Replicas: shared storage means typical < 100 ms lag (often < 10 ms).
Storage features unique to Aurora:
- Backtrack[12] (MySQL only): rewind cluster up to 72 hours in-place (no restore). For "oops, dropped a table" scenarios.
- Cloning: instant zero-copy clones using copy-on-write storage. Use for dev/test branches off production data.
- Aurora Global Database: cross-region replication < 1 s RPO; managed promote ~1 min RTO.
- Aurora Serverless v2[13]: ACU-based autoscaling in 0.5-ACU increments (0 → 256 ACUs on current engine versions[20]; a 0 minimum enables automatic pause; older versions capped at 0.5 → 128). An ACU (Aurora Capacity Unit) is Aurora's unit of combined compute-plus-memory capacity.
- Parallel Query (MySQL): pushes WHERE/aggregation down to the storage layer for analytical queries on transactional data.
- Aurora I/O-Optimized: switch billing modes (pay more for compute, zero per-I/O). Break-even at ~25% I/O of total Aurora cost.
Storage features unique to RDS:
- Other database engines: Oracle, SQL Server, MariaDB (only RDS supports these). Aurora is MySQL/PostgreSQL only.
- Database-specific tuning knobs: more direct parameter-group control over engine internals.
(Stop/start instance, up to 7 days, pay storage only, is not unique to either side: you can pause RDS or Aurora alike.)
Cost:
- RDS: hourly instance + EBS storage + I/O charges.
- Aurora Standard: hourly instance + storage + per-I/O charges.
- Aurora I/O-Optimized: ~30% more compute cost; zero per-I/O.
- Aurora Serverless v2: per-ACU-hour pricing.
Decision pattern:
- New MySQL or PostgreSQL workload → Aurora (default).
- Need Oracle / SQL Server / MariaDB → RDS.
- Variable / unpredictable load → Aurora Serverless v2.
- Need < 100 ms read replica lag → Aurora.
- Need cross-region RPO < 1 s → Aurora Global Database.
- Need backtrack / cloning → Aurora.
- Tiny workload (< 1 vCPU) where Aurora minimum ($0.10/ACU-hr) is too high → RDS t3.micro etc.
- Legacy app with specific Oracle/SQL features → RDS for those engines.
DynamoDB partition design: key shapes, GSI patterns, adaptive capacity
DynamoDB's performance depends entirely on partition key design. A poorly-distributed key creates hot partitions that throttle writes regardless of total provisioned capacity. This section gives you the key-shape rules that prevent that. The figure above shows the hierarchy those rules govern: a table's items fan out across partitions by hash(partition_key), and within each partition the sort key orders items.
Partition basics:
- Items physically distributed across partitions by
hash(partition_key). - Each partition supports up to 3 000 RCU + 1 000 WCU (read and write capacity units, DynamoDB's per-second throughput currency; figures apply in provisioned mode).
- A single hot key consuming > 1 000 WCU throttles even if the table has 100 000 WCU provisioned.
Adaptive capacity[16] (since 2018):
- DynamoDB auto-shifts capacity TO hot partitions FROM cold ones in the same table.
- Works at the partition level, not the key level. Still bounded by per-partition limits.
- Doesn't eliminate hot-key problems for low-cardinality partition keys.
Key cardinality matters:
- High-cardinality partition key (UUIDs, customer IDs, order IDs): writes distribute evenly. No hot partition issues.
- Low-cardinality key (e.g.
"tenantType"with values"premium"and"basic"): all writes hit 2 partitions max. Throttled at 1 000 WCU each → 2 000 WCU table-wide ceiling.
Composite keys (the common pattern):
Use partition_key + sort_key. The partition key shards; the sort key orders within a partition.
- Partition key =
userId→ all that user's items live in one partition. - Sort key =
timestamp→ query "most recent N items for this user" viaQuerywithScanIndexForward=false, Limit=N.
Write sharding for very hot logical keys:
If one user generates 10 000 writes/sec (above 1 000 WCU partition limit), shard the key:
- Use
userId#0..Nas partition key (where N is a fixed bucket count). - Writes randomly pick a bucket; reads query all N partitions.
- Trades write hot-partition for fan-out reads.
Global Secondary Indexes (GSI):
- Index with a DIFFERENT partition key + (optional) sort key than the base table.
- Eventually consistent reads (typically sub-second lag).
- Has its own RCU/WCU provisioning (or on-demand), separate from the base table.
- Up to 20 GSIs per table.
- Use for: query patterns that aren't supported by the base table's keys (e.g. base table is by
orderId, GSI is bycustomerIdto look up all orders for a customer).
Local Secondary Indexes (LSI):
- Index with the SAME partition key as base table but different sort key.
- Strongly consistent reads supported.
- Must be created at table-creation time (can't add later).
- Counts against the 10 GB per-partition-key item collection limit.
- Rarely the right answer on the exam: usually GSI fits better.
DynamoDB Streams[18] (change capture):
- 24h retention.
- Stream record options:
KEYS_ONLY,NEW_IMAGE,OLD_IMAGE,NEW_AND_OLD_IMAGES. - Consumer pattern: Lambda triggered by stream → react to changes (audit, propagate to OpenSearch, invalidate cache).
- Enables DynamoDB Global Tables under the hood (multi-region multi-active).
TTL (time-to-live):
- Auto-delete items after a timestamp (specified in an item attribute).
- Deletes are best-effort (typically within 48h of TTL).
- Free deletes (don't consume WCU).
- Use for: session tables, time-limited tokens, log cleanup.
DAX setup: VPC config, cluster sizing, write-through semantics
DAX (DynamoDB Accelerator)[15] is a write-through cache in front of DynamoDB. Reads through DAX = microseconds (vs single-digit ms direct). Sits in your VPC. This section covers when DAX beats a generic cache, how a cluster is laid out, and the consistency trade-off you accept for the speed.
Why DAX over ElastiCache for DynamoDB caching (ElastiCache is AWS's managed Redis/Memcached service; the next section's topic):
- DynamoDB-native API: code uses the standard DynamoDB SDK with the DAX endpoint. No application changes beyond endpoint swap.
- Write-through built-in: writes go to DAX AND DynamoDB; cache stays consistent.
- No cache-invalidation logic: DAX handles it.
- vs ElastiCache: ElastiCache requires custom application code to fetch from DynamoDB on miss + populate cache + invalidate on writes. More flexible but more code.
Architecture (the figure below traces the three request paths):
- DAX cluster = 1 primary node + 0-9 read replicas across multiple AZs.
- Primary handles writes (write-through to DynamoDB); replicas serve reads.
- Up to 10 nodes per cluster. Sizing example: 1 primary + 2 replicas across 3 AZs.
Cache modes:
- Item cache: caches individual items by primary key. TTL configurable (default 5 min). LRU eviction.
- Query cache: caches Query and Scan results. TTL configurable (default 5 min).
Eventual consistency by default. DAX reads return potentially stale data (from cache). For strongly-consistent reads, configure the request to bypass DAX and go directly to DynamoDB.
Setup steps:
- Create DAX cluster: pick node type (e.g.
dax.r5.large), node count, VPC + subnets. - Create a subnet group spanning multiple AZs.
- Create an IAM role for DAX nodes (allows access to underlying DynamoDB tables).
- Set up security group: allow port 8111 (DAX cluster comm).
- Update application: install DAX SDK; point DynamoDB client at DAX cluster endpoint.
Latency impact:
- Cached read: ~1 ms (within VPC). That's the end-to-end round trip including the network hop; the cache itself answers in the microseconds quoted above.
- Cache miss: DAX fetches from DynamoDB (single-digit ms), populates cache, returns.
- Cached write: write-through to DynamoDB + cache update (~few ms).
Cost:
- DAX nodes priced like EC2 instances ($/hr).
- Per-node sizing matters (but replicas hold copies of the primary's cached data[21], so effective cache capacity ≈ one node's RAM; adding nodes scales read throughput and availability, not cache size).
- Magnitude check against current DAX pricing[22]: a small 3-node cluster of mid-size nodes runs hundreds of dollars a month; a large 10-node cluster of big instances costs tens of times more.
When DAX is the right answer:
- Read-heavy DynamoDB workload (>80% reads).
- Hot keys generating GetItem traffic.
- Microsecond read latency required.
- Workload can tolerate eventual consistency.
When NOT:
- Write-heavy workload. DAX doesn't help; writes always go to DynamoDB.
- Strong-consistency reads required. DAX bypasses cache for those.
- Small workload. ElastiCache or direct DynamoDB is cheaper.
- Workload uses Transaction APIs heavily. TransactGetItems / TransactWriteItems bypass DAX.
Compared to DynamoDB built-in caching:
- DynamoDB has no built-in cache at the API layer (the storage engine has its own internal cache, but it's not exposed).
- DAX is the supported caching solution. Custom ElastiCache + cache-aside is an alternative for finer control.
Common exam scenarios:
- 'DynamoDB read latency too high' → DAX.
- 'Microsecond reads against DynamoDB' → DAX.
- 'Cache DynamoDB with minimal app changes' → DAX.
- 'Cache DynamoDB with custom invalidation logic' → ElastiCache + custom code.
ElastiCache: cluster mode, shard count, replica strategy
ElastiCache offers managed Redis and Memcached. Each has very different scaling and HA models. Picking wrong means you can't shard, or you can't replicate, or you're paying for features you don't need. The figure above contrasts the two Redis cluster modes that decide whether you can shard at all: a single shard versus data spread across many shards by hash slot.
Redis cluster modes:
Cluster Mode Disabled (single-shard):
- 1 primary node + 0-5 replicas (read-only).
- Single shard → all data on one node.
- Failover: replica auto-promotes (~1 min).
- Max RAM: limited by largest available node type.
- Use for: small workloads where total dataset fits on one node + need replicas for read scaling or HA.
Cluster Mode Enabled (sharded):
- 1-500 shards; each shard is 1 primary + 0-5 replicas.
- Data partitioned across shards by hash slot (16 384 slots distributed across shards).
- Total cluster capacity = shard count × per-shard RAM.
- Failover: per-shard, automatic.
- Use for: larger datasets, write-scaling workloads, very-high-throughput.
Redis Serverless (newer):
- Auto-scales ECPUs and storage independently.
- Multi-AZ HA built-in.
- No node management.
- Trade-off: less control over individual node placement.
Memcached:
- No replication; no persistence.
- Multi-threaded per node (one node uses all cores; Redis is single-threaded with side processes).
- Auto-discovery: clients auto-discover all nodes in the cluster.
- Use for: simple key-value caching where lost data is acceptable.
- Wrong for: anything needing data structures (Redis lists/sets/sorted sets), persistence, or replication.
Redis vs Memcached (the canonical exam question; AWS's own comparison[17]):
| Feature | Redis | Memcached |
|---|---|---|
| Data structures | Strings, lists, sets, sorted sets, hashes, streams, geo, hyperloglog | Strings only |
| Persistence | Optional (snapshot + AOF) | None |
| Replication | Yes (read replicas, multi-AZ) | No |
| Cluster mode (sharding) | Yes | Manual via client-side hashing |
| Pub/sub | Yes | No |
| Transactions | Yes (MULTI/EXEC) | No |
| Multi-threading | Single-threaded (per node) | Multi-threaded |
| Snapshots / backups | Yes | No |
Default answer: Redis unless the question explicitly says 'simple multi-threaded caching'.
Caching strategies (applies to both):
- Lazy loading: read miss → fetch from DB → cache. Cache only holds requested data. Stale data possible (until TTL).
- Write-through: every write goes to cache AND DB. The same semantics DAX applies natively (previous section). Always fresh; slower writes; cache may hold rarely-read data.
- Write-around: writes go to DB only; cache populated on read miss. Reduces cache pollution from write-heavy workloads.
- TTL-based expiration: time-bounded staleness regardless of strategy.
Common patterns:
- Session store (Redis): Cluster Mode Disabled with replication for HA; persistence on (RDB + AOF).
- Leaderboard (Redis): Cluster Mode Enabled with sharding for write scaling; uses sorted sets.
- Database read cache (Redis or Memcached): cluster mode for scale; lazy-loading; short TTL.
- Geo-spatial queries (Redis only): GEOADD + GEORADIUS commands.
Reserved Nodes:
- 1- or 3-year commitment for ~30-55% discount (similar to EC2 RIs).
- All-Upfront / Partial-Upfront / No-Upfront payment options.
- Used after running on-demand for ~30 days to verify the right node type.
Database services by access pattern
| Service | Data model | Latency | Scale | Best for |
|---|---|---|---|---|
| Aurora (MySQL / PG) | Relational | Single-digit ms | Up to 256 TiB, 15 read replicas | Most new OLTP workloads |
| RDS (engines) | Relational | Single-digit ms | Up to 64 TiB primary (SQL Server 16 TiB on gp3; up to 256 TiB total on Oracle/SQL Server with additional volumes); 15 read replicas (async; Oracle recommends ≤5) | Oracle / SQL Server / MariaDB engines |
| DynamoDB | Key-value / document | Single-digit ms (μs with DAX) | Effectively unlimited | Known access patterns, single-key reads / writes |
| ElastiCache Redis | Key-value in-memory + structures | Sub-millisecond | TB-scale clusters | Hot data caching, session store, leaderboards |
| ElastiCache Memcached | Simple key-value in-memory | Sub-millisecond | Multi-node sharded | Simple object caching (no persistence, no advanced types) |
| Redshift | Columnar MPP | Seconds-minutes | Petabyte | Data warehouse + BI |
| OpenSearch | Inverted index + JSON | Single-digit ms search | TB-scale | Search + log analytics + observability |
| Neptune | Graph (Gremlin + SPARQL) | Single-digit ms traversal | Billions of edges | Recommendation, fraud, social graph |
| DocumentDB | MongoDB-compatible document | Single-digit ms | Up to 128 TiB cluster, 15 read replicas | MongoDB workloads needing managed service |
| Timestream | Time-series | Millisecond writes | Trillions of points | IoT, observability, monitoring data |
Sharp facts the exam loves — give these one last read before exam day.
Cheat sheet
Sharp facts the exam loves — scan these before test day.
- Pick the database engine by access pattern, not by data model
Database engine is chosen by how the data will be queried, not by the data model it superficially resembles, because the access pattern determines performance at scale. Use relational (
RDS,Aurora) for transactions, joins, and ad-hoc queries; key-value (DynamoDB) for predictable single-item reads and writes at any scale; document (DocumentDB) for JSON-shaped data; and search (OpenSearch) for full-text. For specialized shapes the purpose-built engines win outright.Timestreamfor time-series andNeptunefor graph traversal, because they index and store the data the way those queries actually walk it.Trap Forcing every workload onto a relational engine just because the data looks like rows: full-text search, graph traversal, and at-scale key-value lookups all underperform on RDS compared to the engine built for them.
- Scale reads with replicas; scale writes with sharding
Reads and writes scale by different mechanisms, so match the fix to the bottleneck. Read replicas multiply read throughput by serving queries off copies:
RDSgives up to 15 async Read Replicas per source, and Aurora Replicas go to 15 too but with typically <100 ms lag. Yet none absorb a single write. Because the single writer still caps write throughput, you scale writes by spreading them out: designDynamoDBpartition keys for high cardinality and lean on adaptive capacity, or shard a relational workload across multiple Aurora clusters by tenant or key.Trap Adding read replicas to fix a write bottleneck: they only absorb read traffic, so the single writer still caps how fast you can write.
- Default to Aurora unless you need stock RDS Oracle/SQL Server
Aurorais the default relational choice: wire-compatible with MySQL and PostgreSQL, it replaces RDS's single-volume storage with a distributed layer that keeps 6 copies across 3 AZs, fails over in under 30 s, and offers Aurora Serverless v2 for on-demand scaling. Its storage grows automatically[11] up to 256 TiB on current engine versions (128 TiB on older ones) with no manual resize, no downtime, and no provisioning, and because you pay only for what you use, dropping a table actually shrinks billed storage. Stay on stock RDS only when you specifically need the Oracle or SQL Server engine, which Aurora doesn't run.Trap Assuming you must pre-provision Aurora storage and resize it later like classic RDS: Aurora scales storage on its own, so that capacity planning is wasted effort.
- Need microsecond DynamoDB reads → put DAX in front
DAX[15] is a managed in-memory cache purpose-built for
DynamoDB, the answer when single-digit-millisecond reads aren't fast enough: it returns cached reads in microseconds while writes pass straight through DAX to the table. It's read-through and write-through/write-around, eventually consistent by default, runs inside your VPC, and speaks the DynamoDB API itself, so your application points at DAX and the code barely changes. That API compatibility sets it apart from a generic cache, where you'd write and maintain the caching logic yourself.Trap Reaching for ElastiCache to cache DynamoDB: DAX is the DynamoDB-native cache that speaks the same API, whereas ElastiCache leaves you to manage the cache-aside pattern yourself.
7 questions test this
- A company uses Amazon DynamoDB for an e-commerce application that displays product information. The application requires microsecond…
- A financial services company is building a real-time trading application that reads frequently accessed market data from Amazon DynamoDB.…
- A financial services company is deploying a customer-facing application that requires high availability. The application uses Amazon…
- A gaming company runs a social gaming application that uses Amazon DynamoDB to store player profiles. The application experiences heavy…
- A solutions architect is designing a product catalog application that uses Amazon DynamoDB. The application has a read-heavy workload where…
- A company is building a real-time gaming leaderboard application using Amazon DynamoDB. The application needs microsecond read latency to…
- A social media company has a DynamoDB table that stores user posts. The application writes approximately 50,000 new posts per second and…
- Aurora replicas lag <100 ms (often <10 ms) via shared storage
Aurora replicas stay far fresher than RDS async replicas because of how they replicate: they read directly from the shared distributed storage layer[11] the writer already persisted to, rather than replaying a shipped binary log. Removing the log-shipping pipeline entirely puts replica lag typically under 100 ms and often under 10 ms. You can run up to 15 of them, the reader endpoint load-balances across the set, and on writer failure a replica is promoted in roughly a minute.
4 questions test this
- A financial services company runs a customer-facing application that performs frequent read operations against an Amazon Aurora MySQL…
- A solutions architect is designing a high-throughput database solution using Amazon Aurora MySQL. The application requires that read…
- A company is migrating a read-heavy e-commerce application to AWS. The application must scale to handle sudden traffic spikes during…
- A company runs a high-traffic e-commerce application that uses Amazon Aurora MySQL as its database. The application experiences…
- DynamoDB throttling → fix the partition key cardinality first
DynamoDB throttling points first at partition key cardinality, because the table spreads its throughput across physical partitions by hashing that key. Adaptive capacity[16] automatically shifts capacity toward busy partitions and absorbs mild skew, but it can't rescue a low-cardinality key that funnels traffic onto one hot partition. Fix it at the source by choosing high-cardinality keys, UUIDs, hashes, or composite keys like
tenant#item, so reads and writes fan out evenly instead of concentrating.Trap Adding a GSI to relieve a hot partition: a GSI lets you query other attributes but does nothing for hot-key writes on the base table.
- ElastiCache: default to Redis unless you only need simple multi-threaded caching
Between the two ElastiCache engines, Redis[17] is the default because it's far more than a cache: rich data structures (lists, sets, sorted sets, streams, geo, hyperloglog), plus pub/sub, persistence, replication, cluster-mode sharding, and transactions. Memcached is deliberately minimal (plain multi-threaded key-value with auto-discovery, no persistence and no replication) which gives it an edge only on simple, horizontally-scaled caching of opaque values. So pick Memcached when multi-threaded simple caching is the whole requirement, Redis for anything needing those richer capabilities.
Trap Picking Memcached when the requirement calls for persistence, replication, or sorted-set/pub-sub features. It has none of those, so it simply can't satisfy them.
17 questions test this
- A company has a gaming application that maintains real-time leaderboards showing player rankings. The application needs to sort and…
- A global e-commerce company has web applications deployed in the us-east-1 and eu-west-1 Regions. The company uses Amazon ElastiCache for…
- A solutions architect is designing a caching layer to reduce database load for a high-traffic e-commerce application. The application runs…
- A company runs a high-traffic content management system that caches rendered HTML pages. The application requires a simple, multithreaded…
- A company runs a large-scale web application that caches frequently accessed database query results. The application generates simple…
- A company is deploying a new web application on Amazon EC2 instances behind an Application Load Balancer. The application requires session…
- A company is building a real-time gaming leaderboard application that needs to store and sort player scores. The application must support…
- A company has a legacy application that performs extensive database queries to retrieve product catalog data. The application uses a…
- A company runs a real-time gaming leaderboard application that requires microsecond latency for read operations. The application uses…
- A company is building a distributed web application that runs across multiple Amazon EC2 instances behind an Application Load Balancer. The…
- A gaming company wants to add a real-time leaderboard that ranks millions of players by score. Scores change constantly, and the…
- A company is migrating a web application to AWS. The application stores user session data that must persist across application restarts.…
- A company is migrating a web application to AWS. The application stores user session data that must survive node failures to prevent users…
- A company runs a high-traffic web application that caches database query results using Amazon ElastiCache for Redis. The application…
- A company operates a multi-tier web application that experiences variable traffic patterns throughout the day. The application caches…
- A financial services company is migrating an application to AWS that requires storing user session data with strict compliance…
- A gaming company needs to implement a real-time leaderboard that tracks player scores for millions of concurrent users. The leaderboard…
- Need DynamoDB change-data-capture → enable DynamoDB Streams
DynamoDB Streams[18] is DynamoDB's built-in change-data-capture feed, the way to react to every insert, update, and delete: it captures each as an ordered, per-item sequence of stream records, with 4 view types (KEYS_ONLY, NEW_IMAGE, OLD_IMAGE, NEW_AND_OLD_IMAGES) so you choose how much of the before/after image you receive. The usual consumer is
Lambda, which reacts to each change and fans it out downstream, and the same stream mechanism powers Global Tables' cross-region replication under the hood. Records are retained for 24 hours, which shapes how the consumer must be designed.Trap Counting on Streams as durable event storage: records expire after 24h, so a consumer that's down longer permanently loses those changes.
- Redshift joins: KEY co-locates large↔large; ALL replicates small dimensions
Redshift's distribution style decides where rows physically live across slices, and the goal is to avoid shuffling data over the network at join time. For a join between two large tables, set DISTSTYLE KEY on the shared join column in both so matching rows land on the same slice and Redshift skips redistribution. For a small, slowly-changing dimension (typically under a few million rows), use DISTSTYLE ALL to keep a full copy on every node, making joins on any column local without moving data. EVEN is the default and spreads rows blindly, so it's rarely best once you know your join patterns.
Trap Applying DISTSTYLE ALL to a large table: replicating a big table onto every node wastes storage and slows writes, so ALL is only for small dimension tables.
3 questions test this
- A company uses Amazon Redshift for its data warehouse. The analytics team reports that queries joining a large fact table (500 million…
- A company is designing an Amazon Redshift data warehouse with a 500 million row sales fact table and multiple dimension tables including a…
- A company is migrating a data warehouse to Amazon Redshift. The solutions architect is designing the table for a dimension table with…
- To benefit from Aurora Auto Scaling, connect to the reader endpoint
Aurora Auto Scaling adds and removes read replicas with demand, but those replicas only receive traffic when clients connect through the reader endpoint rather than individual instance endpoints. The reader endpoint is a managed DNS name that round-robins connections across all available readers and automatically begins including a new replica once it passes health checks, so the capacity Auto Scaling provisions actually gets used. Point read traffic there and scaling is transparent; point it at fixed instance endpoints and the new replicas sit idle.
Trap Hard-coding instance-specific endpoints: the new replicas Auto Scaling spins up then receive no traffic, which defeats the whole point of scaling.
10 questions test this
- A company runs a customer-facing application that uses an Amazon Aurora MySQL database. The application experiences unpredictable…
- A company uses an Amazon Aurora PostgreSQL cluster with Aurora Auto Scaling enabled. The Auto Scaling policy is configured with a target…
- A retail company has configured Aurora Auto Scaling for its Amazon Aurora PostgreSQL cluster with a target tracking policy based on average…
- A media streaming company has an Amazon Aurora MySQL cluster with Aurora Auto Scaling enabled. The scaling policy is configured with a…
- A company runs a read-heavy e-commerce application that uses an Amazon Aurora MySQL DB cluster. The application experiences unpredictable…
- A company is migrating a read-heavy e-commerce application to AWS. The application must scale to handle sudden traffic spikes during…
- A media streaming company operates an Amazon Aurora MySQL cluster with multiple Aurora Replicas to handle high read traffic. The company…
- A company runs a high-traffic e-commerce application that uses Amazon Aurora MySQL as its database. The application experiences…
- A solutions architect is designing a high-throughput web application that uses an Amazon Aurora PostgreSQL DB cluster. The application has…
- A company is running an e-commerce application with an Amazon Aurora MySQL cluster that experiences significant read traffic spikes during…
- "Oops, dropped a table" on Aurora MySQL → Backtrack rewinds in seconds
Aurora MySQL Backtrack[12] rewinds the existing cluster to a point up to 72 hours in the past, in seconds and without downtime, by moving the cluster back through its change records rather than restoring a backup. That makes it the fast recovery path for a logical mistake like a bad delete or accidental table drop, where the alternative (restoring from a snapshot or point-in-time) means provisioning a whole new cluster and waiting on it. Backtrack is Aurora MySQL only.
Trap Treating Backtrack like point-in-time restore: PITR provisions a separate new cluster from backups, whereas Backtrack reverts the existing cluster in place (and only on Aurora MySQL).
- Put RDS Proxy in front of RDS/Aurora for serverless connection storms
When a Lambda fleet's per-invocation connections threaten to exhaust an RDS or Aurora instance's limited connection slots, put RDS Proxy in front: a fully managed connection pool between clients and the database. It reuses a small set of warm connections, queues or sheds excess requests instead of letting them overwhelm the DB, and shortens failover by keeping client connections open while it reconnects to a healthy instance. It reads the database credentials from AWS Secrets Manager and lets clients authenticate to the proxy with IAM, so no DB password sits in the function. Reach for a bigger instance or read replicas instead only when the bottleneck is real query load, not connection churn.
Trap Assuming RDS Proxy always multiplexes: session state such as a statement larger than 16 KB or a temporary table 'pins' a connection to one client, which drops back to one-connection-per-client and erases the pooling benefit.
Also tested in
References
- Amazon RDS User Guide
- What is Amazon Aurora? (chapter index)
- Amazon DynamoDB overview
- What is Amazon ElastiCache
- Amazon Redshift overview
- Amazon OpenSearch Service
- Amazon Neptune
- Amazon DocumentDB
- Amazon Timestream
- Amazon Aurora overview
- Aurora storage and reliability (6 copies, 3 AZs)
- Aurora Backtrack (Aurora MySQL)
- Aurora Serverless v2
- Aurora Global Database
- DynamoDB Accelerator (DAX)
- DynamoDB partition keys + adaptive capacity
- ElastiCache Redis vs Memcached
- DynamoDB Streams
- https://aws.amazon.com/blogs/database/readable-standby-instances-in-amazon-rds-multi-az-deployments-a-new-high-availability-option/
- https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html
- https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DAX.concepts.html
- https://aws.amazon.com/dynamodb/pricing/on-demand/