IgniteClusterManager
是基于 Apache Ignite 实现。
Vert.x 集群管理器包含以下几个功能:
发现并管理集群中的节点
管理集群端的主题订阅清单(这样就可以轻松得知集群中的那些节点订阅了那些 EventBus 地址)
分布式 Map 支持
分布式锁
分布式计数器
Vert.x 集群器并不处理节点之间的通信,在 Vert.x 中节点中的通信是直接由 TCP 链接处理的。
Vert.x cluster manager is a pluggable component, so you can pick the one you want, or the one that is the most adapted to your environment. So you can replace default Vert.x cluster manager by this implementation.
Vert.x 能够从 classpath 路径的 jar 自动检测并使用出 ClusterManager
的实现。不过需要确保在 classpath 没有其他的 ClusterManager
实现。
另外 Vert.x 可以通过设置 -Dvertx.clusterManagerFactory=io.vertx.spi.cluster.ignite.IgniteClusterManager
来使用指定的 集群管理器实现。
确保 vertx-ignite-3.6.2.jar
在 Vert.x 的安装路径中的 lib 目录下。
Add a dependency to the artifact.
Maven (在 pom.xml
文件中):
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-ignite</artifactId>
<version>3.6.2</version>
</dependency>
Gradle (在 build.gradle
文件中):
compile 'io.vertx:vertx-ignite:3.6.2'
通过编码的形式,设置集群管理器实现,例子:
ClusterManager clusterManager = new IgniteClusterManager();
VertxOptions options = new VertxOptions().setClusterManager(clusterManager);
Vertx.clusteredVertx(options, res -> {
if (res.succeeded()) {
Vertx vertx = res.result();
} else {
// failed!
}
});
Note: Starting with version 2.0, Apache Ignite has introduced a new off-heap memory architecture. All caches use off-heap memory by default. New memory architecture is described in Ignite Virtual Memory article.
在 vertx-ignite
jar 中内嵌了一个默认配置文件 default-ignite.xml
。
如果需要覆盖此配置文件,需要在 classpath 路径中添加 ignite.xml
default-ignite.xml
与 ignite.xml
必须是一个 Apache Ignite
配置文件,在
Apache Ignite documentation 的官方中文文档中,可以找到具体的配置描述。
您还可以以编程方式指定配置:
IgniteConfiguration cfg = new IgniteConfiguration();
// Configuration code (omitted)
ClusterManager clusterManager = new IgniteClusterManager(cfg);
VertxOptions options = new VertxOptions().setClusterManager(clusterManager);
Vertx.clusteredVertx(options, res -> {
if (res.succeeded()) {
Vertx vertx = res.result();
} else {
// failed!
}
});
在默认配置中使用 TcpDiscoveryMulticastIpFinder
实现,这网络发现实现,需要开启组播。
如果组播被禁用,可以采用 TcpDiscoveryVmIpFinder
替代,前提是在 ignite.xml
事先配置好 IP 地址列表。
具体 Ignite 集群配置,可以参考文档 Cluster Configuration 。
If the default multicast configuration is not working here are some common causes:
By default the cluster manager is using TcpDiscoveryMulticastIpFinder
, so IP multicasting is required,
on some systems, multicast route(s) need to be added to the routing table otherwise, the default route will be used.
Note that some systems don’t consult the routing table for IP multicast routing, only for unicast routing
MacOS example:
# Adds a multicast route for 224.0.0.1-231.255.255.254 sudo route add -net 224.0.0.0/5 127.0.0.1 # Adds a multicast route for 232.0.0.1-239.255.255.254 sudo route add -net 232.0.0.0/5 192.168.1.3
Please google for more information.
如果机器上有多个网络接口(也有可能是在运行 VPN 的情况下),那么 Ignite 很有可能是使用了错误的网络接口。
为了确保 Ignite 使用正确的网络接口,在配置文件中将 IgniteConfiguration
设置为指定IP地址。 例如:
<bean class="org.apache.ignite.configuration.IgniteConfiguration"> <property name="localHost" value="192.168.1.20"/> </bean>
当运行集群模式时,需要确保 Vert.x 使用正确的网络接口。
当通过命令行模式时,可以设置 cluster-host
参数:
vertx run myverticle.js -cluster -cluster-host your-ip-address
其中 your-ip-address
必须与 Ignite 中的配置保持一致。
当通过编程模式使用 Vert.x 时,可以调用方法 setClusterHost
来设置参数
VPN 软件通常通过创建不支持组播的虚拟网络接口来进行工作。在 VPN 环境中,如果 Ignite 与 Vert.x 不正确配置的话,VPN 接口将被选择,而不是正确的接口。
所以,如果你的软件运行在 VPN 环境中,参考上述章节,设置正确的网络接口。
在一些情况下,运行环境中,无法开启组播。在这种情况下,需要配置合适的 IP finder
。TCP sockets 发现器 TcpDiscoveryVmIpFinder
,或者 Amazon S3 发现器 TcpDiscoveryS3IpFinder
。
具体 Ignite 集群配置,可以参考文档 Ignite Clustering 。
在排除故障时,开启 Ignite 日志,将会给予很大的帮助。在 classpath
中添加 vertx-default-jul-logging.properties
文件(默认的JUL记录时),这是一个标准 java.util.loging(JUL) 配置文件。具体配置如下:
org.apache.ignite.level=INFO
或者
java.util.logging.ConsoleHandler.level=INFO java.util.logging.FileHandler.level=INFO