客户端与Zookeeper Service建立会话
摘自《apache zookeeper essentials》
客户端可以连接到配置了很多服务器的Zookeeper集群,客户端尝试连接服务器列表中的随机的一台,如果连接失败,它会尝试连接下一台服务器,以此类推。直到所有的服务器都被尝试过或者已经成功建立了连接
一旦客户端与服务器建立了连接,服务器和客户端之间就创建了一次会话(session),一串64-bit的数字分配给客户端。对于Zookeeper来讲,会话是非常重要的,会话关系着每一次客户端在Zookeeper Service所执行的操作
session在Zookeeper中扮演着尤为重要的角色。比如,临时结点(ephemeral znode)的理念就是基于客户端与Zookeeper Service之间的会话(session),临时znodes具有在客户端和Zookeeper之间活动的会话的生存期。当session结束时,Zookeeper Service
会自动删除这些结点
session有一个超时的阶段,通常由程序或者客户端在连接Zookeeper Service
的时候被指定。客户端在创建连接的时候发送一个timeout
的请求参数(毫秒),如果连接保持空闲状态超过超时时间,那么session就会过期,session过期是由Zookeeper集群本身管理而不是由客户端,当前实现的版本的超时时间最少是ticketTime
时间的两倍。指定合理扒session超时时间依赖各种因素,如网络阻塞,复杂的程序逻辑,甚至是Zookeeper集群的大小。比如,在一个非常拥挤的网络,如果滞后时间为高,如果设置的session超时时间很短则会造成频繁的失效,同样的,如果集群规模很大,推荐设置的session超时时间要大一点。如果程序中看见连接频繁的丢失,增大session失效时间会很有帮助
session可以发送心跳(heartbeats)请求[ping request
]到ZooKeeper Service
以保持存活。心跳由客户端自动的发送,因此,程序员无需关心session的存活、客户端和Zookeeper服务器之间的session由TCP连接来维护,应保持两个后续心跳之间的间隔低,这样, 客户端和管理员服务器之间的连接故障就可以很早地被检测到, 并可以进行重新联接尝试。重新连接到另一个Zookeeper服务器是由客户端以透明的方式完成的。当完成了重新连接到集群中的另一台Zookeeper服务器时,已经存在的session和客户端创建的临时结点(ephemeral znode
)就会保持有效。对于客户端与服务器之间单个session的维护,Zookeeper使用FIFO
确保有序。
当重新连接的尝试正在进行另一台Zookeeper服务器时,程序会接收到断开和连接到服务器的通知。在此故障转移期间,监视通知(watch notifications
)不会发送给客户端因为客户端处于断开的模式,但是,当客户端成功重新连接到服务时, 所有挂起的事件通知都将被调度。在重新连接时间内, 任何客户端操作都不被授予,因此操作会众所失败。在使用Zookeeper开发应用程序时, 处理连接丢失方案非常重要。