The fire drill
Failover is the fire drill this whole chapter exists for. The leader dies, a follower gets promoted, clients point at the new one. Tools automate the steps, and every step hides a trap.
Detection is guesswork. A leader that has missed its heartbeat for 10 seconds might be dead, might be busy, might be fine but briefly unreachable.
Call it dead too eagerly and you promote a new leader while the old one is still happily accepting writes. Now two machines take writes for the same data, their histories drift apart, and a human unpicks the mess by hand. Making certain the old leader cannot accept another write before you promote anyone is the unglamorous detail that separates real failover from a demo.
Picking the replacement costs you something. You promote whichever follower is furthest along, and with asynchronous copies even that one is missing the leader's last few writes.
Failover turns your replication gap directly into lost data, which is the strongest practical argument for keeping a synchronous copy of anything you truly cannot lose.
Multi-leader, and when it earns its place
Consider multi-leader only when you have to. It takes writes on several machines, usually one leader per region, so writes are fast everywhere and losing a whole region gets simpler to survive.
You have also brought back the exact problem one leader was avoiding. Two leaders can accept conflicting changes to the same row, and nobody finds out until their logs meet. Resolving by last writer wins silently throws one of them away. Merging properly in your application is principled and expensive to build.
Be honest about when it earns its place. Multi-leader is for a genuine need to write in several regions, not for ambition. If your users can live with writes crossing an ocean, take one leader plus regional read copies. That is the design that will not page you at 4 am to referee two versions of a row.
Worked example
GitHub's October 2018 incident is the canonical failover story. A 43-second network partition cut GitHub's US East Coast data center off from the others. Orchestrator, their MySQL failover tool, did its job: it promoted replicas on the West Coast and redirected writes there. But during those 43 seconds the East Coast primaries had accepted writes that never replicated out, while the newly promoted West Coast leaders were already accepting new writes of their own. Two divergent histories, roughly 950 writes apart. Rather than discard either side, GitHub degraded the site for over 24 hours while engineers restored from backups and reconciled the divergence by hand. The public postmortem is worth reading whole: correct tools, correct promotions, and a topology where 43 bad seconds cost a day.