`
BruceChan_GY
  • 浏览: 7282 次
社区版块
存档分类
最新评论

ZK in action笔记二

zk 
阅读更多
第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-AJAX学习笔记,记录了从准备环境、下载运行ZK到深入学习各个组件的过程。ZK是一款基于Ajax的开源Web应用框架,它允许开发者使用类似桌面应用的组件来构建Web应用,而无需...

    zk开发全套资料(插件,开发手册,jar包,笔记和程序事例)

    2. **开发手册**:这是学习和理解ZK框架的关键资源。开发手册通常包含了ZK的架构设计、API参考、事件处理机制、组件使用方法等内容,帮助开发者快速上手并深入理解ZK的工作原理。通过阅读手册,开发者能够掌握如何...

    python+zk笔记,xmind

    **二、Zookeeper的核心概念** 1. **节点(ZNode)**:Zookeeper中的数据存储是以节点的形式,每个节点都有唯一的路径标识,分为持久节点(PERSISTENT)和临时节点(EPHEMERAL)。 2. **观察者模式**:Zookeeper...

    zk入门.web框架

    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...... 大数据笔记,包含Hadoop、Spark、Flink、Hive、Kafka、Flume、ZK.......

    ZK2N PLC使用说明书V2.4

    ZK2N PLC使用说明书V2.4主要介绍了ZK2N系列可编程逻辑控制器(PLC)的使用方法,内容涵盖了接线图、指令说明、模拟量及温度教程、通讯功能说明、故障诊断等多个方面。由于标题中提到ZK2N PLC与三菱PLC在使用上基本...

    SMC ZK2-ZSEA-A设置方法

    ### SMC ZK2-ZSEA-A 设置方法详解 #### 一、产品概述 SMC ZK2-ZSEA-A是一款带有节能功能的真空发生器,它采用数字式压力开关技术,适用于各种工业自动化应用场景。该型号的产品能够有效提高真空系统的效率,并具备...

    zk从版本3.4.9升级到3.5.5

    zk从版本3.4.9升级到3.5.5详细笔记文档总结

    zk-bin-6.5.0.zip

    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 ...

    zkframework Eclipse插件 zkstudio ZK Studio

    **ZK Framework与Eclipse插件ZK Studio详解** ZK Framework是一款强大的Java Web开发框架,专注于构建富客户端用户界面。它提供了一种基于事件驱动和组件模型的编程方式,使得开发者无需处理复杂的JavaScript和HTML...

    zk框架zk7api

    zk后台api很全的,对于学习ZK很有用的。

    ZK32-1_library_zk_thinkkrz_zk32+9999zk.com_

    2. **32位系统兼容性**:由于提及“32 Bits”,这意味着这些库文件适用于32位的Windows操作系统。32位系统可以处理的最大内存地址空间约为4GB,对于大多数非服务器级的应用来说已经足够,但不支持超过4GB的内存。 3...

    使用JMeter对ZK性能测试时需要安装的插件

    2.修改zk.xml文件,添加下面内容(WEB-INF下) <system-config> <id-generator-class>foo.jmtest.SimpleIdGenerator</id-generator-class> </system-config> 3.安装ZK的JMeter插件 把压缩包中的 zk-jmeter-plugin...

    ZK+spring+hibernate的整合

    2. **集成Hibernate**:在Spring配置文件中,我们需配置Hibernate的SessionFactory,并利用Spring的JDBC模板或HibernateTemplate进行数据访问。这一步骤包括创建Hibernate的实体类、映射文件以及数据访问接口。 3. ...

    ZK4500SDK包 ZK4500、中控指纹仪、SDK开发包带各种语言的demo

    《ZK4500SDK:中控指纹仪的开发与应用》 在信息技术日新月异的时代,生物识别技术已经广泛应用于各个领域,其中指纹识别作为一种安全且便捷的身份验证方式,尤其受到青睐。ZK4500SDK是中控科技针对其ZK4500指纹仪...

    zk开发手册和注意事项

    2. ZK智能提示 为了提升开发效率,可以引入ZK智能提示功能。首先,在Eclipse中添加ZK智能提示文件的扩展名支持,然后引入ZUL文件对应的XML结构定义文档(zul.xsd)。这样ZUL文件不再是普通的文本文件,而是具有智能...

    ZK资料学习zk框架的助手

    2. **客户端(Client)**:ZK客户端库提供了多种语言的API,如Java、Python、C++等,方便开发者在各种环境中使用ZK。客户端与ZK服务器之间通过TCP长连接通信,可以订阅节点变化并接收实时通知。 3. **数据节点...

    幸福象花一样 ZKZK REMIX_2---02.flp

    幸福象花一样 ZKZK REMIX_2---02.flp

    ZK安装 ZK入门 开发 讲解 共3个pdf

    2. **事件处理**:理解ZK的事件模型,如何绑定事件监听器,以及如何在组件间传递事件。 3. **数据绑定**:掌握MVVM(Model-View-ViewModel)模式,学习如何使用数据绑定将UI组件与后台数据模型关联起来,实现数据的...

    SMC Zk2真空发生器说明书

    SMC真空发生器-ZK2省能型。日本SMC真空发生器多级真空发生器采用三级喷嘴结构设计,使得只利用较少的压缩空气就能够产生约3倍左右的真空抽气量,DRM多级真空发生器的真空抽气量从14L/MIN到11928L/MIN,真空度达到-92...

Global site tag (gtag.js) - Google Analytics