Zookeeper分布式安装配置

 

 


 

Zookeeper介绍

概述

1、ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

2、ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

3、ZooKeeper包含一个简单的原语集,提供Java和C的接口。

4、ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

 


ZooKeeper的基本运转流程:

1、选举Leader。

2、同步数据。

3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。

4、Leader要具有最高的zxid。

5、集群中大多数的机器得到响应并follow选出的Leader。

 

 

 

Zookeeper下载与安装

 

下载

官网:https://zookeeper.apache.org/

大家可以去官网下载自己需要的版本,例如我需要安装的是3.4.6版本:

 

 

 

安装

Zookeeper的运行需要Java环境,所以需要首先安装JDK,JDK的安装可以参考:

http://blog.csdn.net/u011204847/article/details/51002072

 

把下载的压缩包拷贝到想要安装的目录,然后解压:

[root@master01 software]# tar -xzf zookeeper-3.4.6.tar.gz


解压之后文件目录:

 

 

 

加入环境变量:

vi /etc/profile

export ZOOKEEPER_HOME=/usr/local/software/zookeeper-3.4.6
export PATH=.:$PATH:$ZOOKEEPER_HOME/bin


使环境变量生效:

source /etc/profile


 

 

Zookeeper配置

 

单机配置

在zookeeper目录下创建目录data:

[root@master01 software]# cd zookeeper-3.4.6
[root@master01 zookeeper-3.4.6]# mkdir data


然后到zookeeper / conf 目录下,修改zoo_sample.cfg名称为zoo.cfg

 

 

然后修改配置文件zoo.cfg:

vi zoo.cfg   //单机只需要修改dataDir为之前创建的data目录即可


 

配置好后就可以启动了:

切换到Zookeeper的bin目录下,然后

./zkServer.sh start    //开启Zookeeper

其他命令:

./zkServer.sh stop    //关闭Zookeeper
./zkServer.sh status   //查看Zookeeper状态
./zkCli.sh   //打开Zookeeper客户端



分布式配置

 

这里我使用三台主机进行Zookeeper的分布式配置。

1、首先,我们在之前配置的单机基础上继续修改配置文件:

2、在之前的配置文件末尾添加如下内容:

server.0=master01:2888:3888   //master01为你的主机名,前面的0代表的是给这台主机配的ID
server.1=slave01:2888:3888    //同理slave01也是主机名,可以使用IP
server.2=slave02:2888:3888

3、然后在我们之前建立的data文件中使用命令:

echo 0 myid   //在data目录建立myid文件,并写入0(与上面的配置中server.0中的0对应)

4、将这台主机配置好的Zookeeper整个目录都拷贝到另外两台主机的相同路径下,并在那两台上修改myid为1和2。

5、修改另外两台主机/etc/profile文件,使得它们的Zookeeper环境配置和第一台主机一样

6、在每台主机上面开启Zookeeper后,查看状态


开启三台主机中Zookeeper后,查看状态会发现有一个leader以及两个follower,此时我们的Zookeeper分布式环境以及搭建好了

 

 

注意:

1、上面我可以使用类似 ssh slave01命令直接登录到slave01和slave02主机是因为我在三台主机之间做了免密码登录。

2、在配置文件和命令中可以直接使用主机名是因为我做了IP和主机名的映射。

3、我们可以在登录到另一台主机后,直接使用zkServer.sh脚本是因为我们之前配置了Zookeeper环境并使之生效。

 

 

 

附加配置

在安装好Zookeeper分布式环境后,一般情况下需要登录到每台主机上面去启动Zookeeper,比较繁琐,所以我们可以写一个shell脚本来启动和关闭这个Zookeeper集群。

 

在写脚本之前我们需要先解决一个问题,如果我们直接使用脚本操作去启动另外的主机上面Zookeeper,会发现启动不成功。这涉及到登录shell和非登录shell的问题。关于Shell脚本和登录/非登录shell可以参考:http://blog.csdn.net/u011204847/article/details/51184883

 

这里我直接写解决方法:

方法一:

修改Zookeeper / bin 目录下的zkEnv.sh,在图示位置或者文件开头添加你的JDK路径。

 

 

方法二:把profile的配置信息echo到.bashrc中  echo 'source /etc/profile' >> ~/.bashrc

 

方法三:脚本代码中添加”source /etc/profile;”,例如:ssh $i "source /etc/profile;/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh start"

 

 

Shell启动脚本示例:

#!/bin/bash
for i in master01 slave01 slave02
do
 	ssh $i "/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh start"
done

脚本执行示例:

 

 


Shell停止脚本示例:

#!/bin/bash
for i in master01 slave01 slave02
do
        ssh $i "/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh stop"
done

脚本执行示例:

 

 

 

 


Java代码操作Zookeeper示例

 

Pom依赖:

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.8.0</version>
</dependency>


 

代码示例:

@Test   //测试类:测试Zookeeper连接
public void test13() throws Exception{
    //指定zookeeper集群的地址
    String connectString = "192.168.33.130:2181,192.168.33.131:2181,192.168.33.132:2181";
    //1000 :代表是重试时间间隔     3:表示是重试次数
    ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3);
    //使用curator创建一个zk链接
    CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);
    //启动连接
    client.start();
    InetAddress localHost = InetAddress.getLocalHost();
    String ip = localHost.getHostAddress();
    client.create()
        .creatingParentsIfNeeded()   //如果父节点不存在,这创建
        .withMode(CreateMode.EPHEMERAL)  //创建节点类型为临时节点
        .withACL(Ids.OPEN_ACL_UNSAFE)
        .forPath("/Spider/"+ip);
}

打印结果:

 

 

注意:

由于建立的是临时节点,所以默认40秒后,这个值会消失。临时节点的这个特性可以用于监控一些程序的运行状态。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐