Docker 动物园管理员合奏团赢得';我不能开车

Docker 动物园管理员合奏团赢得';我不能开车,docker,apache-zookeeper,Docker,Apache Zookeeper,我已经建立了一个Zookeeper集合(版本3.4.9),包含3个实例。这在测试系统上起到了很好的作用,但在实时系统上根本就没有。错误消息如下所示: 2020-08-28 06:26:24,643 [myid:1] - WARN [WorkerSender[myid=1]:QuorumCnxManager@400] - Cannot open channel to 2 at election address /10.3.1.173:3888 java.net.NoRouteToHostExce

我已经建立了一个Zookeeper集合(版本3.4.9),包含3个实例。这在测试系统上起到了很好的作用,但在实时系统上根本就没有。错误消息如下所示:

2020-08-28 06:26:24,643 [myid:1] - WARN  [WorkerSender[myid=1]:QuorumCnxManager@400] - Cannot open channel to 2 at election address /10.3.1.173:3888
java.net.NoRouteToHostException: Host is unreachable (Host unreachable)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:381)
    at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:354)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:452)
    at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:433)
    at java.lang.Thread.run(Thread.java:745)
我在这里和其他地方进行了搜索,但唯一可以接受的解决方案是将每个节点的服务器地址设置为0.0.0.0,这在这里不起作用。我的设置是完全对接的,并使用ansible应用,因此它看起来可能与人们通常所做的有点不同。但服务器1的连接字符串如下所示:

"server.1=0.0.0.0:2888:3888 server.2=10.3.1.173:2888:3888 server.3=10.3.1.175:2888:3888"
这也适用于zookeepers的内部配置,如日志所示(同样适用于服务器1):

这适用于zookeeper的所有3个实例,但没有一个可以与另一个实例对话

其他信息:

  • 除了服务器的IP地址外,配置与测试系统相同。Ansible Docker模块的配置相同,JAAS配置(带有DigestLoginModule)相同,所有Docker容器内的环境变量也相同
  • 实时系统中的每台服务器都可以ping其他服务器。我还可以从每个Zookeeper容器中ping这些服务器。此外,我可以从实时系统的任何其他容器中卷曲JMX端口上的每个Zookeeper容器。所以他们肯定可以通过网络连接
请帮忙,谢谢


编辑:@Stefano询问我如何启动docker容器,因此我将尝试提供一些见解。如前所述,这是一个任务中的Ansible设置,使用“docker_container”插件,在剧本中用于跨机器安装3个实例:

---
- name: Install Zookeeper
  docker_container:
    name: zookeeper
    image: zookeeper:3.4.9
    state: started
    ports:
      - "2181:2181" # Zookeeper Port
      - "2888:2888" 
      - "3888:3888" # Election ports
      - "9998:8080" # JMX metrics
    env:
        ZOO_MY_ID: "{{ ID }}"  #this is 1 for server.1, etc.
        ZOO_PORT: "2181"
        ZOO_SERVERS: "{{ ZOO_SERVERS }}"  #provided in host-vars
        SERVER_JVMFLAGS: "-Djava.security.auth.login.config=/etc/kafka/zookeeper_jaas.conf -javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent-0.12.0.jar=8080:/opt/jmx-exporter/zookeeper.yml"
    volumes:
      - /home/ansible/volumes/zoo1/data:/data
      - /home/ansible/volumes/zoo1/datalog:/datalog
      - /home/ansible/jmx-exporter:/opt/jmx-exporter
      - /home/ansible/zookeeper_jaas.conf:/etc/kafka/zookeeper_jaas.conf
ZOO_服务器取自主机文件:

all:
  (...)
  children:
    zookeeper:
      hosts:
        zoo1:
          ID: "1"
          ZOO_SERVERS: "server.1=0.0.0.0:2888:3888 server.2=10.3.1.173:2888:3888 server.3=10.3.1.175:2888:3888"
          ansible_host: 10.3.1.171
        zoo2: 
          ID: "2"
          ZOO_SERVERS: "server.1=10.3.1.171:2888:3888 server.2=0.0.0.0:2888:3888 server.3=10.3.1.175:2888:3888" 
          ansible_host: 10.3.1.173
        zoo3: 
          ID: "3"
          ZOO_SERVERS: "server.1=10.3.1.171:2888:3888 server.2=10.3.1.173:2888:3888 server.3=0.0.0.0:2888:3888"
          ansible_host: 10.3.1.175

因此,当我阅读上面的评论时,我注意到我实际上使用的不是“confluentinc/cp zookeeper”docker图像,而是“zookeeper”docker图像

一旦我从“zookeeper:3.4.9”更改为“confluentinc/cp zookeeper:5.4.0”,并将ZOO_PORT env var的名称调整为zookeeper_CLIENT_PORT,它就不知怎么起作用了


这并不能回答“为什么”,但也许这个变通方法可以帮助其他人。我现在将此标记为已被接受的答案,但请随时提供更多信息。

您能联系到10.3.1.173:3888吗?此外,您可以分享如何启动docker映像吗?@Stefano提供的Zookeeper映像(confluentinc/cp Zookeeper:3.4.9)不包括curl或包管理器,因此我在同一台机器上使用了另一个启用curl的容器。这一个可以达到10.1.173:3888,尽管没有输出,因为它是一个选举服务端口。不管怎么说,没有“拒绝连接”之类的。我还编辑了这个问题来展示如何启动映像。哦,3888端口已正确地从容器映射到基本VM,并且已准备好侦听(根据netstat)。
all:
  (...)
  children:
    zookeeper:
      hosts:
        zoo1:
          ID: "1"
          ZOO_SERVERS: "server.1=0.0.0.0:2888:3888 server.2=10.3.1.173:2888:3888 server.3=10.3.1.175:2888:3888"
          ansible_host: 10.3.1.171
        zoo2: 
          ID: "2"
          ZOO_SERVERS: "server.1=10.3.1.171:2888:3888 server.2=0.0.0.0:2888:3888 server.3=10.3.1.175:2888:3888" 
          ansible_host: 10.3.1.173
        zoo3: 
          ID: "3"
          ZOO_SERVERS: "server.1=10.3.1.171:2888:3888 server.2=10.3.1.173:2888:3888 server.3=0.0.0.0:2888:3888"
          ansible_host: 10.3.1.175