日常zookeeper的使用记录(一)

最近在使用zookeeper做项目,故将zookeeper一些日常使用整理一下,欢迎各路大神拍砖。
使用zookeeper版本为3.4.5,zookeeper分布式框架服务是Apache Hadoop的一个子项目,它主要是用来解决分布式应用中出现的一些数据管理,如:统一命名服务,分布式应用中的配置项统一管理,集群管理,分布式共享锁等。
安装和配置
zookeeper的部署,我使用的是linux机器,由于zookeeper是java编写的,顾可在各个平台运行。(这貌似是废话)
下面介绍zookeeper简单的配置。下载zookeeper的安装包后,解压会发现conf目录下有个zoo_sample.cfg,重命名其为zoo.cfg.zookeeper启动时会找这个文件作为默认配置。
#每次心跳时间间隔
tickTime=2000
#Follow连接到leader的最大容忍的心跳次数,不是客户端,超过10*2s表示连接失败
initLimit=10
#Follow与leader之间,发送请求和应答时间最大能容忍多少个心跳数
syncLimit=5
#快照的存储位置,zookeeper保存数据的目录
dataDir=/home/zookeeper/data
#zookeeper保存日志文件的目录
datalogDir=/home/zookeeper/dataLog
#服务端提供的工客户端访问的端口,默认是2181
clientPort=2181
上面是zookeeper的基本配置,zookeeper支持伪集群与分布式的部署,如果你手头机器不够充裕,作为测试,伪集群也能满足需求。伪集群的部署如下,注意伪集群时clientPort需要设置的不一样。
server.1=192.168.1.61:2888:3888
server.2=192.168.1.61:2889:3887
server.3=192.168.1.61:2890:3886
多台机器的部署如下
server.1=192.168.1.61:2888:3888
server.2=192.168.1.62:2888:3888
server.3=192.168.1.63:2888:3888
上述格式可描述为server.A=B:C:D A表示第几号服务器,需要在data目录下创建myid文件,文件中的数字就是A;B表示服务器的IP,C是服务器与leader的通信端口,D是万一leader挂掉之后的选举端口。
有了上述配置,在bin目录下,伪集群可能有多个zoo.cfg,这时需要使用./zkServer.sh zoo1.cfg;分布式集群使用./zkServer.sh启动即可集群启动时会在bin目录下生成zookeeper.out文件,看是否有问题还可使用./zkCli.sh连接服务器,默认连接的是2181端口,如果连接其他端口,使用./zkCli.sh -server IP:port
数据模型
zookeeper会维护一个具有层次关系的数据结构,类似于一个标准的文件系统

|--/
	|--App1
		|--child1
		|--Child2
	|--App2

每个节点被称为一个znode,znode可以有子节点并且存储数据,EPHEMERAL类型的znode不能拥有子节点。每个znode节点中的数据都是有版本的,也就是一个znode可以存储多份数据,zookeeper客户端与服务器的通信室长连接的形式,一旦有临时节点,session失效,那么临时节点就会被删除。zookeeper的核心特性是znode的节点被监控,监控节点中数据的改变,节点的创建删除等(亲测,如果监控只监控到父节点,父节点下的子节点改变无法被监控到,如果监控到子节点,父节点的变化也无法被监控到,可以监控不存在的节点,在节点创建成功时被监控)zookeeper的很多特性都是根据这个特点使用的。

使用方式

zookeeper作为一个分布式框架服务,主要用来解决分布式系统中数据一致性的问题,它能提供类似于文件系统目录结构的节点存储数据,但是它的主要作用并不是存储数据。而是用来监控和维护节点中存储数据的状态和变化,达到基于数据的集群管理。

zookeeper的使用操作代码如下

// 创建一个与服务器的连接
 ZooKeeper zk = new ZooKeeper("localhost:" + 2181, timeout, new Watcher() { 
            // 监控所有被触发的事件
            public void process(WatchedEvent event) { 
<span style="white-space:pre">		</span>//第一个会是null事件,即event.getPath()=null
                System.out.println("已经触发了" + event.getType() + "事件!"); 
            } 
        }); 
 // 创建一个目录节点
 zk.create("/root", "root".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); 
 // 创建一个子目录节点
 zk.create("/root/child1", "child1".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); 
 System.out.println(new String(zk.getData("/root",false,null))); 
 // 取出子目录节点列表
 System.out.println(zk.getChildren("/root",true)); 
 // 修改子目录节点数据
 zk.setData("/root/child1","modifyChild1".getBytes(),-1); 
 System.out.println("目录节点状态:["+zk.exists("/root",true)+"]"); 
 // 创建另外一个子目录节点
 zk.create("/root/child2", "child2".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); 
 System.out.println(new String(zk.getData("/root/child2",true,null))); 
 // 删除子目录节点
 zk.delete("/root/child2",-1); 
 zk.delete("/root/child1",-1); 
 // 删除父目录节点
 zk.delete("/root",-1); 
 // 关闭连接
 zk.close();

zookeeper在创建监听时,首先会执行processor的null监听,在使用时需要进行初次判断。创建监听后,需要首先注册监听,每次执行完processor之后,需要再次注册监听,否则无法证长监听。注册监听可以使用如下代码:

zk.exist(path, true),zk.exist(path, new Watcher(){}),这两句都是注册监听,用法基本一样,表达的意思也基本一样,同时可判断节点在zookeeper当中是否存在。

zk.exist(path, false)不注册监听,之判断节点在zookeeper当中是否存在。

下篇谈一下对某一类应用场景zookeeper的用法。










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值