ZooKeeper的“会话终止”是这么出现的

转载请注明出处: jiq?钦‘s
technical Blog

经过我的测试,得出关于会话终止的下列结论:

客户端创建ZooKeeper实例连接到ZooKeeper服务端,设置会话超时时间为10s。

(1)若强制关闭ZooKeeper服务端(模拟其崩溃),客户端立马收到Disconnected连接断开事件,等待半个小时,再次启动ZooKeeper服务端,客户端收到SyncConnected连接建立事件,在这之前注册的watcher仍然有效,推测临时节点也一样有效。

(2)若断开客户端与服务端的网线(模拟网络断开),客户端立马收到Disconnected连接断开事件,等待11s再次插上网线,客户端收到Expired会话终止事件,之前注册的watcher不再有效,推测临时节点也会删除。

结论:

客户端连接到服务端的会话超时时间由服务端记录,客户端每隔一段时间(小于这个会话时间)向服务端发送心跳,服务端就不会将与这个客户端的会话设置为失效!!!

若服务端自己死掉了,将不给这个会话事件做倒计时,若是客户端关闭或者连接断开,就会进行会话终止倒计时,时间一到将会认定会话失效,认为客户端死掉。

还有一种情况可能出现会话终止:即客户端与服务端网络闪断,然后ZooKeeper客户端会自动从服务端地址列表中选择下一个ZooKeeper服务器进行重连,若这个重连时间超过设定的超时时间,比如10s,也会发送会话超时。

你可能会说重连怎么会超过10s呢?假如你在客户端再会话倒计时还剩7s的时候正要给服务端发送心跳,不幸网络刚好断开,然后选择一个重连,这个重连超过3s,那就超时了。

所以说,客户端开发人员进行ZooKeeper开发时,如果你注册到服务端的watcher以及创建的临时节点至关重要时,你可能不需要担心因为ZooKeeper服务器挂掉导致会话失效,但是一定要防备因为网络断开,然后经过会话超时时间之后又自动重新建立连接的情况,因为这个时候会话终止了!!!

如果网络经常闪断,但是断开时间不长,为求保险,可以讲会话超时时间设置长一点,一般30s。

是否可以设置为无限长,比如几天?

下面附上我的测试程序:

注册了watcher的客户端:

public class ZooKeeperTest implements Watcher
{
	private CountDownLatch latch = new CountDownLatch(1);

	public ZooKeeper GetConnection() throws Exception
	{
		ZooKeeper zk = new ZooKeeper("192.168.1.108:2181", 3000, this);
		latch.await();
		return zk;
	}

	@Override
    public void process(WatchedEvent event ) {
        System.out.println( "收到事件通知:" + event.getState() +"\n路径是:"+event.getPath());
        if (KeeperState.SyncConnected == event.getState() ) {
            latch.countDown();
        }
    } 

    public static void main(String[] args) throws Exception
    {
    	ZooKeeperTest obj = new ZooKeeperTest();
    	ZooKeeper zk = obj.GetConnection();

    	System.in.read();
    	zk.close();
    }
}

首先将ZooKeeper服务器强制关闭,过了很久很久在重新开启,输出如下:

收到事件通知:SyncConnected

路径是:null

收到事件通知:Disconnected

路径是:null

收到事件通知:SyncConnected

路径是:null

然后再跑一下我的修改ZooKeeper节点的程序:

public class NodeChangeTest implements Watcher
{
	private CountDownLatch latch = new CountDownLatch(1);

	public ZooKeeper GetConnection() throws Exception
	{
		ZooKeeper zk = new ZooKeeper("192.168.1.108:2181", 3000, this);
		latch.await();
		return zk;
	}

	@Override
    public void process(WatchedEvent event ) {
        System.out.println( "收到事件通知:" + event.getState() +"\n"  );
        if (KeeperState.SyncConnected == event.getState() ) {
            latch.countDown();
        }
    }
	public static void main(String[] args) throws Exception
	{
		NodeChangeTest test = new NodeChangeTest();
		ZooKeeper zk = test.GetConnection();

		zk.setData("/test", "zNode2".getBytes(), -1);
		zk.close();
	}
}

收到下面信息,表明watch时间触发:

收到事件通知:SyncConnected

路径是:/test

如果是将网线断开,过了5s又插上将会有如下输出:

收到事件通知:SyncConnected

路径是:null

收到事件通知:Disconnected

路径是:null

收到事件通知:Expired

路径是:null

修改ZooKeeper节点的程序也没有任何反应。

时间: 2024-10-29 10:46:19

ZooKeeper的“会话终止”是这么出现的的相关文章

创建一个zookeeper的会话(实现watcher)

在先前的章节中,我们利用zkCli去了解了一下主要的zookeeper的操作.在接下来的章节中,我们将会学习一下在应用中是怎样利用zookeeper的api的.接下来我们将利用一个程序展示一下,怎样来创建一个回话和监视. 那么以下我们将開始一个主从模式的结构样例. 创建一个zookeeper的会话 如以下所看到的,每个建立的会话一旦它的连接被破坏,将会转移到其它的zookeeper服务.仅仅要会话保持通畅.那么句柄将会有效.那么zookeeperclient类库将会经历的保持连接.假设句柄关闭了

linux screen --解决会话终止当前进程断开的问题!

使用原因: 远程到服务器,经常运行一些需要很长时间才能完成的任务,比如备份数据,传输数据等.通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了.必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了. 优点: 会话恢复 只要Screen本身没有终止,在其内部运行的会话都可以恢复.这一点对于远程登录的用户特别有用--即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制.只要再次登录到主机上执行screen -r就可以恢复

查询发生死锁的表, 数据库当前会话, 终止会话

查询发生死锁的表 SELECT request_session_id spid , OBJECT_NAME(resource_associated_entity_id) tableNameFROM sys.dm_tran_locksWHERE resource_type = 'OBJECT' 数据库当前链接 select top 1000 * from sys.dm_exec_connectionsgo 杀死某一会话 kill sessionid

【分布式】Zookeeper会话

一.前言 前面分析了Zookeeper客户端的细节,接着继续学习Zookeeper中的一个非常重要的概念:会话. 二.会话 客户端与服务端之间任何交互操作都与会话息息相关,如临时节点的生命周期.客户端请求的顺序执行.Watcher通知机制等.Zookeeper的连接与会话就是客户端通过实例化Zookeeper对象来实现客户端与服务端创建并保持TCP连接的过程. 2.1 会话状态 在Zookeeper客户端与服务端成功完成连接创建后,就创建了一个会话,Zookeeper会话在整个运行期间的生命周期

终止会话

有时需要终止当前用户会话.例如,您可能想要执行管理操作并需要终止所有非管理会话.本节介绍终止会话的各个方面,并包含以下主题: 识别哪个会话终止 终止活动会话 终止非活动会话 当会话终止时,会话的任何活动事务都会回滚,会话持有的资源(例如锁和内存区)会立即释放并可供其他会话使用. 您使用SQL语句ALTER SYSTEM KILL SESSION终止当前会话.以下语句终止系统标识为7且序列号为15的会话: ALTER SYSTEM KILL SESSION '7,15'; 识别哪个会话终止 要确定

Curator源码解析(四)ZooKeeper存在的连接问题

都说Curator的连接机制比较牛逼,所以在分析Curator的连接和重试机制之前,我想先搞清楚原生的ZooKeeper的连接存在哪些问题. 下面是我查阅资料总结的结果,转载请注明出处: jiq?钦's technical Blog Curator虽然提供所谓的高层抽象API来简化了ZooKeeper的使用,但更重要的是封装了管理到ZooKeeper集群的连接以及重试机制的复杂性,下面我们来详细分析一下Curator在这方面都是怎么做的,不过在这之前先要搞清楚ZooKeeper目前在连接方面有哪

zookeeper基本概念及原理

zookeeper是一个分布式的,开源的分布式应用程序,该程序主要用于管理其他分布式应用程序.其他分布式应用程序可以基于zookeeper实现数据同步,配置维护和命名服务等等.zookeeper是Hadoop的一个子项目,由于在原有的分布式应用系统中,工程师不能很好的使用锁机制,或者基于消息的协调机制不适合在某些应用中使用,因此需要一种可靠的,可扩展的,分布式的,可配置的协调机制来统一系统的状态,Zookeeper的作用就在于此.本文简单介绍Zookeeper的相关名词概念,然后简单介绍其工作原

ZooKeeper概述(转)

ZooKeeper是一个用于分布式应用的开源分布式协调服务.它提供了简单的原语集合,分布式应用可在这些原语之上构建用于同步.配置维护.分组和命名的高层服务.ZooKeeper的设计使得编程容易,并且使用类似于广泛熟知的文件系统目录树结构的数据模型.它运行在Java环境中,但是有Java和C语言绑定. 分布式协调服务是出了名的难得编写正确,很容易出现竞争条件和死锁之类的错误.ZooKeeper的动机是减轻为分布式应用开发协调服务的负担. 1 设计目标 1.1 简单 ZooKeeper让分布式进程可

ZooKeeper程序员指南(转)

译自http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html 1 简介 本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的.本文包含理论信息和实践信息. 本指南的前四节对各种ZooKeeper概念进行较高层次的讨论.这些概念对于理解ZooKeeper是如何工作的,以及如何使用ZooKeeper来进行工作都是必要的.这几节没有代码,但却要求读者对分布式计算相关的问题较为熟悉.这四节是: l