Linux下构建高可用ZooKeeper集群(3)

解决了单点问题,是不是该考虑容灾了呢?答案是否定的,在搭建一个高可用的集群的时候依然需要考虑容灾问题。正如上面讲到的,如果集群中超过半数的机器还在正常工作,集群就能够对外提供正常的服务。

那么,如果整个机房出现灾难性的事故,这时显然已经不是单点问题的范畴了。

在进行 ZooKeeper 的容灾方案设计过程中,我们要充分考虑到“过半原则”。也就是说,无论发生什么情况,我们必须保证 ZooKeeper 集群中有超过半数的机器能够正常工作。因此,通常有以下两种部署方案。

3.3.1 双机房部署

在进行容灾方案的设计时,我们通常是以机房为单位来考虑问题。在现实中,很多公司的机房规模并不大,因此双机房部署是个比较常见的方案。但是遗憾的是,在目前版本的 ZooKeeper 中,还没有办法能够在双机房条件下实现比较好的容灾效果——因为无论哪个机房发生异常情况,都有可能使得 ZooKeeper 集群中可用的机器无法超过半数。当然,在拥有两个机房的场景下,通常有一个机房是主要机房(一般而言,公司会花费更多的钱去租用一个稳定性更好、设备更可靠的机房,这个机房就是主要机房,而另外一个机房则更加廉价一些)。我们唯一能做的,就是尽量在主要机房部署更多的机器。例如,对于一个由 7 台机器组成的 ZooKeeper 集群,通常在主要机房中部署 4 台机器,剩下的 3 台机器部署到另外一个机房中。

3.3.2 三机房部署

既然在双机房部署模式下并不能实现好的容灾效果,那么对于有条件的公司,选择三机房部署无疑是个更好的选择,无论哪个机房发生了故障,剩下两个机房的机器数量都超过半数。假如我们有三个机房可以部署服务,并且这三个机房间的网络状况良好,那么就可以在三个机房中都部署若干个机器来组成一个 ZooKeeper 集群。

我们假定构成 ZooKeeper 集群的机器总数为 N,在三个机房中部署的 ZooKeeper 服务器数分别为 N1、N2 和 N3,如果要使该 ZooKeeper 集群具有较好的容灾能力,我们可以根据如下算法来计算 ZooKeeper 集群的机器部署方案。

1. 计算 N1

如果 ZooKeeper 集群的服务器总数是 N,那么:

1

 

N1 = (N-1)/2

 

在 Java 中,“/” 运算符会自动对计算结果向下取整操作。举个例子,如果 N=8,那么 N1=3;如果 N=7,那么 N1 也等于 3。

2. 计算 N2 的可选值

N2 的计算规则和 N1 非常类似,只是 N2 的取值是在一个取值范围内:

1

 

N2 的取值范围是 1~(N-N1)/2

 

即如果 N=8,那么 N1=3,则 N2 的取值范围就是 1~2,分别是 1 和 2。注意,1 和 2 仅仅是 N2 的可选值,并非最终值——如果 N2 为某个可选值的时候,无法计算出 N3 的值,那么该可选值也无效。

3. 计算 N3,同时确定 N2 的值

很显然,现在只剩下 N3 了,可以简单的认为 N3 的取值就是剩下的机器数,即:

1

 

N3 = N - N1 - N2

 

只是 N3 的取值必须满足 N3 < N1+N2。在满足这个条件的基础下,我们遍历步骤 2 中计算得到的 N2 的可选值,即可得到三机房部署时每个机房的服务器数量了。

现在我们以 7 台机器为例,来看看如何分配三机房的机器分布。根据算法的步骤 1,我们首先确定 N1 的取值为 3。根据算法的步骤 2,我们确定了 N2 的可选值为 1 和 2。最后根据步骤 3,我们遍历 N2 的可选值,即可得到两种部署方案,分别是 (3,1,3) 和 (3,2,2)。以下是 Java 程序代码对以上算法的一种简单实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

 

public class Allocation {

     

    static final int n = 7;

    public static void main(String[] args){

        int n1,n2,n3;

        n1 = (n-1) / 2;

        int n2_max = (n-n1) / 2;

        for(int i=1; i<=n2_max; i++){

            n2 = i;

            n3 = n - n1 -n2;

            if(n3 >= (n1+n2)){

                continue;

            }

            System.out.println("("+n1+","+n2+","+n3+")");

        }

    }

}

 

四、水平扩容

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8cfc3c174eb48fa659e0e8e471a13d50.html