第3章
Session的处理注意点:
如果session不再需要使用,需要立刻
close
CONNECTIONLOSS
客户端与zk service的连接断开,也就是TCP连接已经断开了。这时候如果进行原语操作,比如create等,就会出现CONNECTIONLOSS。
CONNECTIONLOSS的出现,会引起不确定的问题:即:之前的原语操作是否成功, 有如下3种情况:
1. 原语操作还没有发给服务端
2. 原语操作已经发给服务端,但是服务端还未执行
3. 原语操作已经发给服务端,服务端也执行了,但是客户端没有收到结果
因此应用在处理CONNECTIONLOSS时,需要容错这3种情况,实际上是2种情况,即:操作成功/失败的状态,是不确定的。
有2种处理方式:
1. 可以选择校验看是否成功,比如之前setData,现在可以getData进行确认;
2. 不在乎结果,那就重试发送。
总结:
Remember, ZooKeeper helps organize distributed state and provides a framework for handling failures; it doesnt make failures go away, unfortunately.
第4章
轮询不好,需要watch
watch是一次触发,比如exists原语,可以监控多个事件 create/delete/change,但是只要有1个事件触发,watch就结束了,而应用中很多时候是要连续watch,可参考curator等lib
一次触发,会不会导致丢失事件? 是会的,参考第2章的图,但是数据不会丢失。
watch生命周期是随着session的,只要session不过期,watch就是有效的。 比如zk server宕机,发生了重连,客户端的watch也会发给重连的zk server。 如果watch需要触发,则立刻触发,否则注册到zk server上。
session state:
SyncConnected
Disconnected
Expired
AuthFailed
ConnectedReadOnly
SaslAuthenticated
事件:
NodeCreated,
NodeDeleted
NodeDataChanged
NodeChildrenChanged
None
事件watch对应的操作原语:
NodeCreated
A watch is set with a call to exists.
NodeDeleted
A watch is set with a call to either exists or getData.
NodeDataChanged
A watch is set with either exists or getData.
NodeChildrenChanged
A watch is set with getChildren.
看一下示例代码:
这里主要是监控 session的状态变化,即 生命周期
/**
* This method implements the process method of the
* Watcher interface. We use it to deal with the
* different states of a session.
*
* @param e new session event to be processed
*/
public void process(WatchedEvent e) {
LOG.info("Processing event: " + e.toString());
// 事件为NONE,标明是Session状态变化
if(e.getType() == Event.EventType.None){
switch (e.getState()) {
case SyncConnected:
connected = true;
break;
case Disconnected:
connected = false;
break;
case Expired:
expired = true;
connected = false;
LOG.error("Session expiration");
default:
break;
}
}
}
这里是普通的exists API
// 判断事件类型
Watcher masterExistsWatcher = new Watcher(){
public void process(WatchedEvent e) {
if(e.getType() == EventType.NodeDeleted) {
assert "/master".equals( e.getPath() );
runForMaster();
}
}
};
watch设置后,是否可以删除呢? 目前无法直接删除,只能通过 session 过期 或者 主动close。
这个功能在3.5.0已经增加了,可以看下3.5.0的release notes:
http://zookeeper.apache.org/doc/r3.5.0-alpha/releasenotes.html
* [ZOOKEEPER-442] - need a way to remove watches that are no longer of interest
Description
currently the only way a watch cleared is to trigger it. we need a way to enumerate the outstanding watch objects, find watch events the objects are watching for, and remove interests in an event.
总结一下,watch可以用在2个地方:
1. 监视session的状态变化
2. 监视znode的节点变化
这里采用的是同一套机制,需要区分。 如果event是None,则是Session状态变化;如果event不是Node,则是znode变化
顺序性保证
写的顺序性
zk server对于写操作,是顺序进行的;在zk集群中,多个zk server的数据同步,也是按照顺序进行的,不会造成写乱序的情况。
当时因为延迟的情况,不能保证zk server的数据强一致,在某个时间点存在不一致的情况,比如某个数据还未同步过来。
读的顺序性
多个客户端,连接zk集群中不同的server,依然能保证按照顺序读到相应的修改。
但是因为 同步的不一致性, 不能保证同一个时间点,各个客户端读到的数据完全是一致的,一般来说,是没有问题的。 只有某个特殊情况会有问题,称为hidden channel,应该避免这种情况
notification的顺序性
第5章
对于失败,有不同的情况,这里说明一种情况:
假设是竞争/master,如果 当前的master因为网络等原因,与ZK已经断开连接,但是master不知道,还以为自己活着,而且自己做了master的事情。
而slave与zk是正常的, 从zk上发现/master已经挂掉了,就转换为master角色。
这时候出问题了,我们有2个master。 而如果某些操作 必须是互斥的,比如写文件, 这时候如果2个一起写,就导致数据错乱,系统挂掉了。
recoverable failures
unrecoverable failures
session过期
session认证错误
对于这种情况,只有2种处理方式:
1. 重启
2. 不重启,清除内部资源,重新初始化,重新创建session
分享到:
相关推荐
从给定的文件信息来看,这是一份详细的ZK-AJAX学习笔记,记录了从准备环境、下载运行ZK到深入学习各个组件的过程。ZK是一款基于Ajax的开源Web应用框架,它允许开发者使用类似桌面应用的组件来构建Web应用,而无需...
2. **开发手册**:这是学习和理解ZK框架的关键资源。开发手册通常包含了ZK的架构设计、API参考、事件处理机制、组件使用方法等内容,帮助开发者快速上手并深入理解ZK的工作原理。通过阅读手册,开发者能够掌握如何...
**二、Zookeeper的核心概念** 1. **节点(ZNode)**:Zookeeper中的数据存储是以节点的形式,每个节点都有唯一的路径标识,分为持久节点(PERSISTENT)和临时节点(EPHEMERAL)。 2. **观察者模式**:Zookeeper...
2. 对于Myeclipse,安装速度较快,可以直接通过窗口->首选项->ZK->ZK Package,添加zk-bin-prof-3.6.0.zip文件。 **二、ZK开发环境搭建** ZK的开发环境主要涉及JAR包的导入和web.xml的配置。首先,需要将ZK的相关...
大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK...... 大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK...... 大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK.......
ZK2N PLC使用说明书V2.4主要介绍了ZK2N系列可编程逻辑控制器(PLC)的使用方法,内容涵盖了接线图、指令说明、模拟量及温度教程、通讯功能说明、故障诊断等多个方面。由于标题中提到ZK2N PLC与三菱PLC在使用上基本...
### SMC ZK2-ZSEA-A 设置方法详解 #### 一、产品概述 SMC ZK2-ZSEA-A是一款带有节能功能的真空发生器,它采用数字式压力开关技术,适用于各种工业自动化应用场景。该型号的产品能够有效提高真空系统的效率,并具备...
zk从版本3.4.9升级到3.5.5详细笔记文档总结
ZK-574: Minimum theme for better performance in mobile devices ZK-1277: Group and listgroup components should be set as the same height as row and listitem components ZK-1273: Add a way to listen ...
**ZK Framework与Eclipse插件ZK Studio详解** ZK Framework是一款强大的Java Web开发框架,专注于构建富客户端用户界面。它提供了一种基于事件驱动和组件模型的编程方式,使得开发者无需处理复杂的JavaScript和HTML...
zk后台api很全的,对于学习ZK很有用的。
2. **32位系统兼容性**:由于提及“32 Bits”,这意味着这些库文件适用于32位的Windows操作系统。32位系统可以处理的最大内存地址空间约为4GB,对于大多数非服务器级的应用来说已经足够,但不支持超过4GB的内存。 3...
2.修改zk.xml文件,添加下面内容(WEB-INF下) <system-config> <id-generator-class>foo.jmtest.SimpleIdGenerator</id-generator-class> </system-config> 3.安装ZK的JMeter插件 把压缩包中的 zk-jmeter-plugin...
2. **集成Hibernate**:在Spring配置文件中,我们需配置Hibernate的SessionFactory,并利用Spring的JDBC模板或HibernateTemplate进行数据访问。这一步骤包括创建Hibernate的实体类、映射文件以及数据访问接口。 3. ...
《ZK4500SDK:中控指纹仪的开发与应用》 在信息技术日新月异的时代,生物识别技术已经广泛应用于各个领域,其中指纹识别作为一种安全且便捷的身份验证方式,尤其受到青睐。ZK4500SDK是中控科技针对其ZK4500指纹仪...
2. ZK智能提示 为了提升开发效率,可以引入ZK智能提示功能。首先,在Eclipse中添加ZK智能提示文件的扩展名支持,然后引入ZUL文件对应的XML结构定义文档(zul.xsd)。这样ZUL文件不再是普通的文本文件,而是具有智能...
2. **客户端(Client)**:ZK客户端库提供了多种语言的API,如Java、Python、C++等,方便开发者在各种环境中使用ZK。客户端与ZK服务器之间通过TCP长连接通信,可以订阅节点变化并接收实时通知。 3. **数据节点...
幸福象花一样 ZKZK REMIX_2---02.flp
2. **事件处理**:理解ZK的事件模型,如何绑定事件监听器,以及如何在组件间传递事件。 3. **数据绑定**:掌握MVVM(Model-View-ViewModel)模式,学习如何使用数据绑定将UI组件与后台数据模型关联起来,实现数据的...
SMC真空发生器-ZK2省能型。日本SMC真空发生器多级真空发生器采用三级喷嘴结构设计,使得只利用较少的压缩空气就能够产生约3倍左右的真空抽气量,DRM多级真空发生器的真空抽气量从14L/MIN到11928L/MIN,真空度达到-92...