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。
    
  • 相关阅读:
    BZOJ 3744 Gty的妹子序列
    BZOJ 3872 Ant colony
    BZOJ 1087 互不侵犯
    BZOJ 1070 修车
    BZOJ 2654 tree
    BZOJ 3243 向量内积
    1003 NOIP 模拟赛Day2 城市建设
    CF865D Buy Low Sell High
    CF444A DZY Loves Physics
    Luogu 4310 绝世好题
  • 原文地址:https://www.cnblogs.com/kuang17/p/10907285.html
Copyright © 2011-2022 走看看