Apache ZooKeeper 集群搭建

Zookeeper是一个分布式协调服务的开源框架。主要用来解决分布式集群中应用系统的一致性问题。
ZooKeeper本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理。从而用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。

zookeeper安装

安装zookeeper的注意事项:
安装前需要安装好jdk
检测集群时间是否同步
检测防火墙是否关闭
检测主机 ip映射有没有配置

##下载安装包、解压

下载地址:
CDH版本:http://archive.cloudera.com/cdh5/cdh/5/zookeeper-3.4.5-cdh5.14.0.tar.gz
apache版本:https://archive.apache.org/dist/zookeeper/

1、解压:

cd /export/software 
tar -zxvf zookeeper-3.4.5-cdh5.14.0.tar.gz -C /export/servers/

2、修改环境变量(注意:3台zookeeper都需要修改)

vim /etc/profile
export ZOOKEEPER_HOME=/export/servers/zookeeper-3.4.5-cdh5.14.0
export PATH=$PATH:$ZOOKEEPER_HOME/bin
source /etc/profile

3、修改zookeeper配置文件

cd /export/servers/zookeeper-3.4.5-cdh5.14.0/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改内容:
dataDir=/export/servers/zookeeper-3.4.5-cdh5.14.0/zkdata
添加内容:
# (心跳端口、选举端口)
server.1=node01:2888:3888 
server.2=node02:2888:3888
server.3=node03:2888:3888

4、创建文件夹:

mkdir -p /export/servers/zookeeper-3.4.5-cdh5.14.0/zkdata

5、在zkdata文件夹下新建myid文件,myid的文件内容为:

cd /export/servers/zookeeper-3.4.5-cdh5.14.0/zkdata
echo 1 > myid

6、分发安装包到其他机器

scp -r /export/servers/zookeeper-3.4.5-cdh5.14.0 root@node02:/export/servers
scp -r /export/servers/zookeeper-3.4.5-cdh5.14.0 root@node03:/export/servers

7、修改其他机器的配置文件
在node02上:

vim /export/servers/zookeeper-3.4.5-cdh5.14.0/zkdata/myid

修改myid为:2

在node03上:

vim /export/servers/zookeeper-3.4.5-cdh5.14.0/zkdata/myid

修改myid为:3

8、启动(每台机器)

zkServer.sh start

 

 

ZooKeeper shell

客户端连接

运行 zkCli.sh –server ip 进入命令行工具。
输入help,输出zk shell提示

 

创建节点

create [-s] [-e] path data acl

其中,-s或-e分别指定节点特性,顺序或临时节点,若不指定,则表示持久节点;acl用来进行权限控制。
创建顺序节点:

create -s /rua rua

创建临时节点:

create -e /rua rua

创建永久节点:

create /rua rua

读取节点

与读取相关的命令有ls 命令和get 命令,ls命令可以列出Zookeeper指定节点下的所有子节点,只能查看指定节点下的第一级的所有子节点;get命令可以获取Zookeeper指定节点的数据内容和属性信息。
 

ls path [watch]
get path [watch]
ls2 path [watch]

 

 

更新节点

set path data [version]

data就是要更新的新内容,version表示数据版本。

现在dataVersion已经变为1了,表示进行了更新。

 

删除节点

delete path [version]
若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除父节点。
rmr path
可以递归删除节点。

quota

setquota -n|-b val path 对节点增加限制。
n:表示子节点的最大个数
b:表示数据值的最大长度
val:子节点最大个数或数据值的最大长度
path:节点路径

listquota path 列出指定节点的quota

子节点个数为2,数据长度-1表示没限制
delquota [-n|-b] path 删除quota

 

其他命令

history : 列出命令历史

redo:该命令可以重新执行指定命令编号的历史命令,命令编号可以通过history查看

ZooKeeper Java API

建立java maven项目,引入maven pom坐标。

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>

 

操作示例


 public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
        ZooKeeper zooKeeper = new ZooKeeper("node01:2181,node02:2181,node03:2181", 30 * 1000, new Watcher() {
            public void process(WatchedEvent watchedEvent) {
                System.out.println("事件类型为" + watchedEvent.getType());
                System.out.println("事件路径为" + watchedEvent.getType());
                System.out.println("通知状态为" + watchedEvent.getType());
            }
        });
        // 创建一个目录节点
       zooKeeper.create("/rua","rua".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
        // 创建一个子目录节点
        zooKeeper.create("/eva/rua", "rua".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println(new String(zooKeeper.getData("/eva", false, null)));
        // 取出子目录节点列表
        System.out.println(zooKeeper.getChildren("/eva",true));
        // 修改子目录节点数据
        zooKeeper.setData("/eva/rua", "evaeva".getBytes(),-1 );
        System.out.println(new String(zooKeeper.getData("/eva/rua", false, null)));
        System.out.println(zooKeeper.exists("/eva/rua", null));
        // 创建另外一个子目录节点
        zooKeeper.create("/eva/testChildPathTwo", "testChildDataTwo".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println(new String(zooKeeper.getData("/eva/testChildPathTwo", true, null)));
        // 删除子目录节点
        zooKeeper.delete("/eva/testChildPathTwo",-1);
        // 删除父目录节点
        zooKeeper.delete("/eva",-1);
        zooKeeper.close();
    }

一键启动zookeeper脚本示例

for host in node01 node02 node03
do
ssh $host "source /etc/profile;nohup /export/servers/zookeeper-3.4.5-cdh5.14.0/bin/zkServer.sh start >/dev/null 2>&1 &"
echo "$host zk is running"
done

一键关闭zookeeper脚本示例

for host in node01 node02 node03
do
ssh $host "source /etc/profile;jps |grep QuorumPeerMain |cut -c 1-4 |xargs kill -s 9"
echo "$host zk is stopping"
done
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注