一、zookeeper概念简介
Zookeeper是一个分布式协调服务;就是为用户的分布式应用程序提供协调服务
A、zookeeper是为别的分布式程序服务的
B、zoopkeeper本身就是一个分布式程序(只要半数以上节点存活,zk就能正常服务)
C、zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务等…
D、虽然说可以提供各种服务,但是zookeeper在底层只提供两个功能:
管理(存储、读取)用户程序提交的数据
为用户程序提供数据节点监听服务
二、zookeeper集群机制
半数机制,集群中半数以上机器存活,集群可用
zookeeper适合装在奇数台机器上
三、zk节点
znode是zk树形结构中的数据节点,用于存储数据;
zookeeper两种类型的节点:
- 持久节点(PERSISENT):一旦创建,除非主动调用删除操作,否则一直存储在zk上;
- 临时节点(EPHEMERAL):与客户端会话绑定,一旦客户端会话失效,这个客户端所创建的所有临时几点都会被移除
四、java连接zookeeper实现zookeeper的基本操作(znode的增删改查)
private static final String connectString="hdpbasic1:2181,hdpbasic2:2181,hdpbasic3:2181";
private static final int sessionTimeout=2000;
ZooKeeper zkClient=null;
/**
* 初始化监听事件处理
* @throws Exception
*/
@Before
public void init() throws Exception{
zkClient=new ZooKeeper(connectString, sessionTimeout, new Watcher() {
//收到事件通知后的回调函数
public void process(WatchedEvent event) {
System.out.println(event.getType()+"---"+event.getPath());
try {
//监听事件处理后重新注册监听器,一个监听器只能监听一次
zkClient.getChildren("/",true);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
/**
* 创建数据节点到zk中
* */
@Test
public void createNode() throws Exception{
//参数1:要创建的节点的路径 2:节点大数据参数 3:节点的权限参数 4:节点的类型
String nodeCreate=zkClient.create("/idea","hellozk".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
System.out.println("创建节点:"+nodeCreate);
}
/**
* 获取子节点
*/
@Test
public void getChildNode() throws Exception{
List<String> childs = zkClient.getChildren("/",true);
for (String child:childs){
System.out.println("子节点:"+child);
}
Thread.sleep(Long.MAX_VALUE);
}
/**
* 获取znode数据
*/
@Test
public void getData() throws Exception{
byte[] data= zkClient.getData("/idea",true,null);
System.out.println("数据为:"+new String(data));
}
/**
* 删除znode
*/
@Test
public void deleteData() throws Exception{
//-1表示删除所有版本数据
zkClient.delete("/idea",-1);
}
//判断znode是否存在
@Test
public void isNodeExits() throws Exception{
Stat stat=zkClient.exists("/idea",false);
System.out.println(stat==null?"not exits":"exits");
}
//修改znode数据
@Test
public void updateZnode() throws Exception{
Stat stat=zkClient.setData("/idea","235".getBytes(),-1);
}