ZooKeeper session管理

ZooKeeper的每个客户端都维护一组服务端信息,在创建连接时由应用指定,客户端随机选择一个服务端进行连接,连接成功后,服务端为每个连接分配一个唯一标识。客户端在创建连接时可以指定溢出时间,客户端会周期性的向服务端发送PING请求来保持连接,当客户端检测到与服务端断开连接后,客户端将自动选择服务端列表中的另一个服务端进行重连。客户端允许应用修改服务端列表,但修改可能导致客户端与服务端的重连。

连接状态转换

ZooKeeper使用session来表示客户端和服务端的连接。ZooKeeper的客户端管理一个可用的服务端列表,ZooKeeper客户端首先创建一个handle,handle建立后处于CONNECTING状态,然后客户端随机选择一个服务端进行连接,连接成功后,handle的状态更换到CONNECTED状态。如果出现无法恢复的错误,例如;会话终止或者认证失败,或者应用直接关闭handle,handle将转换到CLOSED状态。
下面是一个ZooKeeper客户端状态转化图:
连接状态转换

创建session

创建客户端session时,应用必须传入一组以逗号分隔的host:port列表,每个都对应一个ZooKeeper服务端,ZooKeeper客户端将选择任意一个服务端并尝试与其连接,如果连接失败,或者由于某些原因导致客户端与服务端连接断开,客户端将自动的选择列表中的另一个服务端进行连接,直到成功。当session创建成功后,ZooKeeper服务端为session分配一个唯一标识。

指定根路径

在ZooKeeper 3.2.0增加了可选的“chroot”后缀,可以改变当前客户端的根路径。例如,如果使用”127.0.0.1:4545/app/a”,客户端将使用”/app/a”作为其根路径,所有的路径都会相对于该路径。比如操作路径”/foo/bar”将真正对应到”/app/a/foo/bar”。这个特征在多租户环境下是非常有用的,可以简化客户端的应用逻辑。

session id

ZooKeeper的每个session都会被分配一个64-bit数字来标识,称为session id,被分配到客户端,如果客户端重连到一个不同的ZooKeeper服务端,该session id将被发送到该服务端。为了保障安全,服务端会为该session id创建一个所有ZooKeeper服务器都能验证的密码,当session被建立时,密码和session id一起被发送到客户端,客户端在与一个新的服务端重建连接时,客户端会将密码和session id一同发送到新的服务端。

溢出时间

ZooKeeper客户端在创建session时可以指定session的溢出时间,为一个毫秒值。客户端发送带溢出时间的请求,服务端的响应中将带上溢出时间。当前要求溢出时间的最小值为tickTime(在服务端配置)的2倍,最大值为tickTime的20倍。
当服务端未接收到客户端的消息的时间达到溢出时间后,该session将被终止,详见“重连”。

重连

当客户端从ZK服务端簇中分离时,它将开始从创建session时指定的服务端列表中选择下一个服务器重建连接,session要么重新转化到”connected”状态(连接处在溢出时间内),要么转换到”expired”状态(连接时间溢出)。
上诉所有操作都应该交由Zk客户端自动处理,只有当连接时间溢出后,才应该创建一个新的session。
session溢出由Zk服务端管理,如果客户端建立session时指定了溢出时间,并且ZK服务端在该时间周期内没有接收到来自客户端的任何消息(例如心跳),session将被断开。session断开时,ZK服务端将删除所有该session的临时节点,并立刻通知其他监听变化的客户端。当TCP连接重建连接后,溢出session的客户端将接收到”session expired”通知。
下面是对整个过程的详细描述:

  1. session成功创建,session进入’connected’状态;
  2. 客户端与服务端分离;
  3. 客户端失去与服务端的连接;
  4. 当时间溢出,服务端簇终止session,但客户端不会受到任何通知;
  5. 客户端与服务端重新建立TCP连接;
  6. 客户端重连到服务端,并接收到”session expired”通知。
    session通过客户端的请求来保持活跃,如果session的空闲时间达到溢出时间,客户端将发送一个PING请求以保持session活跃。PING请求既可以通知服务端客户端是活跃的,也能检测客户端与服务端的连接可用。考虑到网络延迟和服务端处理能力等因素,PING请求的时间点应该足以保证足够检测到一个失效的连接并重连到一个新的服务端,换句话说,就是PING的时间点应该保证检测到连接失效后,客户端重新连接到服务端的时间不会导致session溢出。

异常处理

当客户端与服务端的连接建立后(connected),以下操作会导致连接异常:
1. 应用在一个不再活跃/有效的session上执行操作;
2. 当存在客户端与服务端的异步操作正在执行时,客户端执行断开连接操作。

SessionMovedException

版本3.2.0增加。
SessionMovedException是一个内部异常,不会暴露到客户端。当服务端收到一个请求,该请求的连接对应的session已经被移动到其他服务端,则抛出该异常。
这个异常出现的原因通常是:客户端发送了一个请求到服务端,但由于网络延迟,以至于客户端时间溢出并连接到了一个新的服务端,当旧的请求到达服务端时,服务端探测到session已经被移到新的服务端,将抛出异常并关闭连接。
客户端通常不从旧的连接读取信息,因此不会关注到该异常。但存在一种场景该异常将被看到:两个客户端尝试重建同一个连接(使用相同的session id和密码),客户端中的一个将重建连接成功,而另一个将失败(如果不关注该异常,将导致失败者无限期的尝试重建链接)。

更新服务器列表

客户端在建立session时可以指定服务端列表(host:port列表),ZooKeeper允许客户端更新该列表。该操作可能会导致客户端重连到一个新的服务端:
1. 如果当前的主机不在新列表中,将必然导致重新连接;
2. 如果服务端列表的数量有增加或减少,根据负载均衡算法,可能会导致重新连接。
例如,如果先前的列表中包含了3个主机,而现在的列表中包含了原来的3个和新增的2个,原来的客户端将有40%会重连到新增的2个主机中的一个上以平衡负载。
再假如先前有5台主机,新的列表减少了2台主机,连接到剩下3台主机的客户端将保持连接,而所有连接到移除主机的客户端将会移动到剩下的3台主机上,主机的选择采用一种随机算法。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: HBase作为一个分布式系统,需要ZooKeeper来进行集群的协调和管理。在HBase中,ZooKeeper Session是指客户端与ZooKeeper服务器之间的逻辑连接,如果客户端与ZooKeeper服务器的Session失效,客户端需要重新连接到ZooKeeper服务器。 HBase的ZooKeeper Session重连机制分为两种情况: 1. 客户端与ZooKeeper服务器的连接断开,但是ZooKeeper服务器仍然存在,这种情况下客户端会尝试重新连接到ZooKeeper服务器,并恢复之前的Session。 2. ZooKeeper服务器不可用,这种情况下客户端会不断地重试连接,直到ZooKeeper服务器可用。当ZooKeeper服务器重新启动并且客户端重新连接成功后,客户端会创建一个新的Session。 ### 回答2: HBase是一个分布式数据库,它使用ZooKeeper来协调和管理其集群中的各个节点。在HBase中,当与ZooKeeper建立连接时,会创建一个会话(session),该会话会定期向ZooKeeper发送心跳以保持连接。 然而,由于各种原因,会话可能会中断,例如网络故障、ZooKeeper集群重新启动或者部分节点宕机等。在这种情况下,HBase会采取重连机制来重新建立与ZooKeeper的连接。 具体而言,HBase的重连机制如下: 1. 首先,HBase会在会话断开之后尝试与ZooKeeper重新建立连接,它会使用预先配置的ZooKeeper集群地址来查找并连接可用的ZooKeeper节点。 2. HBase会等待一段时间,并定期尝试连接ZooKeeper。默认情况下,它会每隔10秒尝试一次,直到连接成功或超过最大尝试次数。 3. 一旦HBase重新建立了与ZooKeeper的连接,它将恢复之前断开的会话。这意味着HBase将能够继续向ZooKeeper发送心跳以保持连接,并且能够接收和处理由ZooKeeper发送的事件通知。 4. 如果HBase尝试连接的次数超过了最大尝试次数,并且仍然无法建立连接,则表示重连失败。这时HBase会进行相应的错误处理,例如记录错误日志、抛出异常或进行其他操作。 综上所述,HBase的重连机制通过周期性地尝试连接ZooKeeper来保证与ZooKeeper的连接稳定性。这确保了HBase能够持续地与ZooKeeper进行通信,从而有效地管理和协调整个HBase集群的操作。 ### 回答3: HBase使用Zookeeper来进行协调和管理分布式集群的配置信息和状态信息。Zookeeper作为一个可靠的分布式协调服务,可以保证数据的一致性和可用性。 在HBase中,当Zookeeper与HBase Master建立连接时会创建一个会话(session),用于维护两者之间的通信。会话通常具有超时时间,一旦超过这个时间,Zookeeper会认为会话已失效并将其关闭。 当HBase Zookeeper会话丢失或超时后,会触发HBase的ZooKeeperWatcher机制进行重连。ZooKeeperWatcher是HBase中一个用于监视Zookeeper状态变化的线程。重连过程包括以下几个步骤: 1. ZooKeeperWatcher会尝试重新建立与Zookeeper的连接。它会检查是否存在已建立的连接,如果存在则会关闭旧连接。 2. 如果与Zookeeper的连接建立成功,则重新初始化HBase集群的状态。这包括重新注册HBase Master和RegionServer节点以及恢复已分配的Region。 3. 如果与Zookeeper的连接建立失败,则会进行重试。重试机制通常是指定一定的时间间隔后再次尝试连接,直到连接成功或超过最大重试次数。 需要注意的是,在HBase中,Zookeeper会话的重连过程是透明的,对HBase用户来说是无感知的。用户只需要确保在配置文件中正确指定Zookeeper集群地址,而不需要关心具体的重连机制。 总之,HBase的Zookeeper会话重连机制确保了与Zookeeper的连接的可靠性和一致性,使得HBase集群在网络异常或Zookeeper故障的情况下能够自动恢复正常的运行状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tomato__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值