Leaderless stores like Cassandra, Riak and the original Dynamo let any replica accept writes. That means replicas drift apart. A strong system design answer explains the three mechanisms that pull them back together.
A client reads from R replicas. If their versions differ, the coordinator returns the newest value and writes it back to the replicas that returned stale data. Data that's read often converges quickly; data that's never read stays stale, which is why read repair alone isn't enough.
If a target replica is down, another node accepts the write and stores a hint. When the target recovers, the hint is replayed. Mention the catch: hints are kept for a limited window (often hours), so a node that's down longer needs a full repair.
Replicas periodically compare data using Merkle trees: hash each key range, hash the hashes up a tree, and compare roots. Matching subtrees are skipped, so only differing ranges are streamed. This catches cold data that read repair never touches.
All three mechanisms need a rule for "newest". Options to name:
With N replicas, W + R > N makes a read overlap the latest write, and read repair then spreads that value. Point out that sloppy quorums with hinted handoff break the strict overlap guarantee during failures, which is a classic follow-up question.
Summary line: "Read repair fixes hot keys, hinted handoff covers short outages, Merkle-tree repair sweeps everything else."
Disclosure: I work on an AI copilot for system design interviews (Linkjob AI). Content is independent study notes.