Skip to content
intermediatePhase 45 · Databases

Read Replicas

Offload read traffic to replica databases for performance.

30m
0 problems
Topic Progress0%

Creating Replicas

Read replicas are copies of the primary database for handling read traffic.

How to Create Replicas

1. Start with primary database
2. Create snapshot or backup
3. Restore to new instance
4. Configure replication
5. Verify replication is working

PostgreSQL Replication Setup

-- Primary: Enable replication
ALTER SYSTEM SET wal_level = 'replica';
ALTER SYSTEM SET max_wal_senders = 10;
SELECT pg_reload_conf();

-- Create replication user
CREATE USER repl_user WITH REPLICATION;

-- Primary: pg_hba.conf
-- host replication repl_user 10.0.0.0/8 md5

-- Replica: recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=primary port=5432 user=repl_user'

MySQL Replication Setup

-- Primary: Enable binlog
[mysqld]
log-bin = mysql-bin
server-id = 1

-- Primary: Create replication user
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';

-- Replica: Configure
CHANGE MASTER TO
  MASTER_HOST='primary',
  MASTER_USER='repl_user',
  MASTER_AUTO_POSITION=1;
START REPLICA;

Cloud Database Replicas

# AWS RDS
aws rds create-db-instance-read-reparator \
  --db-instance-identifier replica-1 \
  --source-db-instance-identifier primary

# Google Cloud SQL
gcloud sql instances create replica-1 \
  --master-instance-name=primary \
  --region=us-central1

# Azure
az sql db replica create \
  --name replica-1 \
  --server primary-server \
  --resource-group mygroup

Replica Monitoring

-- Check replication status
SHOW REPLICA STATUS\\G

-- Key metrics:
-- Replica_IO_Running: Yes
-- Replica_SQL_Running: Yes
-- Seconds_Behind_Replica: 0

-- PostgreSQL
SELECT * FROM pg_stat_replication;

Replica Best Practices

  1. Monitor replication lag: Set up alerts
  2. Use dedicated replica instances: Don't mix read/write
  3. Size replicas appropriately: Match primary or larger
  4. Test failover regularly: Ensure replicas can promote
  5. Use connection pooling: For replica connections

Read Routing

Read routing directs read queries to appropriate replicas.

Routing Strategies

1. Round Robin
   Requests distributed evenly
   Simple, no state

2. Least Lag
   Route to replica with least lag
   Better consistency

3. Geographic
   Route to nearest replica
   Lower latency

4. Weighted
   Route based on replica capacity
   Better utilization

Application-Level Routing

# Python example
class ReadRouter:
    def __init__(self, primary, replicas):
        self.primary = primary
        self.replicas = replicas
        self.counter = 0
    
    def get_connection(self, write=False):
        if write:
            return self.primary
        
        # Round robin
        replica = self.replicas[self.counter % len(self.replicas)]
        self.counter += 1
        return replica

# Usage
router = ReadRouter(primary, [replica1, replica2, replica3])
conn = router.get_connection(write=False)  # Gets replica

Connection Pooling with Replicas

# PgBouncer configuration
[databases]
primary = host=primary port=5432 dbname=mydb
replica1 = host=replica1 port=5432 dbname=mydb
replica2 = host=replica2 port=5432 dbname=mydb

[pgbouncer]
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 25

Read Routing Best Practices

  1. Route reads to replicas: Free primary for writes
  2. Use connection pooling: Reduce connection overhead
  3. Monitor replica health: Remove unhealthy replicas
  4. Consider lag: Route to low-lag replicas for consistency
  5. Handle failover: Redirect if replica fails

Replication Lag Management

Managing replication lag ensures data consistency for reads.

What is Replication Lag

Primary: Write X = 1 at T=0
Replica: Receives X = 1 at T=100ms

Lag: 100ms

During lag:
- Primary has X = 1
- Replica has X = 0
- Reads from replica return stale data

Measuring Lag

-- PostgreSQL
SELECT now() - pg_last_xact_replay_timestamp() AS lag;

-- MySQL
SHOW REPLICA STATUS\\G
Seconds_Behind_Replica: 5

-- Monitor continuously
SELECT
  client_addr,
  state,
  sent_lsn,
  write_lsn,
  flush_lsn,
  replay_lsn,
  (sent_lsn - replay_lsn) AS lag_bytes
FROM pg_stat_replication;

Lag Thresholds

Acceptable lag by use case:

Critical (financial): < 1 second
Important (user data): < 5 seconds
Standard (analytics): < 30 seconds
Background (logs): < 60 seconds

Alert when lag exceeds threshold

Reducing Lag

1. Optimize Replication
   - Use parallel replication
   - Optimize network
   - Reduce transaction size

2. Hardware
   - Faster disks on replica
   - More CPU on replica
   - Better network

3. Configuration
   - Increase WAL buffers
   - Tune checkpoint settings
   - Optimize vacuum settings

Handling Lag in Application

# Read-after-write consistency
def get_user(user_id, after_write=False):
    if after_write:
        # Read from primary
        return primary_db.query(user_id)
    else:
        # Read from replica (may be stale)
        return replica_db.query(user_id)

# After writing, read from primary for N seconds
def update_user(user_id, data):
    primary_db.update(user_id, data)
    set_flag(user_id, 'read_primary', ttl=5)  # 5 seconds

Lag Monitoring Best Practices

  1. Continuous monitoring: Track lag over time
  2. Set alerts: Notify when lag exceeds threshold
  3. Dashboard visibility: Show lag in monitoring dashboard
  4. Historical trends: Track lag patterns
  5. Automated responses: Route to primary when lag high

Practice Problems

0/3solved
Design Read Replicas System

Design a scalable Read Replicas system. Cover high-level architecture, data model, and API design.

Solution
// Complete system design:
// - Functional + Non-functional requirements
// - Capacity estimation
// - Data model (SQL/NoSQL choice)
// - API endpoints
// - Component architecture
// - Scaling strategy
// - Monitoring & reliability
Read Replicas Scaling

How would you scale Read Replicas to handle 10x the current load? Identify bottlenecks and solutions.

Solution
// Scaling approach:
// 1. Load balancing
// 2. Database sharding/replication
// 3. Cache layer (Redis)
// 4. CDN for static assets
// 5. Async processing (queues)
// 6. Microservices decomposition
Read Replicas Failure Modes

Analyze potential failure modes for Read Replicas and design mitigation strategies.

Solution
// Failure mitigation:
// 1. Redundancy (multi-AZ)
// 2. Circuit breakers
// 3. Retry with backoff
// 4. Dead letter queues
// 5. Health checks
// 6. Graceful degradation

Quiz

1. What is the purpose of read replicas?

Question 1 options

2. What is read routing?

Question 2 options

3. What is replication lag?

Question 3 options

4. How do you handle read-after-write consistency?

Question 4 options

Flashcards

Question

What are read replicas?

Answer

Copies of primary database that handle read traffic. Reduces primary load, enables read scaling, provides high availability.

Question

What is read routing?

Answer

Directing read queries to appropriate replicas. Strategies: round robin, least lag, geographic, weighted.

Question

What is replication lag?

Answer

Delay between primary and replica data. Solutions: monitor lag, read-after-write consistency, optimize replication.

Question

How do you reduce replication lag?

Answer

Optimize replication (parallel, network), better hardware (faster disks), tune configuration (WAL buffers, checkpoints).

Question

What is Read Replicas?

Answer

Read Replicas is a key concept in system design.

Revision Notes

Key Takeaways

  • 1.Read replicas handle read traffic and reduce primary load
  • 2.Read routing directs queries to appropriate replicas
  • 3.Replication lag causes stale reads - monitor and mitigate
  • 4.Read-after-write consistency prevents stale data after writes
  • 5.Connection pooling improves replica connection efficiency

Interview Tips

  • Discuss read replica strategy for read-heavy workloads
  • Address replication lag implications for consistency
  • Consider geographic distribution of replicas
  • Mention connection pooling for replica connections

Cheat Sheet

Read Replicas - Cheat Sheet

Creating Replicas:

  1. Snapshot/backup primary
  2. Restore to new instance
  3. Configure replication
  4. Verify replication

Read Routing:

  • Round Robin: Even distribution
  • Least Lag: Better consistency
  • Geographic: Lower latency
  • Weighted: Better utilization

Replication Lag:

  • Monitor continuously
  • Set alerts for thresholds
  • Read-after-write consistency
  • Optimize replication

Best Practices:

  1. Monitor lag
  2. Use connection pooling
  3. Route reads to replicas
  4. Handle failover
  5. Test regularly