本文环境

  1. Apache ignite 2.8.0
  2. jdk 1.8.0_241

一、集群发现

1.1 基于静态ip集群

可采用xml或java两种方式配置。

xml配置方式:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">

        <!-- 开启对等类加载 -->
	<property name="peerClassLoadingEnabled" value="true" />
        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <!-- 配置静态ip -->
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
                        <property name="addresses">
                            <list>
                                <!-- 集群主机列表 -->
                                <value>127.0.0.1:47500..47509</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
</beans>

java配置方式:

TcpDiscoverySpi spi = new TcpDiscoverySpi();
TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
// Set initial IP addresses.
// Note that you can optionally specify a port or a port range.
        ipFinder.setAddresses(Arrays.asList("127.0.0.1:47500..47509"));
spi.setIpFinder(ipFinder);
IgniteConfiguration cfg = new IgniteConfiguration();
// Override default discovery SPI.
cfg.setDiscoverySpi(spi);
// 配置对等类
cfg.setPeerClassLoadingEnabled(true);

Ignite ignite = Ignition.start(cfg);

1.2 基于组播集群

可采用xml或java两种方式配置。

  1. 集群节点配置同样的组播地址即可;
  2. 关于组播地址的分类:
    224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
    224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;
    224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
    239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。
  3. 如果没有进行配置,TcpDiscoveryMulticastIpFinder默认组播地址为:228.1.2.4

xml配置方式:

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
  ...
  <property name="discoverySpi">
    <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
      <property name="ipFinder">
        <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
          <property name="multicastGroup" value="228.10.10.157"/>
        </bean>
      </property>
    </bean>
  </property>
</bean>

java配置方式:

TcpDiscoverySpi spi = new TcpDiscoverySpi();

TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();

ipFinder.setMulticastGroup("228.10.10.157");

spi.setIpFinder(ipFinder);

IgniteConfiguration cfg = new IgniteConfiguration();

// Override default discovery SPI.
cfg.setDiscoverySpi(spi);

// Start Ignite node.
Ignition.start(cfg);

1.3 静态IP与组播结合

可采用xml或java两种方式配置。

xml配置方式:

<bean class="org.apache.ignite.configuration.IgniteConfiguration">
  ...
  <property name="discoverySpi">
    <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
      <property name="ipFinder">
        <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
          <property name="multicastGroup" value="228.10.10.157"/>

          <!-- 静态ip列表-->
          <property name="addresses">
            <list>
              <value>1.2.3.4</value>
              <!-- IP地址和可选端口范围。还可以选择指定一个单独的端口。 -->
              <value>1.2.3.5:47500..47509</value>
            </list>
          </property>
        </bean>
      </property>
    </bean>
  </property>
</bean>

java配置方式:

TcpDiscoverySpi spi = new TcpDiscoverySpi();

TcpDiscoveryMulticastIpFinder ipFinder = new TcpDiscoveryMulticastIpFinder();

// 设置组播ip
ipFinder.setMulticastGroup("228.10.10.157");

// 设置静态IP地址。
// 注意,您可以选择指定一个端口或端口范围。
ipFinder.setAddresses(Arrays.asList("1.2.3.4", "1.2.3.5:47500..47509"));

spi.setIpFinder(ipFinder);

IgniteConfiguration cfg = new IgniteConfiguration();

//覆盖默认的发现SPI。
cfg.setDiscoverySpi(spi);

// 启动Ignite
Ignition.start(cfg);

二、配置监听端口

IgniteConfiguration cfg = new IgniteConfiguration();

TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();

// 要侦听的初始本地端口
discoverySpi.setLocalPort(48500);

// 本地端口可选范围
discoverySpi.setLocalPortRange(20);

TcpCommunicationSpi commSpi = new TcpCommunicationSpi();

// 监听其他节点的端口号
commSpi.setLocalPort(48100);

cfg.setDiscoverySpi(discoverySpi);

cfg.setCommunicationSpi(commSpi);

// Starting a node.
Ignition.start(cfg);

三、对等类

这个行为是通过对等类加载(P2P类加载)实现的,它是Ignite中的一个特别的分布式类加载器,实现了节点间的字节码交换。当对等类加载启用时,不需要在网格内的每个节点上手工地部署Java或者Scala代码,也不需要每次在发生变化时重新部署。

3.1 对等类配置

xml方式开启对等类:

        <!-- 开启对等类加载 -->
	<property name="peerClassLoadingEnabled" value="true" />

java方式开启对等类:

IgniteConfiguration cfg = new IgniteConfiguration();

cfg.setPeerClassLoadingEnabled(true);

// Start Ignite node.
Ignite ignite = Ignition.start(cfg);

3.2 工作原理

  1. Ignite会检查类是否在本地CLASSPATH中可用(是否在系统启动时加载),如果有效,就会被返回,这时不会发生从对等节点加载类的行为。
  2. 如果类在本地不可用,会向发起节点发送一个提供类定义的请求,发起节点会发送类字节码定义然后在工作节点上加载。这个过程每个类只会发生一次,即一旦一个节点上一个类定义被加载了,它就不会再次加载了。

如果不采用对等类方式,则需要显示部署jar包到各个集群节点,可以将它们拷贝进每个集群节点的libs文件夹,Ignite会在启动时自动加载所有的libs文件夹中的jar文件。