AWS 3节点ZooKeeper集群启动失败:Bind异常求助
3节点ZooKeeper集群AWS环境启动失败排查与解决
问题现象
启动ZooKeeper集群时出现绑定失败错误,导致服务直接退出:
[myid:1] ERROR[ListenerHandler-/3.66.164.46:3888:QuorumCnxManager$Listener$ListenerHandler@1112 java.net.BindException: Cannot assign requested address (Bind failed) [myid:1] - INFO [QuorumPeerListener:QuorumCnxManager$Listener@979] - Leaving listener [myid:1] - ERROR [QuorumPeerListener:QuorumCnxManager$Listener@981] - As I'm leaving the listener [myid:1] - ERROR [QuorumPeerListener:ServiceUtils@42] - Exiting JVM with code 14
已做检查与现有配置
ZooKeeper核心配置(zoo.cfg)
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/var/lib/zookeeper clientPort=2181 clientPortAddress=0.0.0.0 autopurge.purgeInterval=1 autopurge.snapRetainCount=5 maxClientCnxns=10 server.1=3.66.164.46:2888:3888 server.2=54.93.51.11:2888:3888 server.3=3.65.56.192:2888:3888
systemd服务配置(zookeeper.service)
[Unit] Description=Zookeeper Daemon Documentation=http://zookeeper.apache.org Requires=network.target After=network.target [Service] Type=forking WorkingDirectory=/opt/zookeeper User=zookeeper Group=zookeeper ExecStart=/opt/zookeeper/bin/zkServer.sh start-foreground /opt/zookeeper/conf/zoo.cfg ExecStop=/opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/conf/zoo.cfg ExecReload=/opt/zookeeper/bin/zkServer.sh restart /opt/zookeeper/conf/zoo.cfg TimeoutSec=30 Restart=on-failure [Install] WantedBy=default.target
端口监听状态
sudo netstat -tulpn | grep LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 576/sshd tcp6 0 0 :::22 :::* LISTEN 576/sshd tcp6 0 0 :::44379 :::* LISTEN 24787/java tcp6 0 0 :::2181 :::* LISTEN 24787/java tcp6 0 0 :::8080 :::* LISTEN 24787/java
/etc/hosts配置
3.66.164.46 lx1 ip-172-20-98-26.eu-central-1.compute.internal 54.93.51.11 lx2 ip-172-20-111-50.eu-central-1.compute.internal 3.65.56.192 lx3 ip-172-20-111-50.eu-central-1.compute.internal
联通性测试结果
公网端口无法连通:
telnet 3.66.164.46 2888 Trying 3.66.164.46... telnet: Unable to connect to remote host: Connection refused telnet 3.66.164.46 3888 Trying 3.66.164.46... telnet: Unable to connect to remote host: Connection refused
问题分析与解决步骤
1. 修正/etc/hosts配置错误
现有hosts中lx2和lx3的内网IP完全重复,会导致集群节点识别混乱。需将lx3对应的内网IP改为正确值(可通过hostname -i或AWS控制台查看实例内网IP):
3.66.164.46 lx1 ip-172-20-98-26.eu-central-1.compute.internal 54.93.51.11 lx2 ip-172-20-111-50.eu-central-1.compute.internal 3.65.56.192 lx3 ip-172-20-xxx-xxx.eu-central-1.compute.internal
2. 修改zoo.cfg的server列表为内网IP
AWS实例的公网IP是通过NAT映射实现的,实例网卡并未直接绑定公网IP,ZooKeeper尝试绑定公网IP会触发BindException。需将server配置改为内网IP或内网主机名:
server.1=ip-172-20-98-26.eu-central-1.compute.internal:2888:3888 server.2=ip-172-20-111-50.eu-central-1.compute.internal:2888:3888 server.3=ip-172-20-xxx-xxx.eu-central-1.compute.internal:2888:3888
保留clientPortAddress=0.0.0.0,确保外部客户端可通过公网IP访问2181端口。
3. 开放必要端口的访问权限
- AWS安全组:配置入站规则,允许:
- TCP 2181:开放给所有需要连接ZooKeeper的客户端IP
- TCP 2888、3888:仅开放给集群内三个实例的内网IP
- 实例防火墙:临时关闭防火墙测试,或添加规则开放上述端口:
# firewalld示例 firewall-cmd --add-port=2181/tcp --permanent firewall-cmd --add-port=2888/tcp --permanent firewall-cmd --add-port=3888/tcp --permanent firewall-cmd --reload
4. 验证集群内网联通性
在每个节点上测试与其他节点的内网端口连通性:
telnet ip-172-20-111-50.eu-central-1.compute.internal 2888 telnet ip-172-20-111-50.eu-central-1.compute.internal 3888
确保能正常连接,若仍拒绝需检查安全组和防火墙配置。
5. 重启服务并验证
修改所有配置后,重启每个节点的ZooKeeper服务:
systemctl restart zookeeper
查看服务日志确认启动成功:
journalctl -u zookeeper -f
正常启动后,可通过zkServer.sh status查看节点角色(leader/follower)。
内容的提问来源于stack exchange,提问作者offline
相关产品推荐
相关产品推荐

