当使用Java操作Zookeeper客户端的时候,有时候会报
Exception in thread "main" org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /servers/server
百度中常见的方式就是关闭服务器的防火墙,或者开放端口
# 禁用防火墙
systemctl disable firewalld
# 开放端口
firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --zone=public --add-port=2888/tcp --permanent
firewall-cmd --zone=public --add-port=3888/tcp --permanent
如果关闭防火墙或者开放端口这种方式还是不行,可以尝试调大Zookeeper的会话时间,因为它是心跳机制,也就是当一个zookeeper超过该时间没有心跳,则认为该节点故障。所以,如果会话时间值小于zookeeper的创建时间,则当zookeeper还未来得及创建连接,会话时间已到,因此抛出异常认为该节点故障了
我这里是增大为 30秒
@Test
public void test01() throws IOException, KeeperException, InterruptedException {
//zookeeper服务器地址
String connectString="192.168.58.134:2181";
//设置会话时间,单位毫秒(增大为30秒)
int sessionTimeout=30000;
//创建Zookeeper连接
ZooKeeper zk=new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("事件触发:"+watchedEvent);
}
});
//创建一个持久化节点
zk.create("/app1","val".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}