本文主要是介绍ZooKeeper:Connection Loss/Session Expired,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
会话
ZooKeeper客户端和服务端建立Socket长连接之后,服务器端创建一个session,生成一个全局唯一的会话ID(Session ID)。在SESSION_TIMEOUT时间内,服务器会确定客户端是否正常连接(客户端会定时向服务器发送心跳信息,服务器重置下次SESSION_TIMEOUT时间)。因此,在正常情况下,session一直有效,并且ZooKeeper集群所有机器上都保存这个session信息。客户端什么时候向服务器发送心跳消息?
在创建Session时,需要设置Session Timeout参数,该参数是Zookeeper服务允许一个session在定义它失效之前的时间。如果服务在时间t内不能看到与一个session关联的消息,它将定义这个session失效。如果客户端在1/3 t时间内没有听到任何从服务器过来的消息,它将发送一个心跳消息给服务器。在(2/3)t时间, Zookeeper客户端开始寻找另一个Zookeeper服务器,并且它有另外的(1/3)t的时间寻找。
因为网络原因或者服务器原因,Socket 断开,客户端尝试重新连接,等到重新连接上,发现之前的session已经不在了,服务器会告诉客户端会话超时,客户端会关闭session,然后开启新的session.。
客户端将连接哪一个服务器?
在Quorum模式,一个客户端拥有多个服务器可以连接。然而在Standalone模式,它必须尝试有效地连接到那个唯一的服务器。在Quorum模式,会传一个服务器列表到客户端,客户端从中选择一个连接。
当尝试连接另一个服务器时,很重要的一点是这个服务器的ZooKeeper状态至少要和客户端已经观察到的最近ZooKeeper状态是一样新的。Z
这篇关于ZooKeeper:Connection Loss/Session Expired的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!