Zookeeper错误:无法在选举地址打开通道X.

Rah*_*hul 42 java amazon-web-services apache-zookeeper

我在3个不同的aws服务器上安装了zookeeper.以下是所有服务器中的配置

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/zookeeper
clientPort=2181
server.1=x.x.x.x:2888:3888
server.2=x.x.x.x:2888:3888
server.3=x.x.x.x:2888:3888
Run Code Online (Sandbox Code Playgroud)

所有这三个实例都有一个带有适当id 的myid文件var/zookeeper.所有三台服务器都从aws控制台打开了所有端口.但是当我运行zookeeper服务器时,我在所有实例中都收到以下错误.

2015-06-19 12:09:22,989 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@382] 
  - Cannot open channel to 2 at election address /x.x.x.x:3888
java.net.ConnectException: Connection refused
  at java.net.PlainSocketImpl.socketConnect(Native Method)
  at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
  at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
  at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
  at java.net.Socket.connect(Socket.java:579)
  at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
  at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:402)
  at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:840)
  at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:762)
2015-06-19 12:09:23,170 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@382]
   - Cannot open channel to 3 at election address /x.x.x.x:3888
java.net.ConnectException: Connection refused
  at java.net.PlainSocketImpl.socketConnect(Native Method)
  at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
  at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
  at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
  at java.net.Socket.connect(Socket.java:579)
  at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
  at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:402)
  at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:840)
  at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:762)
2015-06-19 12:09:23,170 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:FastLeaderElection@849] - Notification time out: 25600
Run Code Online (Sandbox Code Playgroud)

esp*_*ora 85

如何在每个节点中定义本地服务器的ip?如果您已经提供了公共IP,则侦听器将无法连接到该端口.您必须为当前节点指定0.0.0.0

server.1=0.0.0.0:2888:3888
server.2=192.168.10.10:2888:3888
server.3=192.168.2.1:2888:3888
Run Code Online (Sandbox Code Playgroud)

此更改也必须在其他节点上执行.

  • @ ady对Shades88问题的评论不正确,将maxClientCnxns设置为0表示并发客户端连接没有限制.此设置用于防止DoS攻击. (5认同)
  • 请不要将 0.0.0.0 与 3.5.0 之间的 Zookeeper 版本一起使用。和 3.5.8。它会在第一次重新启动后杀死 Zookeeper 节点。Zookeeper 中存在一个已确认的错误,该错误仅从 3.8.0 开始修复。然而,例如 confluence-platform 目前使用的是 3.7.0。[提交描述](https://github.com/apache/zookeeper/commit/800cc26a768fceda9ea42fe8121acf45fe781c57)@espeirasbora我认为在答案中值得注意这一点。 (3认同)
  • 你好,我面临同样的问题。但是这个解决方案没有用。请帮忙。下面是我的配置... `dataDir=/tmp/zookeeper clientPort=3888 maxClientCnxns=0 initLimit=5 syncLimit=2 server.1=xxxx:2888:3888 server.2=0.0.0.0:2888:3888` (2认同)
  • 您将最大客户端连接数设置为0:maxClientCnxns = 0 (2认同)
  • 谢谢.遗憾的是,官方入门指南中没有提到这一点 (2认同)

小智 8

我遇到了保存问题并解决了它.

确保myid是在zoo.cfg中使用您的配置进行保存.

请检查conf目录中的zoo.cfg文件,其中包含此类内容.

server.1=zookeeper1:2888:3888  
server.2=zookeeper2:2888:3888  
server.3=zookeeper3:2888:3888  
Run Code Online (Sandbox Code Playgroud)

并检查服务器dataDir目录中的myid.例如:

让我们说dataDir定义zoo.cfg就是'/home/admin/data'

然后在zookeeper1上,你必须有一个名为myid的文件,并且在这个文件上的值为1;在zookeeper2上,你必须有一个名为myid的文件,并且该文件的值为2; 在zookeeper3上,您必须有一个名为myid的文件,并且该文件的值为3.

如果没有像这样配置,服务器将侦听错误的ip:端口.


小智 6

以下是一些 ansible jinja2 模板信息,用于自动构建 Zoo.cfg 中主机名为 0.0.0.0 的集群

{% for url in zookeeper_hosts_list %}
  {%- set url_host = url.split(':')[0] -%}
  {%- if url_host == ansible_fqdn or url_host in     ansible_all_ipv4_addresses -%}
server.{{loop.index0}}=0.0.0.0:2888:3888
{% else %}
server.{{loop.index0}}={{url_host}}:2888:3888
{% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您自己的主机名解析为 127.0.0.1(在我的例子中,主机名位于 /etc/hosts 中),zookeeper 在 Zoo.cfg 文件中没有 0.0.0.0 的情况下将无法启动,但如果您的主机名解析为实际的机器的IP,您可以将其自己的主机名放入配置文件中。