集群模式下,比如我有3个zookeeper服务器,分别是zk1,zk2,zk3 ,zookeeper兑现创建时连接串写法是zk1:2181,zk2:2181,zk3:2181 ,按照zk的选举算法,只要有超过半数的节点活着集群就能工作。但是如果这时客户端刚开始初始化,但是zk1挂了,会使用zk1的服务器配置去创建连接,从而报连接被拒绝的异常以致启动退出。这里有什么优雅的方法能在启动阶段让zookeeper自动避开已经失效的节点去选择有效的节点去连接么?
如果在你的Java客户端代码里面,API中使用诸如 zk1:2181,zk2:2181,zk3:2181 这样的连接串时,ZooKeeper会逐个进行自动重试,直到找到一个可以使用的服务器地址。
因此,你说的
但是如果这时客户端刚开始初始化,但是zk1挂了,会使用zk1的服务器配置去创建连接,从而报连接被拒绝的异常以致启动退出。
应该不会存在呢
由于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();
}
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。