zookeeper定义为分布式应用程序协调服务,它的存储结构很类似与文件系统的结构,以节点的形式存储数据。
zookeeper三种角色
leader/follower/observer 其中主从区分是看哪个节点最先启动注册,observer的职责跟slave很像,但它不参与投票机制,例如主从更新数据是需要投票成功才更新的,所以节点多了会性能下降,observer可以很好支持扩展并解决这个问题。
zookeeper特性
Zookeeper客户端api
原生jdk-api:
缺点:没有封装递归创建父节点、递归删除子节点的函数,删除节点顺序不会容易出异常;建立连接由于是异步,瞬时可能获取不到连接对象,使用性较差。
zkclient:
原生基础上封装,支持级联删除、添加,优化使用,但对异常捕获和处理比较简单粗暴。
curator:
1.比较流行的客户端,有zkclient优点以外,加了重连机制,并支持事务
2.缓存和监听三大对象:
NodeCache: 监听指定节点的新增、删除、更新
PathChildrenCache: 对指定的路径节点的一级子目录进行监听,不对该节点的操作进行监听,对其子目录的节点进行增、删、改的操作监听
TreeCache: 可以将指定的路径节点作为根节点(祖先节点),对其所有的子节点操作进行监听,呈现树形目录的监听,可以设置监听深度,最大监听深度为2147483647(int类型的最大值),
分布式锁实现方法:
这里利用zookeeper的EPHEMERAL_SEQUENTIAL(临时节点)类型节点及watcher机制,来简单实现分布式锁。
主要思想:
1、开启10个线程,在disLocks节点下各自创建名为sub的EPHEMERAL_SEQUENTIAL节点;
2、获取disLocks节点下所有子节点,排序,如果自己的节点编号最小,则获取锁,处理锁内资源业务,删除自身sub节点,释放连接;
3、否则watch排在自己前面的节点,监听到其删除后,进入第2步(重新检测排序是防止监听的节点发生连接失效,导致的节点删除情况);