- zk是一个树形目录服务,是一种分布式协调服务。有以下三种用途:
- 集群管理(在使用dubbo框架时使用zk作为注册中心)
- 配置中心(各个服务统一在zk中配置,不需要到项目源码中修改然后重新编译打包)
- 分布式锁
- zk服务端默认占用端口2181,是apache的顶级开源项目之一。
- zk客户端基本操作:
①:增加节点 create [-e|-s] 路径 [value]
- -s:表示顺序节点,每个节点名字之后带一串数字。
- -e:表示临时节点,即当前客户端断开之后再次进行重新连接所创建的节点就会消失。默认为持久性节点
②:删除节点 delete 节点路径 或者deleteAll 节点路径 - 当某个节点下面有子节点时不能使用delete删除成功,只能使用deleteAll删除
③:修改节点 set 节点路径 节点值 - 当新建节点没有设置值时可以使用set命令设置节点的值
④:查看节点 ls [-s] 节点路径 - 不带-s参数时,只能查看到当前节点下面有哪些子节点,带上-s参数时会查看到更详细的信息
- watch监听机制:
使用Curator这种java客户端来实现。由apache提供,不是zk官方提供的api,官方提供的比较难用
- NodeCache,监听某一个节点
- PathChildrenCache,监听某一个节点的所有子节点
- TreeCache,监听某个节点以及它所有的儿子节点
- 分布式锁:
创建临时顺序节点+watch监听机制
每个获取锁时新建一个临时顺序节点,然后给顺序号比自己小的节点最大的节点添加监听机制,只有当自己监听的顺序节点删除过后,当前线程才能获取到锁,操作完共享资源过后,然后释放锁资源,即删除当前线程在zk中创建的节点。依次类推。。
6.选举机制:一个leader,多个follower,多个observer(不参与选举)。选举与serverid(serverid越大,越容易选举为leader节点)和dataid(表示数据越新,更新越频繁,越容易选举为leader节点)。选举终止条件,当选举服务器个数超过总个数一半,就停止选举。当以服务器id为1,2,3,4,5时,依次启动,服务器id为3的就获取leader角色。因为服务器集群正常工作需要必须正常工作的单个服务个数超过一半,所以一般都设置为奇数,因为奇数和奇数加一的容错个数是一样的。 - zk注册监听原理,首先在一个业务线程中开启两个线程,一个是从connect线程,另一个是listenner线程,首先客户端发送一个注册监听事件到zk服务端的注册监听列表之中,然后服务端监听被监听的某个节点的数据或路径变化(路径变化就是子节点的增删改变化),会发送给listenner线程,程序员可以在listenner线程中做业务处理