zookeeper go client原理总结

简介: zookeeper go client原理总结

297eef5e631fdf5eeabb50bcf9564bad.jpg

〇、环境


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




一、zk client状态


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




1. 状态含义


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


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. 状态转换


ffb78ad05e35574a3b478e3b1f95e706.png




二、超时时间


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


  • 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
}




三、异常处理


// 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相关的状态,或者主动退出。




相关文章
|
8月前
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
329 24
|
8月前
|
存储 人工智能 安全
深入理解 go sync.Map - 基本原理
本文介绍了 Go 语言中 `map` 在并发使用时的常见问题及其解决方案,重点对比了 `sync.Mutex`、`sync.RWMutex` 和 `sync.Map` 的性能差异及适用场景。文章指出,普通 `map` 不支持并发读写,容易引发错误;而 `sync.Map` 通过原子操作和优化设计,在某些场景下能显著提升性能。同时详细讲解了 `sync.Map` 的基本用法及其适合的应用环境,如读多写少或不同 goroutine 操作不同键的场景。
350 1
|
9月前
|
算法 Java Go
Go内存原理-GC原理
本文介绍了Go语言中垃圾回收(GC)机制的发展与实现原理,涵盖从标记-清除算法到三色标记法,再到三色标记加混合写屏障的演进过程,重点解析各版本GC的核心思想、优缺点及性能优化方向。
255 4
|
10月前
|
安全 Go 开发者
Go语言之切片的原理与用法 - 《Go语言实战指南》
切片(slice)是Go语言中用于处理变长数据集合的核心结构,基于数组的轻量级抽象,具有灵活高效的特点。切片本质是一个三元组:指向底层数组的指针、长度(len)和容量(cap)。本文详细介绍了切片的声明与初始化方式、基本操作(如访问、修改、遍历)、长度与容量的区别、自动扩容机制、共享与副本处理、引用类型特性以及常见陷阱。通过理解切片的底层原理,开发者可以更高效地使用这一数据结构,优化代码性能。
347 13
|
10月前
|
人工智能 Go
[go]Slice 切片原理
本文详细介绍了Go语言中的切片(slice)数据结构,包括其定义、创建方式、扩容机制及常见操作。切片是一种动态数组,依托底层数组实现,具有灵活的扩容和传递特性。文章解析了切片的内部结构(包含指向底层数组的指针、长度和容量),并探讨了通过`make`创建切片、基于数组生成切片以及切片扩容的规则。此外,还分析了`append`函数的工作原理及其可能引发的扩容问题,以及切片拷贝时需要注意的细节。最后,通过典型面试题深入讲解了切片在函数间传递时的行为特点,帮助读者更好地理解和使用Go语言中的切片。
315 0
|
分布式计算 负载均衡 算法
Hadoop-31 ZooKeeper 内部原理 简述Leader选举 ZAB协议 一致性
Hadoop-31 ZooKeeper 内部原理 简述Leader选举 ZAB协议 一致性
203 1
|
分布式计算 监控 Hadoop
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
284 1
|
缓存 Java 编译器
Go 中的内存布局和分配原理
Go 中的内存布局和分配原理
|
Unix Go 开发者
探索Go语言并发模型:原理与实践
本文深入探讨了Go语言的并发模型,包括其设计原理、Goroutine和Channel的基本使用,以及如何在实际项目中高效地应用这些概念来提高程序的性能和可维护性。
|
存储 人工智能 JSON
深入理解 go reflect - 反射基本原理
深入理解 go reflect - 反射基本原理
250 0