一.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