游戏开发工具

规避复制风暴问题

引言

什么是复制风暴?

举例:master重启,其master下的所有slave检测到RunID发生变化,导致所有从节点向主节点做全量复制。尽管redis对这个问题做了优化,即只生成一份RDB文件,但需要多次传输,仍然开销很大。

1、单主节点复制风暴:主节点重启,多从节点全量复制

解决办法:更换复制拓扑,如下图:

1.jpg



a)将原来master与slave中间加一个或多个slave,再在slave上加若干个slave,这样可以分担所有slave对master复制的压力。(这种架构还是有问题:读写分离的时候,slave1也发生了故障,怎么去处理?)

b)如果只是实现高可用,而不做读写分离,那当master宕机,直接晋升一台slave即可。


2、单机器复制风暴:机器宕机后的大量全量复制

如下图:

2.jpg



当machine-A这个机器宕机重启,会导致该机器所有master下的所有slave同时产生复制。(灾难)

解决:

a)主节点分散多机器(将master分散到不同机器上部署)

b)还有我们可以采用高可用手段(slave晋升master)就不会有类似问题了。