单个高吞吐量服务器的原子故障转移是否可行?

时间:2018-02-05 07:33:12

标签: atomic failover distributed-system

我需要原子故障转移才能使我当前的分布式系统正常工作。通过原子故障转移,我的意思是在某个时间点和之后,所有请求都由新服务器(或根本不提供)提供服务,即使存在故障也是如此。

我正在处理比ZooKeeper似乎处理写入更多的消息(似乎是大约~20k / s),而且我期望同步读取不会比写入快得多,所以路由所有通过ZooKeeper的请求似乎不是一个选项。

出于性能和正确原因,所有请求必须由同一服务器处理;触摸数据库或在服务器之间为每个请求进行通信是一种缓慢的方式,因此水平扩展不是一种选择,并且让两台服务器并行服务请求而不相互通信将违反正确性。

是否有可行的方法来获得高吞吐量(1M / s +)原子故障转移,即使存在故障?每次故障转移的停机时间都很短,通常会在几毫秒内请求进程。删除请求也没问题,因为客户端将重试。

1 个答案:

答案 0 :(得分:0)

我的团队的软件每天以高吞吐量进行数千次原子故障转移。它真的只有一个技巧;以及在故障转移期间改善延迟的一些技巧。

关键技巧是系统必须具有事务锁存器,以防止旧系统上的任何更多事务。也就是说,通过在旧系统上提交事务来触发故障转移,以便在提交之后,客户端会收到一条特殊错误,指出已发生故障转移。在提交之前的所有内容都在旧系统上,之后的所有内容都在新系统上。

有各种方法可以做到这一点。首先,提交时的标志可以密封旧系统,防止所有事务。或者您可以采用分代方法,其中事务具有(又名 epoch )字段。在代际方法中,故障转移只是改变了旧系统的生成。

要改善延迟,请确保所有内容都已准备好使用新系统。新系统应该准备接受新一代。如果可能,在故障转移之前,客户端/代理应该具有对新系统的连接,为旧系统准备好发生故障转移,准备好将流量无缝地传输到新系统。