zookeeper学习

来源:互联网 发布:无线传感器网络 编辑:程序博客网 时间:2024/05/29 18:01

公司用到了zookeeper,没有让做相关开发,因此仅仅先简单了解下。

1. zookeeper安装

安装环境

yum install java-1.7.0-openjdk-devel.i686如需卸载使用:rpm -e --nodeps tzdata-java-2015g-1.el7.noarch查看java环境变量:[root@localhost zookeeper-3.4.6]# env | grep javaJAVA_HOME=/usr/java/jdk1.7.0_71而目标java目录为:[root@localhost zookeeper-3.4.6]# ls /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141/bin/java/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141/bin/java修改环境变量:[root@localhost zookeeper-3.4.6]# export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141/[root@localhost zookeeper-3.4.6]# env | grep javaJAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141/

2.修改配置文件

[root@localhost zookeeper-3.4.6]# cp conf/zoo_sample.cfg conf/zoo.cfg[root@localhost zookeeper-3.4.6]# vim conf/zoo.cfg dataDir=/var/lib/zookeeper (保存内存数据库快照信息的位置)

3.启动

[root@localhost zookeeper-3.4.6]# bin/zkServer.sh startJMX enabled by defaultUsing config: /home/bo/zookeeper-3.4.6/bin/../conf/zoo.cfgStarting zookeeper ... STARTED查看进程:[root@localhost zookeeper-3.4.6]# ps -ef | grep zookroot      5857     1  0 10:47 pts/0    00:00:00 /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141//bin/java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /home/bo/zookeeper-3.4.6/bin/../build/classes:/home/bo/zookeeper-3.4.6/bin/../build/lib/*.jar:/home/bo/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/bo/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/home/bo/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/home/bo/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/home/bo/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/home/bo/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/home/bo/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/home/bo/zookeeper-3.4.6/bin/../conf:.:%JAVA_HOME%/lib/dt.jar:%JAVA_HOME%/lib/tools.jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /home/bo/zookeeper-3.4.6/bin/../conf/zoo.cfgroot      6224 10408  0 10:52 pts/0    00:00:00 grep zook

4.如果进程不存在

可以查看输出;[root@localhost zookeeper-3.4.6]# cat zookeeper.out nohup: failed to run command `/usr/java/jdk1.7.0_71/bin/java': No such file or directory此时原因是环境变量未配好。

5.运行客户端

[root@localhost zookeeper-3.4.6]# bin/zkCli.sh...[zk: localhost:2181(CONNECTED) 0] help[zk: localhost:2181(CONNECTED) 5] create /zk_test mydata   #创建一个新的znodeCreated /zk_test[zk: localhost:2181(CONNECTED) 18] ls /[zookeeper, zk_test][zk: localhost:2181(CONNECTED) 17] get /zk_test   #验证数据是否与znode关联上my_datacZxid = 0x54ctime = Sat May 13 11:13:08 CST 2017mZxid = 0x54mtime = Sat May 13 11:13:08 CST 2017pZxid = 0x54cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 7numChildren = 0[zk: localhost:2181(CONNECTED) 19] set /zk_test junk    #改变数据与zk_test的关联cZxid = 0x54ctime = Sat May 13 11:13:08 CST 2017mZxid = 0x59mtime = Sat May 13 11:14:39 CST 2017pZxid = 0x54cversion = 0dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 4numChildren = 0[zk: localhost:2181(CONNECTED) 20] get /zk_test  #获取数据,junk改变junkcZxid = 0x54ctime = Sat May 13 11:13:08 CST 2017mZxid = 0x59mtime = Sat May 13 11:14:39 CST 2017pZxid = 0x54cversion = 0dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 4numChildren = 0[zk: localhost:2181(CONNECTED) 21] delete /zk_test    #删除节点

6.开始编程(C接口)

编译安装库

cd zookeeper-3.4.6/src/c./configuremakemake install

示例:

#include<stdio.h>  #include<string.h>  #include"zookeeper.h"  #include"zookeeper_log.h"    void zktest_watcher_g(zhandle_t* zh, int type, int state, const char* path, void* watcherCtx)  {      printf("Something happened.\n");      printf("type: %d\n", type);      printf("state: %d\n", state);      printf("path: %s\n", path);      printf("watcherCtx: %s\n", (char *)watcherCtx);  }  //自己的监听函数  void watcher_myself(zhandle_t *zh,int type,int state,const char *path,void *watcherCtx)  {      printf("just for testing\n");      printf("path:%s\n",path);  }  //同步方式创建节点  void create(zhandle_t *zkhandle,char *str)  {      char path_buffer[64];      int bufferlen=sizeof(path_buffer);      printf("同步方式创建节点-----------------------\n");      int flag = zoo_create(zkhandle,str,"hahah",5,                            &ZOO_OPEN_ACL_UNSAFE,0,                            path_buffer,bufferlen);        if (flag!=ZOK)      {          printf("节点创建失败 \n");          exit(EXIT_FAILURE);      }      else      {          printf("创建的节点名称为:%s\n",path_buffer);      }  }  //同步方式获取节点数据  void get(zhandle_t* zkhandle, char* dir)  {      printf("同步方式获取节点数据-----------------------\n");      char buffer1[64];      int bufferlen1=sizeof(buffer1);        int flag1=zoo_get(zkhandle,dir,0,                        buffer1,&bufferlen1,NULL);      if (flag1 ==ZOK)      {          printf("节点/xyz3的数据为: %s\n",buffer1);      }  }  //exists  void exists(zhandle_t *zkhandle,char *str)  {      int flag = zoo_exists(zkhandle,str,1,NULL);  }    int wexists(zhandle_t *zkhandle,char *str)  {      int flag=zoo_wexists(zkhandle,str,watcher_myself,"test",NULL);      return flag;}  //同步方式获得子节点信息  void getChildren(zhandle_t *zkhandle,char *str)  {      struct String_vector strings;      struct Stat stat;      int flag = zoo_wget_children2(zkhandle,str,                                    watcher_myself,"testgetChildren",                                    &strings,&stat);      if (flag==ZOK)      {          int32_t i=0;          for (;i<strings.count;++i)              printf("%s\n",strings.data[i]);      }  }  //获取ACL信息  void getACL(zhandle_t *zkhandle,char *str)  {      struct ACL_vector acl;      struct Stat stat;      int flag = zoo_get_acl(zkhandle,str,&acl,&stat);      if (flag==ZOK)      {          printf("-----------------the ACL of %s:\n------------",str);          printf("%d\n",acl.count);          printf("%d\n",acl.data->perms);          printf("%s\n",acl.data->id.scheme);          printf("%s\n",acl.data->id.id);      }  }  void delete(zhandle_t *zkhandle,char *str)  {      int flag = zoo_delete(zkhandle,str,-1);      if (flag==ZOK)      {          printf("delete node success\n");      }  }    int main(int argc, const char *argv[])  {      const char* host = "192.168.1.106:2181";      int timeout = 30000;      char buffer[512];      int *bufferlen;        zoo_set_debug_level(ZOO_LOG_LEVEL_WARN); //set loglevel     zhandle_t* zkhandle = zookeeper_init(host,zktest_watcher_g, timeout, 0, "hello zookeeper.", 0);      if (zkhandle ==NULL)      {          fprintf(stderr, "Error when connecting to zookeeper servers...\n");          exit(EXIT_FAILURE);      }          char str[]="/zk_test";      if(wexists(zkhandle,str) < 0)      {        printf("%s not existed..\n", str);        create(zkhandle,str);      }    get(zkhandle, str);      getChildren(zkhandle,str);      getACL(zkhandle,str);      delete(zkhandle,str);      return 0;}

编译:
gcc test.c -I ../include/ -lzookeeper_mt  (注意将.h文件都移至include目录)

运行:

[bo@localhost test_z]$ ./a.out Something happened.type: -1state: 3path: watcherCtx: hello zookeeper./zk_test not existed..同步方式创建节点-----------------------just for testingpath:/zk_test创建的节点名称为:/zk_test同步方式获取节点数据-----------------------节点/xyz3的数据为: hahah-----------------the ACL of /zk_test:------------131worldanyonejust for testingpath:/zk_testdelete node success


参考:

http://www.cnblogs.com/haippy/archive/2013/02/21/2919365.html


后续学习:

1.zookeeper分布式锁

2.watch功能





0 0