
머리말
일반적으로 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)