一、ZK的配置文件zoo.cfg
参数
-
tickTime
- 基本事件单元,以毫秒为单位。这个时间是作为ZK服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每隔tickTime时间就会发送一个心跳。
-
dataDir
- 存储内存中数据库快照的位置,顾名思义就是ZK保存数据的目录,默认情况下,ZK将写数据的日志文件也保存在这个目录里。
-
clientPort
- 这个端口就是客户端连接ZK服务端的端口,ZK会监听这个端口,接受客户端的访问请求
-
initLimit
- 这个配置项是用来配置ZK接受客户端初始化连接时最长能忍受多少个心跳时间间隔数, 当已经超过10个心跳的时间(也就是tickTime)长度后ZK服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10 * 2000=20 秒
-
syncLimit
- 这个配置项标志Leader与Follower之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime的时间长度,总的时间长度就是 5 * 2000 = 10秒
-
server.A = B:C:D
- A表示这个是第几号服务器
- B表示这个服务器的ip地址
- C表示这个服务器与集群中的Leader服务器交换信息的端口
- D表示是万一集中的Leader服务器挂了,需要一个端口来重新进行选举, 选出一个新的Leader
二、创建节点ZNode方法:create
提供了两套创建节点的方法,同步和异步创建节点的方式。
2.1 同步创建节点
- 参数1,节点路径(名称):/nodeName (ZK原生的API是不允许递归创建节点的,也就是说在父节点不存在的情况下,不允许创建子节点)
- 参数2,节点内容:要求类型是字节数组(也就是说,不支持序列化方式,如果需要实现序列化,可使用java相关序列化框架)
- 参数3,节点权限:使用Ids.OPEN_ACL_UNSAFE开放权限即可。(这个参数一般在权限没有太高要求的场景下,没必要关注)
- 参数4,节点类型:创建节点的类型:CreateMode.* 提供四种节点类型
- 类型一:PERSISTENT(持久节点)
- 类型二:PERSISTENT_SEQUENTIAL(持久顺序节点)
- 类型三:EPHEMERAL(临时节点)
- 类型四:EPHEMERAL_SEQUENTIAL(临时顺序节点)
如果创建一个zk中已经有的值,那么程序会抛出异常。
2.2 异步创建节点
异步方式:(在同步参数基础上增加两个参数)
- 参数5:注册一个异步回调函数,要实现
AsynCallBack.StringCallBack
接口。重写processResult(int rc, String path, Object ctx, String name)
方法,当节点创建完毕后执行此方法。rc
:为服务端相应码:0表示调用成功、-4表示端口连接、-110表示指定节点存在、-112表示会话已经过期path
:接口调用时传入API
的数据节点的路径参数ctx
:表示调用接口传入API
的ctx
值name
:时间在服务器端创建节点的名称
- 参数6:传递给回调函数的参数,一般为上下文Context信息。
、建立客户端与ZK服务端的连接
控制台输出结果:
注意在这里面有一个坑,我也是趟了1个多小时。那就是需要将log4.properties放在src目录下面,且需要将src目录mark as root目录才可以。(如果是使用IDEA编译器的话必须这么做,否则会报日志错误)
二、ZK会话重连机制
- 会话连接与恢复
首先用四字命令来进行查看会话
从上图可以看出来,现在还没有会话
三、同步异步创建ZK节点
- 节点的增删改查
- watch与acl的相关操作