Hazelcast自动添加成员后又移除问题排查与阻止方案求助
问题排查与解决方案
排查方向
- 确认MEMBER3的真实身份:
- 定位MEMBER3对应的物理机器/容器,检查是否存在未授权的Hazelcast实例,或当前两台集群机器上是否有重复启动的应用进程(比如进程未正常终止,导致新实例启动后成为MEMBER3)。
- 使用
netstat -tulpn | grep 5701或lsof -i :5701命令,在相关机器上排查占用5701端口的进程,确认是否有额外的Hazelcast实例在运行。
- 验证Group配置的唯一性:
- 检查是否有其他服务/实例使用了与当前集群相同的
group name和password,导致MEMBER3能通过认证加入集群。
- 检查是否有其他服务/实例使用了与当前集群相同的
阻止MEMBER3加入的具体方法(适配Hazelcast 3.7.8)
1. 限制集群允许的接入IP
通过配置Interfaces,仅允许MEMBER1和MEMBER2的IP接入集群,拒绝其他所有IP的连接:
@Bean("hazelcastInstanceTest") public HazelcastInstance hazelcastInstance() { Config config = new Config(); config.getNetworkConfig().addOutboundPort(0); config.getGroupConfig().setName(name).setPassword(password); // 新增:配置允许的接入IP config.getNetworkConfig().getInterfaces() .setEnabled(true) .addInterface("MEMBER1_IP") // 替换为MEMBER1的实际IP .addInterface("MEMBER2_IP"); // 替换为MEMBER2的实际IP JoinConfig joinConfig = config.getNetworkConfig().getJoin(); joinConfig.getMulticastConfig().setEnabled(false); List<String> members = Arrays.asList("MEMBER1:5701","MEMBER2:5701"); joinConfig.getTcpIpConfig() .setMembers(members) .setEnabled(true); return Hazelcast.newHazelcastInstance(config); }
2. 强化Group认证
- 修改集群的
group name和password,确保仅当前两台集群实例知晓新的认证信息,彻底阻断未授权实例的加入。
3. 防火墙层面拦截
在MEMBER1和MEMBER2的机器上配置防火墙规则,仅允许对方IP访问5701端口,拒绝其他所有IP的连接:
# 以iptables为例,允许MEMBER2访问MEMBER1的5701端口 iptables -A INPUT -p tcp --dport 5701 -s MEMBER2_IP -j ACCEPT # 拒绝其他所有IP访问5701端口 iptables -A INPUT -p tcp --dport 5701 -j DROP
4. 检查应用部署逻辑
- 确认应用部署脚本/容器配置是否存在重复启动的问题(比如容器重启策略导致多实例运行),确保每台机器仅运行一个Hazelcast实例。
补充说明
从日志来看,MEMBER3是主动请求退出集群(requested by: [MEMBER3]:5701),说明该实例本身可能存在启动异常或配置错误,导致加入后立即自行终止,随后重复尝试加入。找到该实例的运行环境并停止它,是彻底解决问题的根本方法。
内容的提问来源于stack exchange,提问作者Adrian Scarlatescu
相关产品推荐
相关产品推荐

