Ignite Cluster Manager

翻译:Ranger Tsao,校对 宋子豪、赵亮

IgniteClusterManager 是基于 Apache Ignite 实现。由于 Vert.x 集群管理的可插拔性,也可轻易切换至其它的集群管理器。

Vert.x 集群管理器包含以下几个功能:

  1. 发现并管理集群中的节点
  2. 管理集群端的主题订阅清单(这样就可以轻松得知集群中的那些节点订阅了那些 EventBus 地址)
  3. 分布式 Map 支持
  4. 分布式锁
  5. 分布式计数器

注意事项
Vert.x 集群器并不处理节点之间的通信,在 Vert.x 中节点中的通信是直接由 TCP 链接处理的。

使用 Ignite cluster manager

Vert.x 能够从 classpath 路径的 jar 自动检测并使用出 ClusterManager 的实现。不过需要确保在 classpath 没有其他的 ClusterManager 实现。

另外 Vert.x 可以通过设置 -Dvertx.clusterManagerFactory=io.vertx.spi.cluster.ignite.IgniteClusterManager 来使用指定的 集群管理器实现。

通过命令行使用

确保 vertx-ignite-3.4.1.jar 在 Vert.x 的安装路径中的 lib 目录下。

通过 Maven 或 Gradle 构建工具使用

  • Maven(pom.xml)
  1. <dependency>
  2. <groupId>io.vertx</groupId>
  3. <artifactId>vertx-ignite</artifactId>
  4. <version>3.4.1</version>
  5. </dependency>
  • Gradle(gradle.xml)
  1. compile 'io.vertx:vertx-ignite:3.4.1'

编程形式调用

通过编码的形式,设置集群管理器实现,例子:

  1. ClusterManager clusterManager = new IgniteClusterManager();//创建 Ignite 集群管理器
  2. VertxOptions options = new VertxOptions().setClusterManager(clusterManager);//设置集群管理器实现
  3. Vertx.clusteredVertx(options, res -> {
  4. if (res.succeeded()) {
  5. Vertx vertx = res.result();
  6. } else {
  7. // failed!
  8. }
  9. });

配置 Ignite cluster manager

使用配置文件

vertx-ignite jar 中内嵌了一个默认配置文件 default-ignite.xml
如果需要覆盖此配置文件,需要在 classpath 路径中添加 ignite.xml

default-ignite.xmlignite.xml 必须是一个 Apache Ignite 配置文件,在 Apache Ignite 的官方中文文档中,可以找到具体的配置描述。

编程配置

  1. IgniteConfiguration cfg = new IgniteConfiguration();
  2. // 配置 Ignite ,此处省略配置代码
  3. ClusterManager clusterManager = new IgniteClusterManager(cfg);
  4. VertxOptions options = new VertxOptions().setClusterManager(clusterManager);
  5. Vertx.clusteredVertx(options, res -> {
  6. if (res.succeeded()) {
  7. Vertx vertx = res.result();
  8. } else {
  9. // failed!
  10. }
  11. });

自动发现及网络传输配置

在默认配置中使用 TcpDiscoveryMulticastIpFinder 实现,这网络发现实现,需要开启组播。如果组播被禁用,可以采用 TcpDiscoveryVmIpFinder 替代,前提是在 ignite.xml 事先配置好 IP 地址列表。具体 Ignite 集群配置,可以参考文档 Apache Ignite

故障排除

组播未正常开启

MacOS 默认禁用组播。Google一下启用组播。

使用错误的网络接口

如果机器上有多个网络接口(也有可能是在运行 VPN 的情况下),那么 Ignite 很有可能是使用了错误的网络接口。

为了确保 Ignite 使用正确的网络接口,在配置文件中将 IgniteConfiguration 设置为指定IP地址。 例如:

  1. <bean class="org.apache.ignite.configuration.IgniteConfiguration">
  2. <property name="localHost" value="192.168.1.20"/>
  3. </bean>

当运行集群模式时,需要确保 Vert.x 使用正确的网络接口。当通过命令行模式时,可以设置 cluster-host 参数:

  1. vertx run myverticle.js -cluster -cluster-host your-ip-address

其中 your-ip-address 必须与 Ignite 中的配置保持一致。

当通过编程模式使用 Vert.x 时,可以调用方法 setClusterHost 来设置参数

使用VPN

VPN 软件通常通过创建不支持组播的虚拟网络接口来进行工作。在 VPN 环境中,如果 Ignite 与 Vert.x 不正确配置的话,VPN 接口将被选择,而不是正确的接口。

所以,如果你的软件运行在 VPN 环境中,参考上述章节,设置正确的网络接口。

组播被禁用

在一些情况下,运行环境中,无法开启组播。在这种情况下,需要配置合适的 IP finder。TCP sockets 发现器 TcpDiscoveryVmIpFinder ,或者 Amazon S3 发现器 TcpDiscoveryS3IpFinder

具体 Ignite 集群配置,可以参考文档 Apache Ignite

开启日志

在排除故障时,开启 Ignite 日志,将会给予很大的帮助。在 classpath 中添加 vertx-default-jul-logging.properties 文件(默认的JUL记录时),这是一个标准 java.util.loging(JUL) 配置文件。具体配置如下:

  1. org.apache.ignite.level=INFO
  2. java.util.logging.ConsoleHandler.level=INFO
  3. java.util.logging.FileHandler.level=INFO