一.zookeeper的安装
从https://archive.apache.org/dist/zookeeper/下载源码 然后解压zookeeper-3.4.11
在目录/conf下复制zoo_sample.cfg 并重命名为zoo.cfg,并在其内部添加配置
server.1=lanc05:2888:3888
server.2=lanc06:2888:3888
server.3=lanc07:2888:3888
这样就配置好了,有多少zookeeper服务器,就添加多少台,每一台配置都是一样的
然后就是启动,在源码目录zookeeper-3.4.11/bin/下有两个脚本zkServer.sh和zkCli.sh
./zkServer.sh start //启动server
./zkServer.sh status //查看状态
./zkCli.sh //启动客户端连接
服务器的状态有两个角色就是 leader和follower,leader只能有一个通过选举获得,
二.相关命令
使用./zkCli.sh 客户端连接服务器时可以使用简单的命令来操作
可以使用help来查看所有的命令如下图所示:
但常用的有ls、get、set、create、delete、rmr等,很多命令中都有watch(监听器),这个监听只能监听一次事件,下次再触发就不会再被监听到
ls / //查看根目录下
create /xxx iii //在根目录下创建节点xxx,并设置数据为iii
get /xxx 获取xxx节点的数据和该节点的相关信息
set /xxx llll //将xxx节点的数据修改为llll
delete /xxx 删除节点xxx,该节点下没有子节点
rmr /xxx //如果该节点下含有子节点就得使用rmr
三.API的相关代码
以下是简单的客户端PAI的操作,包括,连接zk、创建znode、删除、更改、获取数据等以及监听器等
package bigdata.zk;
import java.util.List;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;
public class simpleZKClient {
//如果在zookeeper目录下conf下的的配置文件zoo.cfg内配置绑定的为主机名,则此处链接只能为主机名,
//若配置为IP ,则智能写IP ,否则链接失败,因此只能和zoo.cfg配置保持一致
private static final String connectString = "lanc05:2181,lanc06:2181,lanc07:2181";
private static final int sessionTimeout =2000;
ZooKeeper zKclient = null;
@Before
public void init() throws Exception{
zKclient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent event) {//监听器只能生效一次
// 收到事件通知后的回调函数 (也就是自己的事件处理逻辑)
System.out.println( event.getType() + "*******" + event.getPath());
//为了循环监听事件的操作,因此要再次获取节点,这样就实现了每次修改节点后,都会打印事件,上面一行
try {
zKclient.getChildren("/", true);
} catch (Exception e) {
}
}
});
}
/**
* 数据的增删改查
* @throws InterruptedException
* @throws KeeperException
* */
// create znode
@Test
public void testcreat() throws KeeperException, InterruptedException{
// 参数:
// 1:节点的路径,必须是根节点下的绝对路径
// 2:创建节点的数据,为byte[]类型
// 3.节点的权限,常用的为
// 4.节点的类型,总公司个类型
String nodecreate = zKclient.create("/myeclipse", "hello zookeper".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//上传的数据可以是任何数据,单必须转换成byte
}
//判断zonde是否存在
@Test
public void testexist()throws Exception {
//Stat 是返回的值,里面时所有的元数据的值,如果不存在则是null
Stat exists = zKclient.exists("/myeclipse", false);
System.out.println(exists == null ? "not exist " : "exit");
}
// get znode
@Test
public void getznode() throws Exception{
List<String> children = zKclient.getChildren("/", true); //使用true 就是使用上面的监听器
for(String child:children){
System.out.println(child);
}
Thread.sleep(Long.MAX_VALUE);//程序阻塞在这儿,等待事件
}
//获取zode的数据
@Test
//public void getdata() throws KeeperException, InterruptedException { //两个运行的结果一样
public void getdata() throws Exception {
byte[] data = zKclient.getData("/myeclipse", false, new Stat());//可以注册监听器,也可以不监听,最后一个参数为null就可以,这样写等同于null
System.out.println(new String(data));
}
// delete zode的数据
@Test
//public void getdata() throws KeeperException, InterruptedException { //两个运行的结果一样
public void deleteznode() throws Exception {
//参数2是指定要删除的版本,-1为删除所有的版本
zKclient.delete("/myeclipse", -1);
}
// delete zode的数据
@Test
public void setdata() throws Exception {
//参数2是指定要删除的版本,-1为删除所有的版本
zKclient.setData("/hello", "ccccccccc".getBytes(), -1);
byte[] data = zKclient.getData("/hello", false, null);
System.out.println(new String(data));
}
}
转载声明:https://blog.csdn.net/hubbybob1/article/details/80657003