在Zookeeper精要-standalone模式文章中我们有说到,如何安装Zookeeper,如何启动单例模式的Zookeeper实例,今天我们说一下如何部署Zookeeper的单机多节点。

1. 单例模式(Standalone)的缺陷

Zookeeper的单例模式的实例存在一个潜在的单点失效的风险,如果Zookeeper服务失败,整个使用该服务进行分布式调度的应用程序将会全面雪崩且停止运行,因此,在生产环境中,是不推荐使用Zookeeper的单例(Standalone)模式的。

2. Zookeeper 集群

在生产环境中,Zookeeper应该运行在一个有多台机器组成的集群上面,而每台机器上面的Zookeeper部署方式一致,即Zookeeper的可复用模式(replicated mode),此集群我们称之为Zookeeper集群。Zookeeper集群中,机器数目最小推荐3台,一般情况下,生产环境中推荐使用5台机器的Zookeeper集群。在相同的应用程序域中的这些可复用的机器,我们称之为quorum。

在集群模式下,Zookeeper服务的实例运行在多台不同的机器上,在quorum当中的所有服务器,它们的配置文件都是相同的。在一个quorum当中,Zookeeper的实例都是以Leader/Follower的形式运行。quorum当中的实例之一被选为Leader,其余为Follower。如果Leader失效,新的Leader选择将会发生,其他运行的实例将会选举出一个Leader,然而,这些相对复杂的东西对于开发者和Zookeeper的使用者来说都是不可见的。

3. Zookeeper 单机多节点-伪集群

在我们使用Zookeeper的过程中,一般情况下我们只是在生产环境或者UAT环境中才会使用多台机器进行集群的部署,但是在研发过程中,通常情况下我们是没有那么多资源使用的,所以Zookeeper提供了一种可以部署伪集群的方式,即可以在一台机器上运行多个Zookeeper实例。

本文我们部署三个实例的伪集群来给大家阐述伪集群的部署方案。

3.1. 配置Zookeeper

如下图所示,我们在Zookeeper的conf目录中建立三个文件,分别为zoo1.cfg、zoo2.cfg、zoo3.cfg

单节点elk 单节点和多节点_分布式

在zoo1.cfg中,我们写入如下内容:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper/zoo1
clientPort=2181
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668

在zoo2.cfg中,我们写入如下内容:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper/zoo2
clientPort=2182
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668

在zoo3.cfg中,我们写下如下内容:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper/zoo3
clientPort=2183
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668

注意我们在以上三个配置文件中dataDir的不同,我们需要建立指定的目录并且在目录中新建myid文件,写入对应的id,同时需要注意clientPort也不同。

在/var/lib/zookeeper目录下建立zoo1、zoo2、zoo3目录

单节点elk 单节点和多节点_单节点elk_02

在zoo1中新建文件myid并写入1,在zoo2中新建文件myid并写入2,在zoo3中新建文件myid并写入3。

以上配置完成之后,进入Zookeeper的bin目录,按一下方法启动Zookeeper伪集群。

./zkServer.sh start zoo1.cfg
./zkServer.sh start zoo2.cfg
./zkServer.sh start zoo3.cfg

启动之后,分别执行如下命令,可查看对应实例的状态。

./zkServer.sh status zoo1.cfg
./zkServer.sh status zoo2.cfg
./zkServer.sh status zoo3.cfg

单节点elk 单节点和多节点_分布式_03

4. 参数解释

initLimit : 指定在初始化过程中Follower连接Leader的超时限制时间。

超时时间=tickTime*initLimit

syncLimit : 指定Follower同步Leader数据的超时时间。

超时时间=tickTime*syncLimit