一.ZooKeeper概述
1.zookeeper是一个为用户的分布式应用程序提供协调的服务。
·是为别的分布式程序服务的
·本身也是一个分布式程序(只要半数以上节点存储,就能正常提供服务)
2.目标是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户
3.Hadoop生态系统中许多框架使用了Zookeeper,例如:HDFS HA、HBase、Kafka、Spark
二.ZooKeeper架构
1.核心组件
·Server:数目一般为奇数
·Leader
·Follower
·Client
三.ZooKeeper数据结构
层次化的目录结构
每个节点在ZK中叫做znode
znode可以包含数据和子节点(EPHEMERAL类型的节点不能有子节点)
znode中的数据可以有多个版本,可以通过版本查询数据
znode有两种类型
短暂的:ephemeral
持久的:persistent
znode的类型在创建时确定后就不能修改
四.创建、删除zk节点
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
public class ZkTest {
public static void main(String[] args) throws Exception {
// 创建一个与服务器的连接
ZooKeeper zk = new ZooKeeper("node3", 3000, new Watcher() {
// 监控所有被触发的事件
public void process(WatchedEvent event) {
System.out.println("已经触发了" + event.getType() + "事件" + event.getPath());
}
});
// 创建一个目录节点
zk.create("/testPath", "testData".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
System.out.println(new String(zk.getData("/testPath", false, null)));
// 创建一个子目录节点
zk.create("/testPath/testChildPathOne", "testChildDataOne".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(new String(zk.getData("/testPath/testChildPathOne", true, null)));
// 取出子目录节点列表
System.out.println(zk.getChildren("/testPath", true));
// 修改子目录节点数据
zk.setData("/testRootPath/testChildPathOne", "modifyChildDataOne".getBytes(), -1);
System.out.println(new String(zk.getData("/testPath/testChildPathOne", false, null)));
System.out.println("目录节点状态:[" + zk.exists("/testPath", true) + "]");
// 创建另外一个子目录节点
zk.create("/testPath/testChildPathTwo", "testChildDataTwo".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(new String(zk.getData("/testPath/testChildPathTwo", false, null)));
// 删除子目录节点
zk.delete("/testPath/testChildPathTwo", -1);
zk.delete("/testPath/testChildPathOne", -1);
// 删除父目录节点
zk.delete("/testPath", -1);
// 关闭连接
zk.close();
}
}