zk是一个高可用的文件系统,是一个具有高可用性的协调服务。zk中的路径必须是绝对地址。
zk使用路径/zookeeper子树来保存管理信息,如配额信息。
----------------------------------
zonde是保存小数据的容器(如同文件),也可以作为保存其他znode的容器(功能如同目录)。
两种类型的znode:持久(只能由客户端来删除)和短暂(客户端断开后znode就自动删除了。这类节点不会有子节点)。可以用短暂znode来实现组员的灵活加入与退出。
顺序号:用于为所有事件进行排序,可根据顺序号推断事件的顺序。在创建znode时设置了顺序标识,后续创建znode会以递增方式创建znode,znode的实际路径会在create后返回。
可以用取顺序号最小的临时znode作为leader,用来实现分布式锁控制。删除znode实现锁的释放。客户端过期,短暂znode会释放,对应了锁的释放。
『羊群效应』
创建顺序znode是非幂等操作。写是幂等操作。
在顺序znode名称中嵌入一个已知的id,可以用来判断重新连接后,之前的要创建的子节点是否成功创建了。最终顺序znode格式:lock-<sessionId>-<sequeueId>
wacher:在znode以某种方式变化时,zk会通过watcher回调通知客户端。可以针对zk服务的操作来设置watcher。watcher只能触发一次,触发后需再重新注册,才可能再次触发。
在读操作exists、getChildren、getData上可以设置watcher,这些watcher会被写操作create、delete、setData触发。
事件触发时可以调用相应的操作读取最新状态。从收到观察事件到执行读操作期间,znode的状态可能发生改变。
watcher可以用来获取zk状态变化通知,也可以获取znode变化通知。
ACL决定了谁可以对znode进行操作,用于客户端身份验证。exists不需要权限验证.ACL权限操作:CREATE,READ,WRITE,DELETE,ADMIN.
zk集群中只要存活超过半数的机子,就可以正常提供服务。
一致性保证:
1、客户端更新按提交顺序发送给集群slaves
2、更新操作的原则性。如果更新失败,客户端看不到更新结果。
3、滞后于故障服务器的其他slaves不会接受发给故障服务器的链接请求。
4、会对更新的数据进行持久化
zk客户端可以自动进行故障切换,切换后之前与故障服务器的会话仍然有效。建立连接后,客户端会自动进行ping,保持会话。
tick是zk中的基本时间周期。会话长度为[2tick,20tick]。较短的会话超时可以较快检测机器故障,但会导致slaves频繁的发送心跳给master。
可以在应用端做一定的超时恢复机制,在超时重试时提供超时会话的ID和密码,zk会恢复超时的会话环境。
zk中的服务器越多,会话超时时间应设置越大。
----------------使用------------------
zookeeper(hosts,SESSION_TIMEOUT,new Watcher(){
@Overwrite
public void process(WatchedEvent event){//连接zk服务器成功后回调
}
});
String znodePath=zk.create(znodePathStr,data,Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT/*客户端连接断开后znode数据仍存在*/);
List<String> childrenPaths=zk.getChildren(path,false);//获取所有的子znode
zk.delete(path,version);
删除znode时需提供版本号。如果提供的版本号与路径对应的znode的版本号一致,则会删除znode。这是乐观加锁机制。版本号设为-1可以绕过版本检测机制。
不支持递归删除操作,类似于目录删除,必须先删除所有的子znode后,才能删除父znode。
zk.setData(path,newData,version);//设置znode数据时也必须提供版本号
zk的数据读、写具有原子性。要么获取到znode的所有数据,要么失败。不会只读到部分数据。写是进行覆盖,数据只有完全写到znode才算是成功。写不支持append。
zk允许读到的数据滞后于zk的最新数据,客户端可以以异步方式调用sync()操作使自己的读操作可以获得最新数据。
zk中可以同步或异步方式执行操作,异步操作的结果是通过回调返回的。
zk使用路径/zookeeper子树来保存管理信息,如配额信息。
----------------------------------
zonde是保存小数据的容器(如同文件),也可以作为保存其他znode的容器(功能如同目录)。
两种类型的znode:持久(只能由客户端来删除)和短暂(客户端断开后znode就自动删除了。这类节点不会有子节点)。可以用短暂znode来实现组员的灵活加入与退出。
顺序号:用于为所有事件进行排序,可根据顺序号推断事件的顺序。在创建znode时设置了顺序标识,后续创建znode会以递增方式创建znode,znode的实际路径会在create后返回。
可以用取顺序号最小的临时znode作为leader,用来实现分布式锁控制。删除znode实现锁的释放。客户端过期,短暂znode会释放,对应了锁的释放。
『羊群效应』
创建顺序znode是非幂等操作。写是幂等操作。
在顺序znode名称中嵌入一个已知的id,可以用来判断重新连接后,之前的要创建的子节点是否成功创建了。最终顺序znode格式:lock-<sessionId>-<sequeueId>
wacher:在znode以某种方式变化时,zk会通过watcher回调通知客户端。可以针对zk服务的操作来设置watcher。watcher只能触发一次,触发后需再重新注册,才可能再次触发。
在读操作exists、getChildren、getData上可以设置watcher,这些watcher会被写操作create、delete、setData触发。
事件触发时可以调用相应的操作读取最新状态。从收到观察事件到执行读操作期间,znode的状态可能发生改变。
watcher可以用来获取zk状态变化通知,也可以获取znode变化通知。
ACL决定了谁可以对znode进行操作,用于客户端身份验证。exists不需要权限验证.ACL权限操作:CREATE,READ,WRITE,DELETE,ADMIN.
zk集群中只要存活超过半数的机子,就可以正常提供服务。
一致性保证:
1、客户端更新按提交顺序发送给集群slaves
2、更新操作的原则性。如果更新失败,客户端看不到更新结果。
3、滞后于故障服务器的其他slaves不会接受发给故障服务器的链接请求。
4、会对更新的数据进行持久化
zk客户端可以自动进行故障切换,切换后之前与故障服务器的会话仍然有效。建立连接后,客户端会自动进行ping,保持会话。
tick是zk中的基本时间周期。会话长度为[2tick,20tick]。较短的会话超时可以较快检测机器故障,但会导致slaves频繁的发送心跳给master。
可以在应用端做一定的超时恢复机制,在超时重试时提供超时会话的ID和密码,zk会恢复超时的会话环境。
zk中的服务器越多,会话超时时间应设置越大。
----------------使用------------------
zookeeper(hosts,SESSION_TIMEOUT,new Watcher(){
@Overwrite
public void process(WatchedEvent event){//连接zk服务器成功后回调
}
});
String znodePath=zk.create(znodePathStr,data,Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT/*客户端连接断开后znode数据仍存在*/);
List<String> childrenPaths=zk.getChildren(path,false);//获取所有的子znode
zk.delete(path,version);
删除znode时需提供版本号。如果提供的版本号与路径对应的znode的版本号一致,则会删除znode。这是乐观加锁机制。版本号设为-1可以绕过版本检测机制。
不支持递归删除操作,类似于目录删除,必须先删除所有的子znode后,才能删除父znode。
zk.setData(path,newData,version);//设置znode数据时也必须提供版本号
zk的数据读、写具有原子性。要么获取到znode的所有数据,要么失败。不会只读到部分数据。写是进行覆盖,数据只有完全写到znode才算是成功。写不支持append。
zk允许读到的数据滞后于zk的最新数据,客户端可以以异步方式调用sync()操作使自己的读操作可以获得最新数据。
zk中可以同步或异步方式执行操作,异步操作的结果是通过回调返回的。