鉴于 Hazelcast 是分布式 IMDG 并且通常设置在多台机器上,因此它需要访问内部/外部网络。最重要的用例是在集群内发现 Hazelcast 节点。
Hazelcast 需要以下端口-
1 个入站端口,用于从其他 Hazelcast 节点/客户端接收 ping/数据n 向集群的其他成员发送 ping/数据所需的出站端口数。
这种节点发现以几种方式发生-
MulticastTCP/IPAmazon EC2 自动发现
其中,我们将看看多播和 TCP/IP
多播
组播加入机制默认开启。 https://en.wikipedia.org/wiki/Multicast 是一种方式一种将消息传送到组中所有节点的通信形式。这就是 Hazelcast 用来发现集群其他成员的方法。我们之前看过的所有示例都使用多播来发现成员。
示例
现在让我们显式地打开它。将以下内容保存在 hazelcast-multicast.xml 中
<hazelcast
xsi:schemaLocation="http://www.hazelcast.com/schema/config
http://www.hazelcast.com/schema/config/hazelcast-config-3.12.12.xsd"
xmlns="http://www.hazelcast.com/schema/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<network>
<join>
<multicast enabled="true" />
</join>
</network>
</hazelcast>
然后,让我们执行以下操作-
java-Dhazelcast.config=hazelcast-multicast.xml-cp .\target\demo-0.0.1-
SNAPSHOT.jar com.example.demo.XMLConfigLoadExample
输出
在输出中,我们注意到 Hazelcast 的以下几行,这实际上意味着多播加入者是用于发现成员。
Jan 30, 2021 5:26:15 PM com.hazelcast.instance.Node
INFO: [localhost]:5701 [dev] [3.12.12] Creating MulticastJoiner
默认情况下,多播接受来自多播组中所有机器的通信。这可能是一个安全问题,这就是为什么通常对内部部署的多播通信进行防火墙设置的原因。因此,虽然多播有利于开发工作,但在生产中,最好使用基于 TCP/IP 的发现。
TCP/IP
由于组播的缺点,TCP/IP 是首选的通信方式。在 TCP/IP 的情况下,成员只能连接到已知/列出的成员。
示例
让我们使用 TCP/IP 作为发现机制。将以下内容保存在 hazelcast-tcp.xml 中
<hazelcast
xsi:schemaLocation="http://www.hazelcast.com/schema/config
http://www.hazelcast.com/schema/config/hazelcast-config-3.12.12.xsd"
xmlns="http://www.hazelcast.com/schema/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<network>
<join>
<multicast enabled="false" />
<tcp-ip enabled="true">
<members>localhost</members>
</tcp-ip>
</join>
</network>
</hazelcast>
然后,让我们执行以下命令-
java-Dhazelcast.config=hazelcast-tcp.xml-cp .\target\demo-0.0.1-SNAPSHOT.jar
com.example.demo.XMLConfigLoadExample
输出
输出如下-
INFO: [localhost]:5701 [dev] [3.12.12] Creating TcpIpJoiner
Jan 30, 2021 8:09:29 PM
com.hazelcast.spi.impl.operationexecutor.impl.OperationExecutorImpl
上面的输出显示 TCP/IP joiner 用于加入两个成员。
如果你在两个不同的 shell 上执行以下命令-
java '-Dhazelcast.config=hazelcast-tcp.xml'-cp .\target\demo-0.0.1-SNAPSHOT.jar
com.example.demo.MultiInstanceHazelcastExample
我们看到以下输出-
Members {size:2, ver:2} [
Member [localhost]:5701-62eedeae-2701-4df0-843c-7c3655e16b0f
Member [localhost]:5702-859c1b46-06e6-495a-8565-7320f7738dd1 this
]
以上输出意味着节点能够使用 TCP/IP 加入,并且都使用 localhost 作为 IP 地址。
请注意,我们可以在 XML 配置文件中指定更多 IP 或机器名称(由 DNS 解析)。
<hazelcast
xsi:schemaLocation="http://www.hazelcast.com/schema/config
http://www.hazelcast.com/schema/config/hazelcast-config-3.12.12.xsd"
xmlns="http://www.hazelcast.com/schema/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<network>
<join>
<multicast enabled="false" />
<tcp-ip enabled="true">
<members>machine1, machine2....</members>
</tcp-ip>
</join>
</network>
</hazelcast>