嗨,我正在尝试通过AWS配置hazelcast集群。
我正在docker容器中运行hazelcast,并使用--net=host来使用主机网络配置。
当我看榛子树日志时,我看到
[172.17.0.1]:5701 [herald] [3.8] Established socket connection between /[node2]:5701 and /[node1]:47357
04:24:22.595 [hz._hzInstance_1_herald.IO.thread-out-0] DEBUG c.h.n.t.SocketWriterInitializerImpl - [172.17.0.1]:5701 [herald] [3.8] Initializing SocketWriter WriteHandler with Cluster Protocol
04:24:22.595 [hz._hzInstance_1_herald.IO.thread-in-0] WARN c.h.nio.tcp.TcpIpConnectionManager - [172.17.0.1]:5701 [herald] [3.8] Wrong bind request from [172.17.0.1]:5701! This node is not requested endpoint: [node2]:5701
04:24:22.595 [hz._hzInstance_1_herald.IO.thread-in-0] INFO c.hazelcast.nio.tcp.TcpIpConnection - [172.17.0.1]:5701 [herald] [3.8] Connection[id=40, /[node2]:5701->/[node1]:47357, endpoint=null, alive=false, type=MEMBER] closed. Reason: Wrong bind request from [172.17.0.1]:5701! This node is not requested endpoint: [node2]:5701
我可以看到一个错误,说绑定请求来自172.17.0.1到node1,而node1不接受这个请求。
final Config config = new Config();
config.setGroupConfig(clientConfig().getGroupConfig());
final NetworkConfig networkConfig = new NetworkConfig();
final JoinConfig joinConfig = new JoinConfig();
final TcpIpConfig tcpIpConfig = new TcpIpConfig();
final MulticastConfig multicastConfig = new MulticastConfig();
multicastConfig.setEnabled(false);
final AwsConfig awsConfig = new AwsConfig();
awsConfig.setEnabled(true);
// awsConfig.setSecurityGroupName("xxxx");
awsConfig.setRegion("xxxx");
awsConfig.setIamRole("xxxx");
awsConfig.setTagKey("type");
awsConfig.setTagValue("xxxx");
awsConfig.setConnectionTimeoutSeconds(120);
joinConfig.setAwsConfig(awsConfig);
joinConfig.setMulticastConfig(multicastConfig);
joinConfig.setTcpIpConfig(tcpIpConfig);
networkConfig.setJoin(joinConfig);
final InterfacesConfig interfaceConfig = networkConfig.getInterfaces();
interfaceConfig.setEnabled(true).addInterface("172.29.238.71");
config.setNetworkConfig(networkConfig);
上面是配置AWSConfig的代码请帮我解决这个问题。
感谢
您在默认的Hazelcast绑定地址选择机制中遇到问题(#111795)。
有几种可用的解决方案:
解决方法1:系统属性
您可以通过提供正确的IP地址作为hazelcast.local.localAddress
系统属性来设置绑定地址:
java -Dhazelcast.local.localAddress=[yourCorrectIpGoesHere]
或
System.setProperty("hazelcast.local.localAddress", "[yourCorrectIpGoesHere]")
请阅读《Hazelcast参考手册》"系统属性"一章中的详细信息
解决方案2:Hazelcast网络配置
Hazelcast网络配置允许您指定哪些IP地址可以用于绑定服务器。
在hazelcast.xml
:中声明
<hazelcast>
...
<network>
...
<interfaces enabled="true">
<interface>10.3.16.*</interface>
<interface>10.3.10.4-18</interface>
<interface>192.168.1.3</interface>
</interfaces>
</network>
...
</hazelcast>
编程:
Config config = new Config();
NetworkConfig network = config.getNetworkConfig();
InterfacesConfig interfaceConfig = network.getInterfaces();
interfaceConfig.setEnabled(true).addInterface("192.168.1.3");
HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(config);
阅读Hazelcast参考手册接口部分的详细信息
更新:通过前面的步骤,您可以设置一个正确的绑定地址,例如ip addr show
返回的本地地址。然而,如果您在本地IP和公共IP不同的环境中运行Hazelcast(clouds,docker),这可能是不够的。
下一步:配置公共地址
在集群节点在报告的其他节点的本地地址下看不到彼此的环境中,此步骤是必要的。您必须设置公共地址——它是节点能够访问的地址(可以选择指定端口)。
networkConfig.setPublicAddress("172.29.238.71");
// or if a non-default Hazelcast port is used - e.g.9991
networkConfig.setPublicAddress("172.29.238.71:9991");