The key choice is when the primary considers a write done. With synchronous replication, the primary waits for at least one replica to confirm it has the change before telling the client the write succeeded. This guarantees the replica is current, but the write is only as fast as the slowest replica it waits for, and if that replica is down the write stalls.
With asynchronous replication, the primary acknowledges the write immediately and streams it to replicas in the background. This is fast and the primary never waits, but it opens a gap: for a brief moment the replicas are behind the primary. That gap is replication lag, often a few milliseconds but sometimes seconds under load.
Replication lag causes a specific, surprising bug. A user writes something, the write goes to the primary, then their next read is served by a replica that has not caught up yet, so their own change appears to have vanished. This is the read-your-own-writes problem. Common fixes are to route a user's reads to the primary for a short window after they write, or to use replicas that track how far behind they are and skip the ones that are too stale.