Zookeeper Go Client 原理总结 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codeboy18
V2EX    ZooKeeper

Zookeeper Go Client 原理总结

  •  
  •   codeboy18 2021-02-24 19:55:12 +08:00 1840 次点击
    这是一个创建于 1742 天前的主题,其中的信息可能已经有所发展或是发生改变。

    更多精彩内容,请关注微信公众号:后端技术小屋

    、环境

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

    <1>一、zk client 状态

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

    1. 状态含义

    zk client 与 zk server 在建立连接、保持连接、断开连接的过程中,会经历各种状态。如下所示

    const( // 暂未使用 StateUnknownState=-1 // 与 zk server 之间的连接断开(也包含初始状态),此时 zk client 会不断重连 StateDiscOnnectedState=0 // 与 zk server 建立连接之前的暂时状态,表示即将 connect zk server StateCOnnectingState=1 // 暂未使用 StateAuthFailedState=4 // 暂未使用 StateCOnnectedReadOnlyState=5 // 暂未使用 StateSaslAuthenticatedState=6 // 在和 zk server 重新建立 TCP 连接之后,握手阶段发现 session 超时 StateExpiredState=-112 // 在和 zk server 成功建立 TCP 连接之后的状态 StateCOnnected=State(100) // 和 zk server 成功建立 TCP 连接,并且成功握手(即成功创建 session) StateHasSession=State(101) ) 

    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(sessionTimeoutMsint32){ c.sessiOnTimeoutMs=sessionTimeoutMs sessionTimeout:=time.Duration(sessionTimeoutMs)*time.Millisecond c.recvTimeout=sessionTimeout*2/3 c.pingInterval=c.recvTimeout/2 } 

    三、异常处理

    //Connectestablishesanewconnectiontoapoolofzookeeper //servers.Theprovidedsessiontimeoutsetstheamountoftimeforwhich //asessionisconsideredvalidafterlosingconnectiontoaserver.Within //thesessiontimeoutit'spossibletoreestablishaconnectiontoadifferent //serverandkeepthesamesession.Thisismeansanyephemeralnodesand //watchesaremaintained 

    如果 client 和 server 端连接发生异常,可分为三种情况:

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

    推荐阅读

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

    1 条回复    2021-02-24 19:57:09 +08:00
    AngryPanda
        1
    AngryPanda  
       2021-02-24 19:57:09 +08:00   1
    不错,终于看到了二维码
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5061 人在线   最高记录 6679       Select Language
    创意工作者们社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 09:17 PVG 17:17 LAX 01:17 JFK 04:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86