Failover from one instance to another

在讨论容错的时候,有几种情况是需要failover的:
1)在master-slave的数据库中,写都是通过master的,如果master die了,那么会选择一个slave成为新的master。这种情况下,会不会在master fail的那一瞬间,有一些写操作已经发给master了,即使启动了新的master,那些写操作也会丢失了。这种情况下怎么确保写不丢失?
2)对于stateless application server,会通过health check发现fail的server。这里有两个问题:
a) health check会不会有延迟,如果1s发一次心跳,会很多request已经发给这个fail的server了;
b) 如何保证已经发给failed server的request不丢失?

谢谢!

1.如果 master 宕机,发送的 request 会 timeout。发送 Request 的服务重试就可以保证不丢失。
2. a) 这有可能,request 会 fail
2. b) 同样的,发送 Request 的服务可以重试或者用户重新发送Request

如果DB已经完成了写,但是client不知道 (networking 等原因), 为了避免重复写, client 在request里可以加 idempotency token 来去重。 这个token可以是etag 或者是 一个row的version。 或者client retry时候, 先读一下是不是已经写成功了。

老师我的理解对么?

没有那么复杂,如果写的时候保证了高 consistency level,每次写保证所有replica 写完才算成功的话,可以保证 failover 时候所有信息都是一致的。