Replication & HA — Database

Replication adalah menduplikasi data dari 1 database (primary) ke 1 atau lebih database (replica/standby). Tujuan: high availability (kalau primary down, replic

Replication adalah menduplikasi data dari 1 database (primary) ke 1 atau lebih database (replica/standby). Tujuan: high availability (kalau primary down, replica ambil alih) dan scale read (distribute query read ke replica).

Kenapa Replication?

  1. High Availability (HA) — kalau primary crash/maintenance, replica jadi primary baru (failover). Downtime dari jam → detik.
  2. Read scaling — 90% traffic aplikasi biasanya read-heavy. Route read ke replica, write ke primary.
  3. Geographic distribution — replica di region berbeda untuk user yang jauh (Asia, EU, US).
  4. Backup tanpa ganggu primary — backup dari replica, primary tetap cepat.

Streaming Replication (PostgreSQL Default)

Primary kirim WAL (Write-Ahead Log) ke replica secara real-time. Replica apply WAL → state-nya selalu sinkron dengan primary.

┌─ Primary ─┐              ┌─ Replica 1 ─┐
│  Write    │── WAL ──→    │  Apply WAL   │  (read-only)
│  Read     │              └──────────────┘
│           │              ┌─ Replica 2 ─┐
│           │── WAL ──→    │  Apply WAL   │  (read-only)
└───────────┘              └──────────────┘

Synchronous vs Asynchronous Replication

Trade-off kunci: konsistensi vs performa.

Synchronous Asynchronous
Write latency Tinggi (tunggu replica ack) Rendah (fire-and-forget)
Data loss risk Nol Detik terakhir bisa hilang
Throughput Turun 10–30% Nyaris full
Cocok untuk Financial, critical data Most web apps

Postgres default: async. Enable sync per-replica dengan synchronous_standby_names di postgresql.conf.

Read Replica Pattern

Distribute query di level aplikasi:

// Laravel: config/database.php
"mysql" => [
    "read" => [
        "host" => ["10.0.0.10", "10.0.0.11"],  // replicas
    ],
    "write" => [
        "host" => ["10.0.0.1"],  // primary
    ],
    "sticky" => true,  // SELECT setelah INSERT tetap ke primary (stale read mitigation)
],

Aplikasi otomatis route SELECT ke replica, INSERT/UPDATE/DELETE ke primary.

Masalah #1: Replication Lag

Replica selalu sedikit terlambat vs primary (biasanya <100ms, tapi bisa lompat di bawah beban). Skenario yang bikin pusing:

User submit form → write ke primary
User redirect ke "sukses" page → read dari replica
Replica belum sempat apply WAL → user lihat data lama / 404

Solusi umum:

Failover — Ketika Primary Mati

Beberapa approach:

1. Manual failover (OK untuk startup kecil)

2. Automatic failover dengan Patroni / RDS Multi-AZ

Replica untuk Laravel/PostgreSQL di Production

Paling simple untuk startup: managed database dengan built-in replication.

Kalau self-host: Patroni + 3-node cluster + HAProxy/PgBouncer di depan. Lebih kompleks, lebih kontrol.

Checklist

Yang akan kamu pelajari