在 dataDir 目录下创建名为 myid 的文件,在文件第一行写上对应的 Server ID。
5. 按照相同步骤,为其他机器配置 zoo.cfg 和 myid文件 6. 启动服务 1.3 伪集群模式这是一种特殊的集群模式,即集群的所有服务器都部署在一台机器上。当你手头上有一台比较好的机器,如果作为单机模式进行部署,就会浪费资源,这种情况下,ZooKeeper允许你在一台机器上通过启动不同的端口来启动多个 ZooKeeper 服务实例,以此来以集群的特性来对外服务。
这种模式下,只需要把 zoo.cfg 做如下修改:
1 2 3 4 5 6 7 8 9
tickTime=2000 dataDir=/var/lib/zookeeper dataLogDir=/var/lib/log clientPort=2181 initLimit=5 syncLimit=2 server.1=IP1:2888:3888 server.2=IP1:2889:3889 server.3=IP1:2890:3890
二、集群组成
要搭建一个高可用的 ZooKeeper 集群,我们首先需要确定好集群的规模。
关于 ZooKeeper 集群的服务器组成,相信很多对 ZooKeeper 了解但是理解不够深入的读者,都存在或曾经存在过这样一个错误的认识:为了使得 ZooKeeper 集群能够顺利地选举出 Leader,必须将 ZooKeeper 集群的服务器数部署成奇数。这里我们需要澄清的一点是:任意台 ZooKeeper 服务器都能部署且能正常运行。
那么存在于这么多读者中的这个错误认识是怎么回事呢?其实关于 ZooKeeper 集群服务器数,ZooKeeper 官方确实给出了关于奇数的建议,但绝大部分 ZooKeeper 用户对于这个建议认识有偏差。在本书前面提到的“过半存活即可用”特性中,我们已经了解了,一个 ZooKeeper 集群如果要对外提供可用的服务,那么集群中必须要有过半的机器正常工作并且彼此之间能够正常通信。基于这个特性,如果想搭建一个能够允许 N 台机器 down 掉的集群,那么就要部署一个由 2*N+1 台服务器构成的 ZooKeeper 集群。因此,一个由 3 台机器构成的 ZooKeeper 集群,能够在挂掉 1 台机器后依然正常工作,而对于一个由 5 台服务器构成的 ZooKeeper 集群,能够对 2 台机器挂掉的情况进行容灾。注意,如果是一个由6台服务器构成的 ZooKeeper 集群,同样只能够挂掉 2 台机器,因为如果挂掉 3 台,剩下的机器就无法实现过半了。
因此,从上面的讲解中,我们其实可以看出,对于一个由 6 台机器构成的 ZooKeeper 集群来说,和一个由 5 台机器构成的 ZooKeeper 集群,其在容灾能力上并没有任何显著的优势,反而多占用了一个服务器资源。基于这个原因,ZooKeeper 集群通常设计部署成奇数台服务器即可。
三、容灾所谓容灾,在 IT 行业通常是指我们的计算机信息系统具有的一种在遭受诸如火灾、地震、断电和其他基础网络设备故障等毁灭性灾难的时候,依然能够对外提供可用服务的能力。
对于一些普通的应用,为了达到容灾标准,通常我们会选择在多台机器上进行部署来组成一个集群,这样即使在集群的一台或是若干台机器出现故障的情况下,整个集群依然能够对外提供可用的服务。
而对于一些核心应用,不仅要通过使用多台机器构建集群的方式来提供服务,而且还要将集群中的机器部署在两个机房,这样的话,即使其中一个机房遭遇灾难,依然能够对外提供可用的服务。
上面讲到的都是应用层面的容灾模式,那么对于 ZooKeeper 这种底层组件来说,如何进行容灾呢?讲到这里,可能多少读者会有疑问,ZooKeeper 既然已经解决了单点问题,那为什么还要进行容灾呢?
3.1 单点问题单点问题是分布式环境中最常见也是最经典的问题之一,在很多分布式系统中都会存在这样的单点问题。
具体地说,单点问题是指在一个分布式系统中,如果某一个组件出现故障就会引起整个系统的可用性大大下降甚至是处于瘫痪状态,那么我们就认为该组件存在单点问题。
ZooKeeper 确实已经很好地解决了单点问题。我们已经了解到,基于“过半”设计原则,ZooKeeper 在运行期间,集群中至少有过半的机器保存了最新的数据。因此,只要集群中超过半数的机器还能够正常工作,整个集群就能够对外提供服务。
3.2 容灾