Database Replication Patterns


Replication Fundamentals

Database replication copies data from one server to another for redundancy, read scaling, and disaster recovery.

Synchronous Replication

The primary waits for replicas to acknowledge writes:




-- PostgreSQL synchronous replication


synchronous_commit = on


synchronous_standby_names = '2 (standby1, standby2, standby3)'




SELECT application_name, state, sync_state, sync_priority


FROM pg_stat_replication;





Synchronous replication guarantees no data loss but increases latency.

Asynchronous Replication

The primary does not wait for replicas:




def check_replication_lag():


cur.execute("""


SELECT client_addr, application_name,


pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_bytes,


EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp())) AS lag_seconds


FROM pg_stat_replication;


""")


for row in cur.fetchall():


if row[3] > 60:


alert(f"Replication lag critical on {row[1]}")





Conflict Resolution

Multi-primary replication requires conflict resolution:




class ConflictResolver:


strategies = {


"last_write_wins": lambda a, b: a if a["timestamp"] > b["timestamp"] else b,


"majority_wins": lambda versions: Counter(versions).most_common(1)[0][0]


}





Replication Topologies

| Topology | Pros | Cons | |----------|------|------| | Primary-replica | Simple | Single point of failure | | Multi-primary | HA writes | Conflict resolution needed | | Cascading | Reduced primary load | Increased lag |

Conclusion

Choose synchronous for zero data loss, asynchronous for performance. Monitor replication lag closely. Test failover procedures regularly.