分享

请教一个zookeeper连接太频繁会爆错误的问题

credit 发表于 2016-10-26 09:46:03 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 18479
请教一个问题,现在的项目需要频繁连接zookpeeper,但是zookeeper连接太频繁会爆一个错误,请大神帮忙看下怎么处理好,2016-10-20 12:25:39 ERROR [org.apache.solr.common.cloud.ZkStateReader]
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /aliases.json
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
        at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1041)
        at org.apache.solr.common.cloud.SolrZkClient$3.execute(SolrZkClient.java:195)
        at org.apache.solr.common.cloud.SolrZkClient$3.execute(SolrZkClient.java:192)
        at org.apache.solr.common.cloud.ZkCmdExecutor.retryOperation(ZkCmdExecutor.java:66)
        at org.apache.solr.common.cloud.SolrZkClient.exists(SolrZkClient.java:192)
        at org.apache.solr.common.cloud.ZkStateReader.createClusterStateWatchersAndUpdate(ZkStateReader.java:360)

已有(6)人评论

跳转到指定楼层
arsenduan 发表于 2016-10-26 10:15:15
出现这个原因,可能是还未创建完链接,就发出了zookeeper操作请求导致的。

详细可参考


Zookeeper异常Exception in thread "main" org.apache.zookeeper.KeeperExcep
回复

使用道具 举报

credit 发表于 2016-10-26 11:37:05
arsenduan 发表于 2016-10-26 10:15
出现这个原因,可能是还未创建完链接,就发出了zookeeper操作请求导致的。

详细可参考

防火墙就没有配置,没有开启,所以不是防火墙的问题,现在的问题是查询少量的数据是没有问题的,如果查询上万条,起初的查询时没有问题的,中间的查询会报错,一个完整的查询可能需要查询solr几百次
报错如下:
2016-10-26 10:50:54 ERROR [org.apache.solr.common.cloud.ZkStateReader]
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /clusterstate.json
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
    at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1041)
    at org.apache.solr.common.cloud.SolrZkClient$4.execute(SolrZkClient.java:212)
    at org.apache.solr.common.cloud.SolrZkClient$4.execute(SolrZkClient.java:209)
    at org.apache.solr.common.cloud.ZkCmdExecutor.retryOperation(ZkCmdExecutor.java:66)
    at org.apache.solr.common.cloud.SolrZkClient.exists(SolrZkClient.java:209)
    at org.apache.solr.common.cloud.ZkCmdExecutor.ensureExists(ZkCmdExecutor.java:95)
    at org.apache.solr.common.cloud.ZkCmdExecutor.ensureExists(ZkCmdExecutor.java:89)
    at org.apache.solr.common.cloud.ZkStateReader.createClusterStateWatchersAndUpdate(ZkStateReader.java:254)
    at org.apache.solr.common.cloud.ZkStateReader$1.command(ZkStateReader.java:213)
    at org.apache.solr.common.cloud.ConnectionManager$1$1.run(ConnectionManager.java:155)
2016-10-26 10:50:54 WARN [org.apache.solr.common.cloud.ConnectionManager] Exception running onReconnect command
org.apache.solr.common.cloud.ZooKeeperException:
    at org.apache.solr.common.cloud.ZkStateReader$1.command(ZkStateReader.java:216)
    at org.apache.solr.common.cloud.ConnectionManager$1$1.run(ConnectionManager.java:155)
Caused by: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /clusterstate.json
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
    at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1041)
    at org.apache.solr.common.cloud.SolrZkClient$4.execute(SolrZkClient.java:212)

回复

使用道具 举报

arsenduan 发表于 2016-10-26 14:01:19
本帖最后由 arsenduan 于 2016-10-26 15:01 编辑
credit 发表于 2016-10-26 11:37
防火墙就没有配置,没有开启,所以不是防火墙的问题,现在的问题是查询少量的数据是没有问题的,如果查询 ...


楼主仔细阅读下下面内容:
[mw_shl_code=java,true]private CountDownLatch connectedSemaphore = new CountDownLatch( 1 );   
   
    /**  
     * 创建ZK连接  
     * @param connectString  ZK服务器地址列表  
     * @param sessionTimeout   Session超时时间  
     */   
    public void createConnection( String connectString, int sessionTimeout )   
    {           
       System.out.println( "开始创建连接" );   
        try {   
            zk = new ZooKeeper( connectString, sessionTimeout, this );   
            connectedSemaphore.await();  
        } catch (Exception e ) {   
            System.out.println( "连接创建失败,发生 IOException" );   
            e.printStackTrace();   
        }   
    }   

* 收到来自Server的Watcher通知后的处理。   
     */   
    @Override   
    public void process( WatchedEvent event ) {   
        System.out.println( "收到事件通知:" + event.getState() +"\n"  );   
        if ( KeeperState.SyncConnected == event.getState() ) {   
            connectedSemaphore.countDown();   
        }   
   
    }   [/mw_shl_code]

上面的代码对于避免连接建立完成之前就发出ZooKeeper操作命令出现ConnectionLoss是有用的。
因为new出ZooKeeper实例时只是建立了与服务端之间的会话,此时TCP连接可能还未建立完成,如果这时发出ZooKeeper操作命令的确会出现连接丢失异常,虽然这种概率相对较小。
当客户端与服务端连接建立之后客户端会收到一个SyncConnected事件,此时将connectedSemaphore减到零就可以让阻塞的主线程继续运行,再来发出ZooKeeper操作命令就不会出现连接丢失的异常了。

回复

使用道具 举报

credit 发表于 2016-10-26 14:08:52
arsenduan 发表于 2016-10-26 14:01
楼主仔细阅读下下面内容:
[mw_shl_code=java,true]private CountDownLatch connectedSemaphore = new ...

好,测试一下,谢谢

回复

使用道具 举报

credit 发表于 2016-10-26 14:59:26
arsenduan 发表于 2016-10-26 14:01
楼主仔细阅读下下面内容:
[mw_shl_code=java,true]private CountDownLatch connectedSemaphore = new ...

这一段代码加载哪里呢,应用是通过solr连接的zk:cloudSolrServer = new CloudSolrServer(zkHost);

回复

使用道具 举报

credit 发表于 2016-10-28 16:15:12
arsenduan 发表于 2016-10-26 10:15
出现这个原因,可能是还未创建完链接,就发出了zookeeper操作请求导致的。

详细可参考

These message means that the client closed the connection (from the point of view of the server). The server then tries to cleanup by closing the socket explicitly.
Notice that the session id is 0 - so this is a Zookeeper client that failed before establishing a session.

这是clouder官方的回复,您怎么看

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条