zoukankan      html  css  js  c++  java
  • zookeeper设置客户端连接超时被expired

    在网络环境非常差的情况下,使用zookeeper集群往往会遇到连接expired了:

    客户端提示连接从ZOO_CONNECTION_STATE变为ZOO_EXPIRED_SEESION_STATE,然后应用失去与zookeeper集群的连接。

    在使用过程中,我们一般会加大客户端的rec_timeout值,例如设置为30s,但对是否发生expired没有太大影响,仔细查看文档发现要在服务器端设置minSessionTimeout。

    那么什么情况下连接会过期?

    当客户端创建连接时,会随机和一个zookeeper节点创建连接,并互发heartbeat;session的信息会同步到其他zookeeper节点上,比如session的id、watcher、临时目录等等信息。

    当网络抖动或者与他创建连接的zk节点掉线了,这个时候client与zk的的session将断开,此时,client无需处理,zk的重试机制会自动跟其他存活的zk节点创建session:

    1)如果连接在minSessionTimeout之内连接成功,那么新的连接将同步之前断开连接的临时数据和watcher,并同步状态。

    2)如果这个重连接过程超过了minSessionTimeout,那么该session就会被zk集群提出去即expired掉,会清除该session所有资源和数据,主要包括临时数据和watcher。当使用zookeeper_init指定session的id去重新连接,也会报错,返回一个空的句柄回来。

    下面我们来仔细看看:

    1)一般我们会设置连接超时时间,在客户端设置,其API为:

    ZOOAPI zhandle_t *zookeeper_init(const char *host, 
    				 watcher_fn fn,
                                     int recv_timeout,
                                     const clientid_t * clientid,
                                     void *context, int flags);
    功能: 创建一个句柄(handle)和一个响应(response)这个句柄的会话(session)。 
    
    参数:
    host:zookeeper主机列表,用逗号间隔。 
    fn:用于监视的回调函数。 
    clientid:客户端尝试重连的先前会话的ID,如果不需要重连先前的会话,则设置为 0。客户端可以通过调用 zoo_client_id来访问一个已经连接上的并且有效的会话ID,如果clientid对应的会话超时,或者由于某种原因 clientid变为无效了,那么zookeeper_init 将返回一个非法的 zhandle_t,通过 zhandle_t 的状态可以获知 zookeeper_init 调用失败的原因。 (通常为 ZOO_EXPIRED_SESSION_STATE). 意思是如果该ID的连接是被expired了的话,重新连接也会失败,服务器已经清理了相关的资源和信息。
    context:暂时用不到,忽略。(TODO)
    flags:设置为0,zookeeper开发团队保留以后使用。
    

    大量,包括代码里面的注释上都没有说recv_timeout的意思,按字面意思,肯定不是session_timeout,而是多长时间zk创建连接不成功的时间?


    2)在服务器端zoo.conf中有相关设置:minSessionTimeout,最小的客户端超时时间,默认值为2个ticktime,单位是毫秒:

    minSessionTimeout
      最小的客户端session超时时间,默认值为2个tickTime,单位是毫秒
    maxSessionTimeout
      最大的客户端session超时时间,默认值为20个tickTime,单位是毫秒
    

    3)于是我们最终修改的zoo.conf文件为:

    tickTime=1000
    dataDir=/opt/zookeeper/zkdata
    dataLogDir=/opt/zookeeper/zklogs
    clientPort=2181
    initLimit=5
    syncLimit=2
    minSessionTimeout=16000
    maxSessionTimeout=30000
    server.1=xxxx:2888:3888
    server.2=xxxx:2888:3888
    server.3=xxxx:2888:3888
    

    注意,在仅配置了minSessionTimeout参数时,zk会启动失败,提示该参数超过了maxSessionTimeout值,这个时候需要在配置文件把最大值也配上。

    4)服务端配置详解:

    (1)dataDir
      用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里。
    (2)dataLogDir
      用于单独设置transaction log的目录,transaction log分离可以避免和普通log还有快照的竞争。
    (3)tickTime
      心跳时间,为了确保client-server连接存在的,以毫秒为单位,最小超时时间为两个心跳时间。
    (4)clientPort
      客户端监听端口。
    (5)globalOutstandingLimit
      client请求队列的最大长度,防止内存溢出,默认值为1000。
    (6)preAllocSize
      预分配的Transaction log空间block为proAllocSize KB,默认block为64M,一般不需要更改,除非snapshot过于频繁。
    (7)snapCount
      在snapCount个snapshot后写一次transaction log,默认值是100,000。
    (8)traceFile
      用于记录请求的log,打开会影响性能,用于debug,最好不要定义。
    (9)maxClientCnxns
      最大并发客户端数,用于防止DOS的,默认值是10,设置为0是不加限制。
    (11)clientPortBindAddress
      可以设置指定的client ip以及端口,不设置的话等于ANY:clientPort
    (12)minSessionTimeout
      最小的客户端session超时时间,默认值为2个tickTime,单位是毫秒
    (13)maxSessionTimeout
      最大的客户端session超时时间,默认值为20个tickTime,单位是毫秒
    (14)electionAlg
      用于选举的实现的参数:
      ①0:为以原始的基于UDP的方式协作
      ②1:为不进行用户验证的基于UDP的快速选举
      ③2:为进行用户验证的基于UDP的快速选举
      ④3:为基于TCP的快速选举,默认值为3
    (15)initLimit
      多少个tickTime内,允许其他server连接并初始化数据,如果zooKeeper管理的数据较大,则应相应增大这个值。
    (16)syncLimit
      多少个tickTime内,允许follower同步,如果follower落后太多,则会被丢弃。
    (17)leaderServes
      leader是否接受客户端连接。默认值为yes。leader负责协调更新。当更新吞吐量远高于读取吞吐量时,可以设置为不接受客户端连接,以便leader可以专注于同步协调工作。
    (18)server.x=[hostname]:nnnnn[:nnnnn]
      配置集群里面的主机信息,其中:
  ①server.x:server.x的x要写在myid文件中,决定当前机器的id,
  ②第一个port用于连接leader,
  ③第二个用于leader选举。
  ④如果electionAlg为0,则不需要第二个port。
  ⑤hostname也可以填ip。
(19)group.x=nnnnn[:nnnnn]
        分组信息,表明哪个组有哪些节点,例如group.1=1:2:3 group.2=4:5:6 group.3=7:8:9。
(20)weight.x=nnnnn
   权重信息,表明哪个结点的权重是多少,例如weight.1=1 weight.2=1 weight.3=1。
    
  • 相关阅读:

    HttpClient发送get/post请求
    maven创建ssm项目依赖(pom.xml文件)
    java的Scanner类总结
    java多线程总结
    java跨域问题
    Idea打包项目war并且发布到服务器
    Mybatis入门案例之增删改查
    springMVC中的@RequestBody和@ResponseBody以及@RequestParam
    Gson解析json
  • 原文地址:https://www.cnblogs.com/kuang17/p/10907285.html
Copyright © 2011-2022 走看看