zookeeper go客户端原理总结

〇、环境

zk client: github.com/samuel/go-zookeepernode

1、zk client状态

zookeeper是一款流行的分布式协调组件,被普遍用于leader选举、分布式锁、服务发现、名称服务、配置中心等场景。git

1. 状态含义

zk client与zk server在创建链接、保持链接、断开链接的过程当中,会经历各类状态。以下所示github

const (
    // 暂未使用
    StateUnknown           State = -1
    // 与zk server之间的链接断开(也包含初始状态),此时zk client会不断重连
    StateDisconnected      State = 0
    // 与zk server创建链接以前的暂时状态,表示即将connect zk server
    StateConnecting        State = 1
    // 暂未使用
    StateAuthFailed        State = 4
    // 暂未使用
    StateConnectedReadOnly State = 5
    // 暂未使用
    StateSaslAuthenticated State = 6
    // 在和zk server从新创建TCP链接以后,握手阶段发现session超时
    StateExpired           State = -112
    // 在和zk server成功创建TCP链接以后的状态
    StateConnected  = State(100)
    // 和zk server成功创建TCP链接,而且成功握手(即成功建立session)
    StateHasSession = State(101)
)

2. 状态转换

2、超时时间

超时时间很大程度上影响了上述状态的转换,有三个超时时间值得关注:后端

  • sessionTimeout: session超时。当client与某个zk server链接异常时,会重连链接其余zk server。只要在sessionTimeout以内成功创建TCP链接并握手成功,临时节点、watcher都会做为已有session的资源获得保留。特别要注意的是,sessionTimeout并不是彻底由client端设置,它由client和server端协商肯定:它必须介于server端配置的sessionTimeout上限和下限之间。
  • pingInterval: 是zk client和server保持心跳的时间间隔,默认1/3 * sessionTimeout
  • recvTimeout:默认2/3 * sessionTimeout。client端发送请求和接收响应(包含心跳)的超时时间。另外client握手阶段的读写超时为10 * recvTimeout。
  • connectTimeout: client端与zk server创建TCP链接的超时
func (c *Conn) setTimeouts(sessionTimeoutMs int32) {
    c.sessionTimeoutMs = sessionTimeoutMs
    sessionTimeout := time.Duration(sessionTimeoutMs) * time.Millisecond
    c.recvTimeout = sessionTimeout * 2 / 3
    c.pingInterval = c.recvTimeout / 2
}

3、异常处理

// Connect establishes a new connection to a pool of zookeeper
// servers. The provided session timeout sets the amount of time for which
// a session is considered valid after losing connection to a server. Within
// the session timeout it's possible to reestablish a connection to a different
// server and keep the same session. This is means any ephemeral nodes and
// watches are maintained

若是client和server端链接发生异常,可分为三种状况:微信

  • 一直没法成功创建链接。此时zk client在connect()中死循环,此时zk服务处于不可用状态。用户可根据业务的具体状况,让应用或退出,或降级,或死循环直到zk服务恢复。
  • sessionTimeout内成功创建链接。临时节点和watcher得以保留,不作任何处理
  • sessionTimeout内没有成功创建链接,可是后来成功了。此时应用应当重置内部与zk相关的状态,或者主动退出。

推荐阅读session

更多精彩内容,请扫码关注微信公众号:后端技术小屋。若是以为文章对你有帮助的话,请多多分享、转发、在看。
二维码分布式

相关文章
相关标签/搜索