Server ID: myid(权重越大)
Zxid:数据ID(先一数据低进行选择)
集群中半数以上机器存活,集群可用。所以zookeeper适合装在奇数台机器上。
但是,zookeeper工作时,是有一个节点为leader,其他则为follower,Leader是通过内部的选举机制临时产生的。
假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。假设这些服务器依序启动,来看看会发生什么。
(1)持久化目录节点(PERSISTENT)(小写:persistent)
客户端与zookeeper断开连接后,该节点依旧存在。
(2)持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)(小写:persistent_sequential)
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号。
(3)临时目录节点(EPHEMERAL)(ephemeral)
客户端与zookeeper断开连接后,该节点被删除。
(4)临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)(ephemeral_sequential)
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号。
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。
事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
(1) 首先要有一个main()线程
(2) 在main线程中创建ZK客户端,这是会创建两个线程,一个负责网络连接通信(connect),一个负责监听(listener)
(3) 通过connect线程将注册的监听事件发送给ZK
(4) 在ZK的注册监听器列表中将注册的监听事件添加到列表中
(5) ZK监听到有数据或路径发生变化时,就会将这个消息发送给listener线程
(6) Listener线程内部调用process()方法
1.监听节点数据的变化
Get path [watch]
2.监听子节点增减的变化
Ls path [watch]
读是局部性的,即client只需要从与它相连的server上读取数据即可;而client有写请求的话,与之相连的server会通知leader,然后leader会把写操作分发给所有server。所以定要比读慢很多。