热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

ZooKeeper是如何管理Session的

ZooKeeper是一个分布式协调服务,客户端可以通过集群里的任何一个ZkServer来访问ZooKeeper的服务,无论该ZkServer是leader还是follower。任何

ZooKeeper是一个分布式协调服务,客户端可以通过集群里的任何一个ZkServer来访问ZooKeeper的服务,无论该ZkServer是leader还是follower。任何客户端在初次和ZkServer建立连接时,都是通过CreateSession这个操作来完成的。CreateSession和setData、delete等操作一样,都是事务型的,所以需要由leader ZkServer来完成。CreateSession成功后,leader节点上维护着所有客户端的session信息,并且周期性地检查这些客户端的session信息,一旦客户端与ZooKeeper服务端失去连接,并且时间达到session timeout(客户端在CreateSession时设定的),那么leader ZkServer就会把超时的客户端关闭掉,并且把该客户端所创建的所有临时znode也都删除掉。

以上的内容,在大部分ZooKeeper的资料中都会提到。但是有一个问题,那就是我上面说到,客户端可以通过任何一个ZkServer来访问ZooKeeper服务,不妨假设是一个follower ZkServer,这个客户端的session信息,是由leader ZkServer来维护的,那么leader怎么知道这个客户端和follower ZkServer的连接是不是正常呢?

带着这个问题,我翻了翻源代码。ZooKeeper源代码写得还是挺好的,抽象程度挺高的,看得我有点绕,不过还是找到了一些蛛丝马迹。简单点地说,就是以下几点:

  1. 客户端会不时地向所连接的ZkServer发送ping消息,ZkServer接收到ping消息,或者任何其它消息的时候,都会将客户端的session_id,session_timeout记录在一个map中。假设客户端连接的是一个follower ZkServer,那么每次客户端访问这个follower ZkServer的时候,map中都会记一条session的记录(同一个session_id最多只有一条)。
  2. Leader ZkServer会周期性(每半个ticktime)地向所有的follower ZkServer发送心跳消息(ping),follower接收到ping消息后,会将记录session信息的map作为返回消息,返回给leader ZkServer,同时清空follower本地的map. Leader ZkServer使用这些信息,刷新leader上维护的Session,也就是重新计算客户端的超时时间。
  3. 一旦在session timoue的时间内,leader即没有从其它follower上收集到客户端的session信息,也没有直接接收到该客户端的任何请求,那么该客户端的session就会被关闭。

通过上面的流程,Leader就可以掌握当前ZooKeeper集群的所有客户端的session信息。


推荐阅读
  • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
  • 深入探讨ASP.NET中的OAuth、JWT与OpenID Connect
    本文作为前文关于OAuth2.0和使用.NET实现OAuth身份验证的补充,详细阐述了OAuth与JWT及OpenID Connect之间的关系和差异,旨在提供更全面的理解。 ... [详细]
  • 收割机|篇幅_国内最牛逼的笔记,不接受反驳!!
    收割机|篇幅_国内最牛逼的笔记,不接受反驳!! ... [详细]
  • 优化使用Apache + Memcached-Session-Manager + Tomcat集群方案
    本文探讨了使用Apache、Memcached-Session-Manager和Tomcat集群构建高性能Web应用过程中遇到的问题及解决方案。通过重新设计物理架构,解决了单虚拟机环境无法真实模拟分布式环境的问题,并详细记录了性能测试结果。 ... [详细]
  • Zookeeper面试常见问题解析
    本文详细介绍了Zookeeper中的ZAB协议、节点类型、ACL权限控制机制、角色分工、工作状态、Watch机制、常用客户端、分布式锁实现、默认通信框架以及消息广播和领导选举的流程。 ... [详细]
  • 深入解析:主流开源分布式文件系统综述
    本文详细探讨了几款主流的开源分布式文件系统,包括HDFS、MooseFS、Lustre、GlusterFS和CephFS,重点分析了它们的元数据管理和数据一致性机制,旨在为读者提供深入的技术见解。 ... [详细]
  • 本文深入探讨ZooKeeper的功能与应用场景,解释其作为开源分布式协调服务的核心作用,以及如何通过ZooKeeper实现数据的一致性和高可用性。 ... [详细]
  • Spring Cloud Config: 高效统一的配置管理解决方案
    Spring Cloud Config 是一个用于集中管理和分发应用程序配置的工具,支持多环境下的配置管理(如开发、测试和生产环境),并且能够根据需求动态调整配置参数(例如,在大型促销活动期间增加数据库的最大连接数)。 ... [详细]
  • 在使用 Spring Cloud Config 作为配置中心时,若在配置文件中指定了请求路径但未能生效,本文将探讨其原因及解决方案。 ... [详细]
  • Git支持通过自定义钩子来扩展其功能,这些钩子根据触发条件的不同,可以分为客户端和服务器端两种类型。客户端钩子通常与本地操作相关联,如提交代码或合并分支;而服务器端钩子则与远程仓库的交互有关。 ... [详细]
  • 本文探讨了在使用MyBatis Generator过程中遇到的'Communication Link Failure'错误,并提供了多种有效的解决方案。 ... [详细]
  • 本文提供了一套实用的方法论,旨在帮助开发者构建能够应对高并发请求且易于扩展的Web服务。内容涵盖了服务器架构、数据库管理、缓存策略以及异步处理等多个方面。 ... [详细]
  • 在Ubuntu 16.04中使用Anaconda安装TensorFlow
    本文详细介绍了如何在Ubuntu 16.04系统上通过Anaconda环境管理工具安装TensorFlow。首先,需要下载并安装Anaconda,然后配置环境变量以确保系统能够识别Anaconda命令。接着,创建一个特定的Python环境用于安装TensorFlow,并通过指定的镜像源加速安装过程。最后,通过一个简单的线性回归示例验证TensorFlow的安装是否成功。 ... [详细]
  • MQTT协议:轻量级消息传输的基石
    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种基于发布/订阅模式的轻量级通信协议,适用于低带宽、高延迟或不可靠的网络环境。该协议基于TCP/IP构建,由IBM在1999年首次推出,旨在通过最小化网络流量和代码量,为远程设备提供高效、可靠的消息传输服务。 ... [详细]
  • 手机应用开发详解:从需求到上线的全过程
    手机应用的开发流程一直是非专业人士好奇的话题。本文将详细介绍从需求分析到最终上线的每一个步骤,包括专业的测试和交付过程。 ... [详细]
author-avatar
微笑5885
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有