学习
实践
活动
专区
工具
TVP
写文章
专栏首页用户1337634的专栏ZooKeeper会话到期后自动重连

ZooKeeper会话到期后自动重连

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

遇到的问题

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

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客户端。如下:

@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);
        }
    }
}

完整代码如下:

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);
            }
        }
    }
}

参考

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://www.jianshu.com/u/518bde83a9bc复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • EasyNVR现场设备离线后无法自动重连如何优化?

    EasyNVR是我司比较热门的软件之一,很多用于室内固定IP摄像头监控的场景都能够适用。有的开发者在使用之前可能会担心系统是否稳定?掉线是否频繁?是否支持设备重...

    TSINGSEE青犀视频
  • python怎样实现redis断开后自动重连的机制

    近来在做的一个项目,利用redis实现消息队列,在发布端用lpush,将数据写入到队列中,在订阅端用rpop方法依次读出每条数据并处理,需要在windows服务...

    风柏杨4711
  • 解决android设备断电重启后WIFI不能自动重连的BUG(收藏)

    如题,线上的设备大概率会出现WIFI不能重连的现象,而非断电模式重启(reboot)则不会出现这样的情况。

    砸漏
  • H265播放器EasyPlayer测试demo停顿后实现自动重连的优化分享

    EasyPlayer播放器项目是TSINGSEE青犀视频研发团队研发的H265编码视频播放器,经过多年的技术积累与实践打造,EasyPlayer播放器项目系列无...

    TSINGSEE青犀视频
  • zookeeper源码分析(9)-Curator相关介绍

    zookeeper常用的Java客户端有三种:zookeeper原生的、Apache Curator、开源的zkclient。Curator官网上这么说

    Monica2333
  • Zookeeper入门

    爱撒谎的男孩
  • 徒手教你使用zookeeper编写服务发现

    zookeeper的内部是一个key/value存储引擎,key是以树状的形式构成了一个多级的层次结构,每一个节点既可以存储数据,又可以作为一个目录存放下一级子...

    老钱
  • Zookeeper的客户端使用

    3)Zookeeper本身没提供序列化机制,需要开发人员自行指定,从而实现数据的序列化和反序列化

    HUC思梦
  • 你还在使用复杂的 zkclient 开发 zookeeper 么?是时候用 Curator 了 !

    Curator是netflix公司开源的一套zookeeper客户端,目前是Apache的顶级项目。与Zookeeper提供的原生客户端相比,Curator的抽...

    架构师修炼
  • zookeeper curator处理会话过期session expired

    本文介绍在使用curator框架的时候如何handle session expire。 1、什么是zookeeper的会话过期?  一般来说,我们使用zooke...

    用户1225216
  • Zookeeper - 介绍篇(3)

    ZK会话有四种状态:NOT_CONNECTED, CONNECTING, CONNECTED, CLOSED, 会话状态转换图为

    干货满满张哈希
  • Apache ZooKeeper - 使用Apache Curator操作ZK

    Curator是netflix公司开源的一套zookeeper客户端,Apache的顶级项目

    小小工匠
  • Zookeeper 分布式锁原理、源码及获取失败问题

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    chenchenchen
  • 使用ZooKeeper提供的原生Java API操作ZooKeeper节点

    我们先来创建一个普通的maven工程,然后在pom.xml文件中配置zookeeper依赖:

    端碗吹水
  • Zookeeper开源客户端ZKClient和Curator简介

    Zookeeper客户端提供了基本的操作,比如,创建会话、创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。但对于开发人员来说,Zookeeper提供...

    程序新视界
  • Curator使用手册

    这里就体现了用Cutaotr的好处了,不需要先创建父才创建子,可以设置检测需要父时候却没有的请看下自动创建

    名字是乱打的
  • 『互联网架构』软件架构-zookeeper场景讲解(分布式锁)和zkclient使用(35)

    源码:https://github.com/limingios/netFuture/源码/『互联网架构』软件架构-zookeeper场景讲解(分布式锁)和zkc...

    IT架构圈
  • zookeeper源码分析(8)-会话管理

    zookeeper客户端和服务端维持一个TCP长连接,它们之间任何正常的通信都需要一个正常的会话。本文主要分析会话生命周期中会话状态的变化过程和客户端服务端如何...

    Monica2333
  • Q2# ZK SYN Flood与参数优化

    Zookeeper集群部分节点连接数量瞬时跌零,导致不少服务发生重连,对业务造成了影响(惊吓),本文就发生的现象进行分析和整理。

    瓜农老梁

扫码关注腾讯云开发者

领取腾讯云代金券