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
客户端连接
运行 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查看
建立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();
}
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
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
文章评论