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

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. PyQt4解析HTML Dom

    环境: Windows 10 Python 2.7.10 0x01 安装PyQt4 在这个页面下载,注意选对版本. https://riverbankcomputing.com/software/py ...

  2. Python----webserver项目2

    # 编码问题 - 为什么需要编码问题 - 本质上计算机只能识别01代码 - 如何用一长串01代码表示复杂的信息 - encode:编码  decode:解码 - 编码简史 - 二进制 - bit: 一 ...

  3. 汇总apply()、call()、bind()用法详解

    先看明白下面: 例 1 obj.objAge; // 17 obj.myFun() // 小张年龄 undefined 例 2 shows() // 盲僧 比较一下这两者 this 的差别,第一个打印 ...

  4. Shell中的特殊字符(三)

    一 通配符 [root@192 test]# touch abc [root@192 test]# touch abcd [root@192 test]# touch 012 [root@192 te ...

  5. 【Leetcode】二叉树的最小深度

    题目: 给定一个二叉树,找出其最小深度. 注意最小深度的定义! 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 一.递归法 时间复杂度:O(n).需要 ...

  6. mac 绑定阿里企业邮箱

    注意事项: 1. 收件服务器 千万得写对, 选 pop 就写 pop.mxhichina.com; 选 imap 就写 imap.mxhichina.com 2. 发件服务器 必须写,smtp.mxc ...

  7. SSM整合之---简单选课系统

    简单选课系统 一.实体图 二.功能 三.代码实现 1.SSM环境搭建 (1)pom.xml <dependencies> <dependency> <groupId> ...

  8. Vue.use源码分析(转)+如何封装一个组件

    封装一个组件:https://www.jianshu.com/p/89a05706917a 我想有过vue开发经验的,对于vue.use并不陌生.当使用vue-resource或vue-router等 ...

  9. SpringBoot项目的几种创建方式,启动、和访问

    最常用的4种方式,但除了这些以外,还有其他方式: ①在线创建 ②STS构建 ③Intell  Idea内置构建工具 ④Maven创建 STS官网:https://start.spring.io  .S ...

  10. 【每日一包0002】array-first

    github地址:https://github.com/ABCDdouyae... array-first 获取数组的第一项或者前几项 文档地址:https://www.npmjs.com/packa ...