【性能优化】9.5 [集群] 冗余式容错
9.5 冗余式容错
做集群运算时必须要考虑容错。单机时如果发生机器失效,那运算也就失效了。而集群时仅有少量几个分机失效仍然可能让集群继续有工作能力。
要容错必须要用冗余。如果按前面几节讨论的情况,每个分机只保有一个分区的数据,那么任何一个分机失效都会导致数据不再完整,也就无法再进行合理的计算了。
集算服务器上可以同时存入多个分区的数据。有分机失效时,如果能还在剩余的分机上找到所有的分区,那么计算就仍然可以继续进行,但有些分机执行任务量会变大,整体运算性能也可能会下降。
仍然以 4 个分区为例,我们在每个分机上保有 2 个分区,分别如下:
101:1 区、2 区;102:2 区、3 区;103:3 区、4 区;104:4 区、1 区
再考查前面的代码:
A |
|
1 |
["192.168.0.101:8281","192.168.0.102:8281",…, "192.168.0.104:8281"] |
2 |
=file("orders.ctx":[1,2,3,4],A1) |
… |
… |
如果所有分机都正常,A2 的 file 函数会在 101 上取 1 区,102 上取 2 区,…,104 上取 4 区构成一个集群文件。假如 103 失效,找不到 103 上的 3 区,将去继续找 104,仍然找不到 3 区,则再转回到 101,结果会在 102 上取 3 区,然后再 104 上取 4 区。结果这个集群文件的 4 个分区将分别取自 101,102,102,104 上,102 将执行两个分区的运算。
这种使用多倍数据实现容错的方案称为冗余式容错。
这里有个问题,我们之前假定每个分机只有一个分区时,集群复组表的每个分区只能对应唯一的分机。而如果分机上可以有冗余的分区时,这个对应关系就不是唯一的了。比如我们要可以从 101,102,103,104 分别取出 4 个分区,也可以从 104,101,102,103 取同样的分区。对于单表运算,分区如何分布都不会影响计算结果,但多表关联运算(比如同维关联)要求相同的分区分布才能继续,101 上的 1 区和 104 上的 1 区是无法关联计算的。
A |
|
1 |
["192.168.0.101:8281","192.168.0.102:8281",…, "192.168.0.104:8281"] |
2 |
=file("A.ctx":[1,2,3,4],A1) |
3 |
=file("B.ctx",A2) |
… |
… |
file 函数可以按某个已知集群文件的分区分布方案生成新的集群文件,A3 将采用和 A2 同样的分区分布,这样基于它们的集群表就可以进行关联计算了。
再继续考查刚才的分布方案:
101:1 区、2 区;102:2 区、3 区;103:3 区、4 区;104:4 区、1 区
如果 103 和 104 都失效,剩下的 101 和 102 中就找不全所有分区了,计算将无法进行。也就是说,这种冗余的分布方案只能容忍一台分机失效。再仔细分析会发现,这种分布方案在任何一台分机失效时都能继续工作,但任何两台失效后就都不能工作了。
我们称这种分布方案的容错度为 1,而前面举例时用的一个分机只有一个分区的方案,其容错度为 0。n 台分机的集群,如何每台分机上都有全量数据,其容错度为 n-1。容错度为 k(任何 k 台分机失效后还能运算,k+1 台失效时集群就失效),要求数据被冗余 k 倍(即除了原始一份数据外,还要多存储 k 份),容错度有时也会称为冗余度。
n 台分机的集群,可以简单地用循环分布方案实现 k 容错度:
分机 1:分区 1,分区 2,…,分区 k+1
分机 2:分区 2,分区 3,…,分区 k+2
…
分机 i:分区 i,分区 i+1,…,分区 i+k
…
分机 n:分区 n,分区 1,…,分区 k
其中分区 m 在 m>n 时等同于分区 m-n。