Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ZooKeeper会话到期后自动重连

ZooKeeper会话到期后自动重连

作者头像
十毛
发布于 2019-03-27 07:11:12
发布于 2019-03-27 07:11:12
5.8K00
代码可运行
举报
运行总次数:0
代码可运行

因为网络问题ZK客户端会与服务器断开连接,如果断开时间超过sessionTimeout后,会话会被服务器清空,即使之后连接恢复,也没办法恢复会话了。这样就会导致客户端一直不能与ZK服务器通信。 本文通过监听事件,并重新建立ZK客户端的方式恢复与ZK服务器的连接。

遇到的问题

项目中有的服务器会断开与ZooKeeper服务器的连接(临时节点消失),客户端一般会出现如下日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
21:16:31  [ main-SendThread(192.168.58.100:2181):4000645 ] - [ WARN ]  Client session timed out, have not heard from server in 15526ms for sessionid 0x16797e426b8000e
21:16:31  [ main-SendThread(192.168.58.100:2181):4000645 ] - [ INFO ]  Client session timed out, have not heard from server in 15526ms for sessionid 0x16797e426b8000e, closing socket connection and attempting reconnect
21:16:31  [ main-SendThread(192.168.58.100:2181):4000905 ] - [ INFO ]  Socket connection established to 192.168.58.100/192.168.58.100:2181, initiating session
21:16:31  [ main-SendThread(192.168.58.100:2181):4000906 ] - [ WARN ]  Unable to reconnect to ZooKeeper service, session 0x16797e426b8000e has expired
21:16:31  [ main-SendThread(192.168.58.100:2181):4000906 ] - [ INFO ]  Unable to reconnect to ZooKeeper service, session 0x16797e426b8000e has expired, closing socket connection
21:16:31  [ main-EventThread:4000906 ] - [ INFO ]  EventThread shut down for session: 0x16797e426b8000e
  • 原因分析

ZK客户端因为网络抖动等原因与服务器断开连接,如果在sessionTimeout时间内重新连接上,则会话继续,状态为CONNECTED。但是如果时间超过sessinTimeout,服务器则会进行会话的清理工作,如果此时ZK客户端才恢复连接,则会收到State为Expired的 WatchedEvent,并断开与服务器的连接。

解决办法

当监听器Watcher收到Expired事件后,重新建立ZooKeeper客户端。如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public void process(WatchedEvent watchedEvent) {
    if (watchedEvent.getState() == Event.KeeperState.Expired) {
        try {
            zooKeeper = new ZooKeeper("192.168.58.100:2181", 3000, this);
        } catch (IOException e) {
            log.warn("fail to connect to zoo keeper", e);
        }
    }
}

完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;

@Slf4j
public class App implements Watcher
{
    private static ZooKeeper zooKeeper = null;

    public static void main( String[] args ) throws IOException, InterruptedException {
        final App app = new App();
        zooKeeper = new ZooKeeper("192.168.58.100:2181", 3000, app);
        for (int i = 0; i < 15000; i++) {
            Thread.sleep(1000);
        }
    }

    @Override
    public void process(WatchedEvent watchedEvent) {
        if (watchedEvent.getState() == Event.KeeperState.Expired) {
            try {
                zooKeeper = new ZooKeeper("192.168.58.100:2181", 3000, this);
            } catch (IOException e) {
                log.warn("fail to connect to zoo keeper", e);
            }
        }
    }
}

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.12.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Zookeeper03之客户端命令操作
  前面两篇文章给大家介绍了zookeeper的集群搭建,本篇文章来介绍下zookeeper的客户端命令操作
用户4919348
2019/04/02
9920
Zookeeper03之客户端命令操作
zookeeper使用详解(命令、客户端、源码)
  zookeeper我们常用来做分布式协调中间件,很多时候我们都接触不到它的原理和用法,我对他的了解也仅限于知道它可以做分布式协调、配置管理、分布式锁,并且有个watch节点监听常常能听到。接下来我要系统的学下zookeeper的功能和原理,一起走进zookeeper的世界
老梁
2019/09/10
2.4K0
zookeeper使用详解(命令、客户端、源码)
zookeeper源码分析(8)-会话管理
zookeeper客户端和服务端维持一个TCP长连接,它们之间任何正常的通信都需要一个正常的会话。本文主要分析会话生命周期中会话状态的变化过程和客户端服务端如何管理会话。
Monica2333
2020/06/22
1.4K0
ZooKeeper 基础9
redo 再次执行之前命令 Tip: 历史命令的保持是在当前会话中,不论此时是否已经成功连接服务 [zk: localhost:2181(CONNECTED) 20] history 10 - ls 11 - ls / 12 - create /test test 13 - get /test 14 - ls / 15 - close 16 - ls / 17 - connect localhost:2181 18 - ls / 19 - help 20 - history [zk: localhos
franket
2022/03/25
2360
docker镜像部署zookeeper
由截图可知,服务器使用的镜像版本低于zookeepe客户端使用的版本,版本不兼容,导致客户端无法正确连接。
3号攻城狮
2018/06/27
1.9K1
docker镜像部署zookeeper
快速开始Zookeeper 转
Zookeeper是一个高性能的分布式应用协调服务的框架。Zookeeper=Zoo+keeper,中文直译是动物园的看守者。
wuweixiang
2018/08/14
3150
解Bug之路-dubbo应用无法重连zookeeper
dubbo是一个成熟且被广泛运用的框架。饶是如此,在某些极端条件下基于dubbo的应用还会出现无法重连zookeeper的问题。由于此问题容易导致比较大的故障,所以笔者费了一番功夫去定位,现将排查过程写成博文分享出来。
无毁的湖光-Al
2020/04/09
2K0
解Bug之路-dubbo应用无法重连zookeeper
ZooKeeper学习第三期---Zookeeper命令操作
Zookeeper支持某些特定的四字命令字母与其的交互。他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息。用户在客户端可以通过telnet或nc向Zookeeper提交相应的命令。Zookeeper常用的四字命令见下图所示。
用户5640963
2019/07/26
1K0
ZooKeeper学习第三期---Zookeeper命令操作
使用ZooKeeper提供的原生Java API操作ZooKeeper节点
我们先来创建一个普通的maven工程,然后在pom.xml文件中配置zookeeper依赖:
端碗吹水
2020/09/23
1.4K0
zookeeper源码分析(2)-客户端启动流程
客户端的入口,负责启动整个客户端。持有ClientCnxn和ZKWatchManager的实例,提供了客户端对节点操作的方法。
Monica2333
2020/06/22
9280
ZooKeeper 集群7
服务状态 [root@h101 zk]# zookeeper-3.4.6-real/bin/zkServer.sh status JMX enabled by default Using config: /root/zk/zookeeper-3.4.6-real/bin/../conf/zoo.cfg Mode: follower [root@h101 zk]# ---------- [root@h102 zookeeper-3.4.6-real]# zookeeper-3.4.6-real/bin/zk
franket
2022/03/25
2560
zk session expire会引起HA模式的rm一直处于standby吗
最近连续在多个环境中遇到了同一个问题:在HA模式下,两个resourcemanager均为standby,并且持续没有选举出新的leader。经过一番分析,并对照源码梳理问题出现前后的逻辑流程,最后发现是因为zk会话过期(session expire)引起的问题,本文就复盘总结下。
陈猿解码
2023/02/28
6060
zk session expire会引起HA模式的rm一直处于standby吗
ZooKeeper 基础8
close 主动断开当前连接 [zk: localhost:2181(CONNECTED) 14] ls / [test, zookeeper] [zk: localhost:2181(CONNECTED) 15] close 2015-12-03 15:50:51,211 [myid:] - INFO [main:ZooKeeper@684] - Session: 0x151665fb7430003 closed [zk: localhost:2181(CLOSED) 16] 2015-12-03 1
franket
2022/03/25
1980
Zookeeper客户端API之创建会话(六)
该文章介绍了如何通过Java客户端连接Zookeeper服务,并创建会话。其中包括了连接Zookeeper服务器的示例代码,以及创建会话的代码。同时,还介绍了如何通过编写代码实现Zookeeper客户端的监听功能。
程序新视界
2018/01/08
1.1K0
kafka问题的一次不负责任排查
元旦前,某测试环境因为网络不稳定,出现了kafka与zookeeper连接断开后,没有重连。
陈猿解码
2023/02/28
6280
kafka问题的一次不负责任排查
【ZooKeeper系列】2.用Java实现ZooKeeper API的调用
在前一篇我们介绍了ZooKeeper单机版、伪集群和集群环境搭建,通过命令行的方式做了节点的创建、删除、更新、获取节点信息的测试。Zookeeper 的目的是为客户端构建复杂的协调功能提供简单、高效的核心 API,这一篇我们用Java通过ZooKeeper提供的API接口来实现这些增删改查的功能。
猿人谷
2020/06/19
1.9K0
ZooKeeper 集群2
查看状态 [root@h101 zk]# zookeeper-3.4.6.2/bin/zkServer.sh status JMX enabled by default Using config: /root/zk/zookeeper-3.4.6.2/bin/../conf/zoo.cfg Mode: follower [root@h101 zk]# zookeeper-3.4.6.1/bin/zkServer.sh status JMX enabled by default Using config:
franket
2022/03/25
2480
Centos6下zookeeper集群部署记录
ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。 Zookeeper设计目的 最终一致性:client不论
洗尽了浮华
2018/01/23
7370
Centos6下zookeeper集群部署记录
Java实现ZooKeeper的zNode监控
上一篇文章已经完成了ZooKeeper的基本搭建和使用的介绍,现在开始用代码说话。参考 https://zookeeper.apache.org/doc/current/javaExample.html ,但对场景和代码都做了简化,只实现基本的Watcher功能。
程序猿讲故事
2019/09/26
8790
Zookeeper-watcher机制源码分析(一)Watcher的基本流程
ZooKeeper 的 Watcher 机制,总的来说可以分为三个过程:客户端注册 Watcher、服务器处理 Watcher 和客户端回调 Watcher
Java架构
2018/08/01
7210
相关推荐
Zookeeper03之客户端命令操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验