[주키퍼] java.net.NoRouteToHostException: No route to host

Wookoa 2025. 2. 18.

No route to host Host unreachable
No route to host Host unreachable

머리말

  일반적으로 Zookeeper 서버를 설치한 직후 java.net.NoRouteToHostException 에러 메시지를 주로 만난다. 특히나 처음으로 설치한다면 Zookeeper 설정이 가장 먼저 의심스러울 수 있다. 본 포스팅에서는 Zookeeper 기동 과정에서 발생한 Host unreachable 에러를 해결하는 방법에 대해서 소개한다.

No route to host (Host unreachable)

  해결 방법의 결론부터 언급하자면, 각 서버간 방화벽이 열려있지 않아서 발생하는 에러 메시지다. 특별히 포트 번호를 설정하지 않았다면 2888/3888 포트를 기본으로 사용하는데, 아래와 같은 경로에 위치한 설정 파일에서도 확인할 수 있다. 관련된 에러 로그는 아래와 같다.

/usr/local/apache-zookeeper-3.5.9-bin/conf/zoo.cfg

  2025-02-15 20:20:34,945 [myid:1] - INFO  [QuorumPeer[myid=1](plain=[0:0:0:0:0:0:0:0]:2181)(secure=disabled):FastLeaderElection@937] - Notification time out: 60000
  2025-02-15 20:20:34,946 [myid:1] - INFO  [QuorumConnectionThread-[myid=1]-196:QuorumCnxManager@481] - Have smaller server identifier, so dropping the connection: (myId:1 --> sid:2)
  2025-02-15 20:20:34,946 [myid:1] - WARN  [QuorumConnectionThread-[myid=1]-197:QuorumCnxManager@381] - Cannot open channel to 3 at election address zookeeper3.wookoa.com/192.168.219.223:3888
  java.net.NoRouteToHostException: No route to host (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:607)
          at org.apache.zookeeper.server.quorum.QuorumCnxManager.initiateConnection(QuorumCnxManager.java:373)
          at org.apache.zookeeper.server.quorum.QuorumCnxManager$QuorumConnectionReqThread.run(QuorumCnxManager.java:436)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
          at java.lang.Thread.run(Thread.java:750)

  Zookeeper 설정 파일에 적용된 포트 번호로 방화벽을 열어주면 에러 상황은 해결된다. 본 포스팅에서는 방화벽 오픈에 대해서는 별도로 언급하지 않으며, 각 포트의 역할과 의미에 대해서 아래와 같이 설명한다.

 포트번호  역할
 2888  팔로워(followers)가 리더(Leader)와 통신하기 위해 사용하는 포트
 3888  리더(Leader) 선출을 위해 사용되는 포트
  tickTime=2000
  initLimit=10
  syncLimit=5
  dataDir=/data/zk
  clientPort=2181
  autopurge.snapRetainCount=3
  autopurge.purgeInterval=1
  server.1=zookeeper1.wookoa.com:2888:3888
  server.2=zookeeper2.wookoa.com:2888:3888
  server.3=zookeeper3.wookoa.com:2888:3888

꼬리말

  매우 간단하게 Zookeeper 에러 상황을 해결했다. Zookeeper 설정 값에 문제가 있는 것이 아닌, 서버간 방화벽 차단이 원인이었으며 특별 포트의 방화벽 오픈 또는 방화벽 서비스 종료를 통해 해결할 수 있다. Zookeeper 서버에서 발생하는 No route to host 에러 메시지에 대해 해결하는 방법을 소개한 본 포스팅은 이로써 마무리를 짓도록 한다.

인기있는 글

소중한 댓글 (0)