在网络环境非常差的情况下,使用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为:

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

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


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

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

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

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

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

4)服务端配置详解:

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

zookeeper设置客户端连接超时被expired的更多相关文章

  1. 设置客户端连接PostgreSQL不需要密码

    平常工作中,有时需要远端连接 PostgreSQL 数据库做些维护,例如远端备份等:如果备份脚本写在远端机器,备份的时候会弹出密码输入提示,那么脚本就不能后台执行,这里总结了几种不弹出密码输入提示的方 ...

  2. 解决fastDFS客户端连接超时问题

    1.修改storage.conf配置tracker_server的ip为外网ip 2.开放23000端口

  3. Zookeeper命令行操作(常用命令;客户端连接;查看znode路径;创建节点;获取znode数据,查看节点内容,设置节点内容,删除节点;监听znode事件;telnet连接zookeeper)

    8.1.常用命令 启动ZK服务 bin/zkServer.sh start 查看ZK服务状态 bin/zkServer.sh status 停止ZK服务 bin/zkServer.sh stop 重启 ...

  4. Zookeeper学习记录及Java客户端连接示例

    1. Zookeeper 1.1 简介 ZooKeeper is a centralized service for maintaining configuration information, na ...

  5. 【Azure Redis 缓存】Azure Redis出现了超时问题后,记录一步一步的排查出异常的客户端连接和所执行命令的步骤

    问题描述 Azure Redis在使用的过程中,多次无规律的出现超时问题.抓取到客户端的异常错误后,想进一步的分析是何原因导致了如下异常呢? Timeout awaiting response (ou ...

  6. PostgreSQL数据库服务端监听设置及客户端连接方法教程

    众所周知,PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),是一个可以免费使用的开放源代码数据库系统.本文详细介绍了PostgreSQL数据库服务端监听设置及客户端连接方法, ...

  7. Toad客户端连接Oracle数据库报错 ORA-12170:TNS:连接超时

    Oracle 客户端连接Oracle数据库报错   ORA-12170:TNS:连接超时  排错步骤: 1. 查看网络是否畅通:  打开cmd,ping数据库IP 2. 查看端口是否畅通: 打开cmd ...

  8. 设置MySQL客户端连接使用的字符集

    设置MySQL客户端连接使用的字符集 时间:2014-03-05    来源:服务器之家    投稿:root 考虑什么是一个"连接":它是连接服务器时所作的事情.客户端发送SQL ...

  9. 由浅入深了解Thrift之客户端连接池化续

    前文<由浅入深了解Thrift之客户端连接池化>中我们已经实现了服务调用端 连接的池化,实现的过于简陋,离实际的项目运用还很遥远.本文将在进一步改造,主要是两方面:1.服务端如何注册多个服 ...

随机推荐

  1. python类库26[sqlite]

    一 sqlite 与 python 的类型对应 二 实例 import sqlite3 def sqlite_basic():     # Connect to db     conn = sqlit ...

  2. python urljoin

    使用urllib的urljoin()拼接两个地址 urlljoin的第一个参数是基础母站的url,第二个是需要拼接成绝对路径的url. from urllib import parse url1 = ...

  3. 购物网站被p.egou.com强制恶意劫持

    今天早上打开电脑浏览京东,发现随便点击商品,都自动转化为淘客推广的页面, 我以为是360浏览器自己干的,然后我换了谷歌,也是一样,难道这是电脑里面有流氓插件? 我又换了火狐,还是一样,没办法了,换IE ...

  4. 在Tomcat中部署Java Web应用程序几种方式

    在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署.在下文中$CATALINA_HOME指的是Tomcat根目录. 一.静态部署      静态部署指的是我们在服务器启动之前部 ...

  5. jquery contains选择器 语法

    jquery contains选择器 语法 作用::contains 选择器选取包含指定字符串的元素.该字符串可以是直接包含在元素中的文本,或者被包含于子元素中.经常与其他元素/选择器一起使用,来选择 ...

  6. UML——概述

    1. 静态视图(类图)      静态视图不描述与时间相关的系统行为,这种行为在其他视图中描述,因此称之为静态试图.      静态视图用类图来实现,正因为它以类图为中心,因此也称之为类图.     ...

  7. noi 求分数序列和 x

    求分数序列和 总时间限制:  1000ms 内存限制:  65536kB 描述 有一个分数序列 q1/p1,q2/p2,q3/p3,q4/p4,q5/p5,.... ,其中qi+1= qi+ pi, ...

  8. cpp 面向对象初步探索

    需求 尝试定义一个complex(复数类) 简略实现 headers/complex.h #ifndef __COMPLEX__ #define __COMPLEX__ class complex { ...

  9. 字符串处理工具StringUtils

    package yqw.java.util; import java.io.File;import java.text.ParseException;import java.text.SimpleDa ...

  10. Rust:剑指C++

    Rust:极富活力和前途的编程语言,剑指C++ 今天开始学习Rust,马上要回去休息了,只贴上一段实例代码,在后续的学习中,会对这种语言进行一个详尽的介绍(学习中....). extern crate ...