1. 准备配置文件
首先进入ZooKeeper的安装目录,复制多份ZooKeeper配置文件,如下:
# 创建三份配置文件
cp conf/zoo_sample.cfg conf/zoo-1.cfg
cp conf/zoo_sample.cfg conf/zoo-2.cfg
cp conf/zoo_sample.cfg conf/zoo-3.cfg
在每份配置文件“conf/zoo_n.cfg”的末尾添加如下内容:
# 第一个端口为仲裁通信,第二个端口用于群首选举
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445
群首选举很好理解,即选举ZooKeeper集群的主节点,由其来管理所有客户端的Session数据,而仲裁通信则用于确定备份、拷贝客户端协作数据znode的服务器数量,一般都基于多数原则(保存客户端数据的服务器的最小个数 > 服务器个数/2)。
最后需要依次修改每个服务器为客户端提供服务的端口(配置项为clientPort)与数据存储目录地址,以“conf/zoo-1.cfg”为例:
# 每个服务器必须映射到不同的目录地址
# 例如本例中其他可设置为/var/zookeeper/z2/data,/var/zookeeper/z3/data
dataDir=/var/zookeeper/z1/data
# 设置监听客户端请求的端口,其它分别为2182,2183
clientPort=2181
2. 设置服务器ID
在每个服务器对应的数据目录下创建“myid”文件,并分别赋予服务器的ID信息,如服务器1的ID值为1,服务器2的ID值为2,依次类推,如下:
# 以服务器1为例
touch /var/zookeeper/z1/data/myid
# 创建ID值
echo 1 > /var/zookeeper/z1/data/myid
3. 依次启动服务器实例
现在已经做完了所有的准备工作,可以依次启动服务器,每个服务器都是一个单独的JVM进程,如下:
# 启动服务器1
bin/zkServer.sh start conf/zoo-1.cfg
# 启动服务器2
bin/zkServer.sh start conf/zoo-2.cfg
# 启动服务器3
bin/zkServer.sh start conf/zoo-3.cfg
所有的服务器都启动完成后,我们可以通过以下3种方法观察启动是否正常:
1. 通过jps命令,观察启动的进程数量;
2. 通过安装目录下的zookeeper.out日志文件;
3. 通过zkServer的status命令,如下:
# 观察服务器是否正常
bin/zkServer.sh status conf/zoo-1.cfg
通过“bin/zkServer.sh status”不仅可以观察到服务器的进程状态,还可以观察本服务器是群首节点还是从节点,执行结果如下:
ZooKeeper JMX enabled by default
Using config: conf/zoo-1.cfg
# 反映节点的主从状态
Mode: follower
如果是群首节点,则Mode为“leader”。
在这里需要特别指出的是,无论是zkServer的start、restart命令,还是stop、status命令,都必须要明确地指定ZooKeeper配置文件,如停止服务器的命令如下:
# 停止服务器,必须要指定配置文件
bin/zkServer.sh stop conf/zoo-2.cfg
如果没有指定配置文件,则会提示如下错误:
Using config: conf/zoo.cfg
Stopping zookeeper ... no zookeeper to stop
(could not find file /var/zookeeper/zookeeper_server.pid)
最后再强调一次,ZooKeeper配置文件决定ZooKeeper服务器实例。
5. 启动客户端
客户端是分布式协作任务处理的核心,打个简单的比方,ZooKeeper服务器就好比是数据库,而客户端就是我们开发的WEB应用程序,所以所有的任务都必然由客户端进行处理。
启动仲裁模式下的客户端命令如下,需要与之前配置的客户端端口保持一致:
# 需要指定所有的服务器地址与端口
bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
这里需要再次说明一下,客户端也可以启动多个实例,并且也会创建主从模式(由程序员自己决定),最最重要的是,这才是真正的分布式应用程序,以HBase为例,从ZooKeeper的角度看,ZooKeeper是服务器,而HBase是客户端,从HBase的用户角度看,HBase是服务器端,并且是主从结构,而ZooKeeper则是透明的。
结论
创建ZooKeeper的仲裁模式集群,可以提高ZooKeeper服务的健壮性,对于所有的分布式应用程序而言,ZooKeeper提供了全部的写作服务,简化了分布式应用程序的开发难度。