开发者社区> 问答> 正文

java客户端连接zookeeper集群时如何才能避开失效的服务器

集群模式下,比如我有3个zookeeper服务器,分别是zk1,zk2,zk3 ,zookeeper兑现创建时连接串写法是zk1:2181,zk2:2181,zk3:2181 ,按照zk的选举算法,只要有超过半数的节点活着集群就能工作。但是如果这时客户端刚开始初始化,但是zk1挂了,会使用zk1的服务器配置去创建连接,从而报连接被拒绝的异常以致启动退出。这里有什么优雅的方法能在启动阶段让zookeeper自动避开已经失效的节点去选择有效的节点去连接么?

展开
收起
蛮大人123 2016-02-28 16:07:21 4306 0
2 条回答
写回答
取消 提交回答
  • 如果在你的Java客户端代码里面,API中使用诸如 zk1:2181,zk2:2181,zk3:2181 这样的连接串时,ZooKeeper会逐个进行自动重试,直到找到一个可以使用的服务器地址。

    因此,你说的

    但是如果这时客户端刚开始初始化,但是zk1挂了,会使用zk1的服务器配置去创建连接,从而报连接被拒绝的异常以致启动退出。

    应该不会存在呢

    2019-07-17 18:49:43
    赞同 1 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    由于zk的连接是异步创建的,可以在zookeeper对象new之后等待一下,同时判断state是否为connected,上代码:

    if(!zk.getState().equals(States.CONNECTED)){
                while(true){
                    if(zk.getState().equals(States.CONNECTED)){
                        break;
                    }
                    try {
                        TimeUnit.SECONDS.sleep(5);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
    2019-07-17 18:49:43
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
如何运维千台以上游戏云服务器 立即下载
网站/服务器取证 实践与挑战 立即下载
ECS块储存产品全面解析 立即下载