zookeeper简介
分布式管理工具,基于原子广播zab协议(存数据是加锁的),为分布式而生,适合存储少量数据,提供数据及节点变化监听。
应用:统一命名服务,配置管理,集群管理,共享锁,队列管理。
一:集群搭建:
0、放开防火墙
1、安装jdk(zookeeper服务器用java编写,依赖jdk)
2、vim /etc/profile 配置java和zk的环境变量
3、mv zoo_sample.cfg zoo.cfg
4、改hosts,并可以ping通
5、vim zoo.cfg 修改dateDir=/usr/local/soft/zookeeper-new/data
6、zoo.cfg最后添加
server.0=lolip12:2888:3888
server.1=lolip13:2888:3888server.2=lolip14:2888:3888
7、在dateDir下创建myid文件,并标识,内容为server.后面的数字
8、启动,节点都要启动,zkServer.sh start
9、如果出现拒绝连接,看hosts中,127.0.0.1 lolip12(就是那啥) 是否有对应,有就删掉。
10、启动之后,查看状态,zkServer.sh status,只会选举出一个leader
二:zk简单了解
zk的配置:
配置信息在客户端和服务端连接时可以重新配置,如超时信息。
zkCli.sh。客户端连接本机的zk,集群中连接任何一个都可使用。
zk采用树形文件结构存储管理存储数据。初始只有一个/的根节点
命令:ls create get set rmr(递归删除) delete(有子节点则不能删除)
节点类型:
短暂:会话结束后节点就会被删除,此类型不能有子节点目录(KeeperErrorCode = NoChildrenForEphemerals)。
持久:持久存在。
三:zk的原生api使用
zk大概有三套api,原生api,zkClient,curator
原生api不支持递归创建和递归删除。
zkClient可以递归创建和递归删除,watch从读操作中分离了,改为了设置监听,不用反复监听了。
原生api:
四:watch触发器
Zookeeper的watch实际上要处理两类事件:
1、连接状态事件(type=None, path=null),这类事件不需要注册,也不需要我们连续触发,我们只要处理就行了。
2、节点事件,节点的建立,删除,数据的修改。它是one time trigger,我们需要不停的注册触发,还可能发生事件丢失的情况。
上面2类事件都在Watch中处理,也就是重载的process(Event event)
节点事件的触发,通过函数exists,getData或getChildren来处理这类函数,有双重作用:
1、注册触发事件
2、函数本身的功能
节点事件类型:
zk可以为所有的读操作设置watch监听器,包括getData()、getChildren()和exists()。
ZooKeeper所管理的watch可以分为两类:
1、数据watch(data watches):getData()和exists()负责设置数据watch
2、孩子watch(child watches):getChildren()负责设置孩子watch(仅仅是子节点,不包括子节点下的子节点...)
我们可以通过操作返回的数据来设置不同的watch:
1、getData()和exists():返回关于节点的数据信息
2、getChildren():返回孩子列表,只监控子节点,不包括子节点下的子节点。
因此Nodechildrenchanged始终还是父节点在监听。
1、一个成功的setData()操作将触发znode的数据watch
2、一个成功的create()操作将触发znode的数据watch以及孩子watch
3、一个成功的delete()操作将触发znode的数据watch以及孩子watch