实际项目开发中,用的是Linux环境。
中午突然断电,死活连不上Zookeeper,最终发现是需要关闭防火墙。
看日志,报错如下:
Exception in thread "main" org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /test
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:1501)
at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1529)
at com.jiq.test.ZooKeeperTest.main(ZooKeeperTest.java:12)
经过实践,最终发现是“防火墙”的原因。
主要参考了网上的一篇文章。
不正确的解决办法:
“上网一查,全是说什么到Zookeeper服务的连接未完成,说是加下面这段代码就好了:
CountDownLatch connectedLatch = new CountDownLatch(1);
if (States.CONNECTING == zk.getState()) {
try {
connectedLatch.await();
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
}
我觉得这有点扯淡,首先官网没有任何提到要加这样的代码来等待连接准备好的话语,其次为什么本机可以,远端就不行,难道天生本机就一定能够快速建立好连接,远端就要等一等么?
于是我决定自己思考,想了一天才觉得可能是防火墙问题,于是把windwos server 2008防火墙关闭,OK了,把CentOS防火墙关闭,也OK了,哎!”
看了这个哥们的描述,我深以为然啊。
我也尝试过,加一些乱七八糟的代码,发现都不能解决问题。
最终,尝试了这个哥们的“关闭防火墙”的解决办法。
但是,这篇文章中,永久关闭防火墙的那种方式,是不对的,只要使用了,Zookeeper就连接不上。
“CentOS关闭防火墙命令:
CentOS Linux开启和关闭防火墙命令有两种,一种是临时的,重启即复原;另外一种是永久xìng的,重启不会复原。
1) 临时生效,重启后复原
开启: service iptables start
关闭: service iptables stop
2) 永久xìng生效,重启后不会复原
开启: chkconfig iptables on
关闭: chkconfig iptables off
我执行的是永久修改的命令,执行完了也可以不重启电脑,重启防火墙服务即可: service iptables restart ”
实际中,我用的是临时的关闭防火墙的办法,这样,如果服务器再次断电重启,还需要手动关闭。
这个哥们貌似是“永久关闭防火墙”,反正我也试了,永久关闭,总是不行,可能是我的问题。
这个哥们说,不用重启服务器,反正我没有重启,不知道重启了效果会如何。
一点感想
自己遇到的很多问题,网上基本都有答案了。
优先用别人的解决办法,是非常合适的,比较迅速,很快提升自己解决问题的能力。
技术框架之类的,主要还是别人生成,在水平不够之前,“拿来主义”是不错的。
随便一个工具框架,自己去搞,至少得个把月上年吧~
整理自己的技术体系,管理自己遇到的问题,很有必要。
一句话:建立健全自己的技术体系和社会生存能力体系。(怎么感觉像是官方文件呢~)
最近,抽空,分享下自己的浏览器收藏夹,和一些知识管理的心得体会~
参考资料
Zookeeper异常ConnectionLossException解决
http://www.sjsjw.com/kf_cloud/article/022572ABA018042.asp
转载于:https://www.cnblogs.com/qitian1/p/6462555.html