[关闭]
@liyuj 2018-01-27T16:45:38.000000Z 字数 7563 阅读 3925

Apache-Ignite-2.3.0-中文开发手册

2.集群发现

2.1.Amazon AWS发现

2.1.1.摘要

AWS云上的节点发现通常认为很有挑战性。Amazon EC2,和其他大部分的虚拟环境一样,有如下的限制:

虽然在没有组播时可以使用基于TCP的发现,但是不得不处理不断变换的IP地址以及不断更新配置。这产生了一个主要的不便之处以至于在这种环境下基于静态IP的配置实质上变得不可用。

2.1.2.基于Amazon S3的发现

为了减轻不断变化的IP地址的问题,Ignite支持通过使用基于TcpDiscoveryS3IpFinder的S3存储来实现节点的自动发现。在启动时节点在Amazon S3存储上注册他们的IP地址,这样其他节点会试图连接任意存储在S3上的IP地址然后初始化网格节点的自动发现。

这个方法可以只配置一次就可以在所有的EC2实例上复用。
下面的例子显示了如何配置基于Amazon S3的IP搜索器:

XML:

  1. <bean class="org.apache.ignite.configuration.IgniteConfiguration">
  2. ...
  3. <property name="discoverySpi">
  4. <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
  5. <property name="ipFinder">
  6. <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.s3.TcpDiscoveryS3IpFinder">
  7. <property name="awsCredentials" ref="aws.creds"/>
  8. <property name="bucketName" value="YOUR_BUCKET_NAME"/>
  9. </bean>
  10. </property>
  11. </bean>
  12. </property>
  13. </bean>
  14. <!-- AWS credentials. Provide your access key ID and secret access key. -->
  15. <bean id="aws.creds" class="com.amazonaws.auth.BasicAWSCredentials">
  16. <constructor-arg value="YOUR_ACCESS_KEY_ID" />
  17. <constructor-arg value="YOUR_SECRET_ACCESS_KEY" />
  18. </bean>

Java:

  1. TcpDiscoverySpi spi = new TcpDiscoverySpi();
  2. BasicAWSCredentials creds = new BasicAWSCredentials("yourAccessKey", "yourSecreteKey");
  3. TcpDiscoveryS3IpFinder ipFinder = new TcpDiscoveryS3IpFinder();
  4. ipFinder.setAwsCredentials(creds);
  5. spi.setIpFinder(ipFinder);
  6. IgniteConfiguration cfg = new IgniteConfiguration();
  7. // Override default discovery SPI.
  8. cfg.setDiscoverySpi(spi);
  9. // Start Ignite node.
  10. Ignition.start(cfg);

2.2.Google计算发现

2.2.1.摘要

GCE上的节点发现通常认为很有挑战性。Google云,和其他大部分的虚拟环境一样,有如下的限制:

虽然在没有组播时可以使用基于TCP的发现,但是不得不处理不断变换的IP地址以及不断更新配置。这产生了一个主要的不便之处以至于在这种环境下基于静态IP的配置实质上变得不可用。

2.2.2.基于Google云存储的发现

为了减轻不断变化的IP地址的问题,Ignite支持通过使用基于TcpDiscoveryGoogleStorageIpFinder的Google云存储来实现节点的自动发现。在启动时节点在存储上注册他们的IP地址,这样其他节点会试图连接任意保存在存储上的IP地址然后初始化网格节点的自动发现。

这个方法可以只配置一次就可以在所有的EC2实例上复用。

下面的例子显示了如何配置基于Google云存储的IP搜索器:
XML:

  1. <bean class="org.apache.ignite.configuration.IgniteConfiguration">
  2. ...
  3. <property name="discoverySpi">
  4. <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
  5. <property name="ipFinder">
  6. <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.gce.TcpDiscoveryGoogleStorageIpFinder">
  7. <property name="projectName" ref="YOUR_GOOGLE_PLATFORM_PROJECT_NAME"/>
  8. <property name="bucketName" value="YOUR_BUCKET_NAME"/>
  9. <property name="serviceAccountId" value="YOUR_SERVICE_ACCOUNT_ID"/>
  10. <property name="serviceAccountP12FilePath" value="PATH_TO_YOUR_PKCS12_KEY"/>
  11. </bean>
  12. </property>
  13. </bean>
  14. </property>
  15. </bean>

Java:

  1. TcpDiscoverySpi spi = new TcpDiscoverySpi();
  2. TcpDiscoveryGoogleStorageIpFinder ipFinder = new TcpDiscoveryGoogleStorageIpFinder();
  3. ipFinder.setServiceAccountId(yourServiceAccountId);
  4. ipFinder.setServiceAccountP12FilePath(pathToYourP12Key);
  5. ipFinder.setProjectName(yourGoogleClourPlatformProjectName);
  6. // Bucket name must be unique across the whole Google Cloud Platform.
  7. ipFinder.setBucketName("your_bucket_name");
  8. spi.setIpFinder(ipFinder);
  9. IgniteConfiguration cfg = new IgniteConfiguration();
  10. // Override default discovery SPI.
  11. cfg.setDiscoverySpi(spi);
  12. // Start Ignite node.
  13. Ignition.start(cfg);

2.3.JCloud发现

2.3.1.摘要

云平台上的节点发现通常认为很有挑战性。因为JCloud,和其他大部分的虚拟环境一样,有如下的限制:

虽然在没有组播时可以使用基于TCP的发现,但是不得不处理不断变换的IP地址以及不断更新配置。这产生了一个主要的不便之处以至于在这种环境下基于静态IP的配置实质上变得不可用。

2.3.2.基于Apache JCloud的发现

为了减轻不断变化的IP地址的问题,Ignite支持通过使用基于TcpDiscoveryCloudIpFinder的Apache jclouds工具包来实现节点的自动发现。要了解有关Apache JCloud的信息,请参照jclouds.apache.org
该IP搜索器形成节点地址,通过获取云上所有虚拟机的私有和共有IP地址以及给他们增加一个端口号使Ignite可以运行,该端口可以通过TcpDiscoverySpi.setLocalPort(int)或者TcpDiscoverySpi.DFLT_PORT进行设置,这样所有节点会连接任何生成的的IP地址然后初始化网格节点的自动发现。
可以参考Apache jclouds providers section来获取他支持的云平台的列表。

所有虚拟机都要使用同一个端口启动Ignite实例,否则他们无法通过IP搜索器发现对方。

下面的例子显示了如何配置基于Apache JCloud的IP搜索器:
XML:

  1. <bean class="org.apache.ignite.configuration.IgniteConfiguration">
  2. ...
  3. <property name="discoverySpi">
  4. <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
  5. <property name="ipFinder">
  6. <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.cloud.TcpDiscoveryCloudIpFinder">
  7. <!-- Configuration for Google Compute Engine. -->
  8. <property name="provider" value="google-compute-engine"/>
  9. <property name="identity" value="YOUR_SERVICE_ACCOUNT_EMAIL"/>
  10. <property name="credentialPath" value="PATH_YOUR_PEM_FILE"/>
  11. <property name="zones">
  12. <list>
  13. <value>us-central1-a</value>
  14. <value>asia-east1-a</value>
  15. </list>
  16. </property>
  17. </bean>
  18. </property>
  19. </bean>
  20. </property>
  21. </bean>

Java:

  1. TcpDiscoverySpi spi = new TcpDiscoverySpi();
  2. TcpDiscoveryCloudIpFinder ipFinder = new TcpDiscoveryCloudIpFinder();
  3. // Configuration for AWS EC2.
  4. ipFinder.setProvider("aws-ec2");
  5. ipFinder.setIdentity(yourAccountId);
  6. ipFinder.setCredential(yourAccountKey);
  7. ipFinder.setRegions(Collections.<String>emptyList().add("us-east-1"));
  8. ipFinder.setZones(Arrays.asList("us-east-1b", "us-east-1e"));
  9. spi.setIpFinder(ipFinder);
  10. IgniteConfiguration cfg = new IgniteConfiguration();
  11. // Override default discovery SPI.
  12. cfg.setDiscoverySpi(spi);
  13. // Start Ignite node.
  14. Ignition.start(cfg);

2.4.Kubernetes发现

2.4.1.摘要

以Kubernetes容器组的形式部署Ignite节点有特定的要求,即要适应Ignite节点的发现机制,很可能无法直接地使用基于组播的IP搜索器,因为组播通讯通常会被交换机拦截。然而,只要Kubernetes进行了地址的动态分配,就可以使用静态IP搜索器,然后列出所有Ignite节点的地址。
作为一个机会,Amazon AWS IP搜索器、Google计算引擎IP搜索器或者Jcloud IP搜索器可能可以满足需求,因为Kubernetes可能会被部署到这些环境中的一个。另外,一个共享文件系统或者关系数据库也可以用于Ignite节点的自动发现,但是需要单独维护数据库或者共享文件系统。
本文提供了当使用Kubernetes进行Ignite节点的容器化时,开发特定的IP搜索器的信息,通过与特定的持有所有最新的端点的Kubernetes服务进行通信,IP搜索器会自动地检索所有活动Ignite容器组的IP地址。

2.4.2.基于Kubernetes服务的发现

要在Kubernetes中启用节点的自发现,需要在配置中设定TcpDiscoveryKubernetesIpFinder,如下所示:
XML:

  1. <property name="discoverySpi">
  2. <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
  3. <property name="ipFinder">
  4. <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.kubernetes.TcpDiscoveryKubernetesIpFinder"/>
  5. </property>
  6. </bean>
  7. </property>
  8. </bean>

Java:

  1. // Configuring discovery SPI.
  2. TcpDiscoverySpi spi = new TcpDiscoverySpi();
  3. // Configuring IP finder.
  4. TcpDiscoveryKubernetesIpFinder ipFinder = new TcpDiscoveryKubernetesIpFinder();
  5. spi.setIpFinder(ipFinder);
  6. IgniteConfiguration cfg = new IgniteConfiguration();
  7. // Override default discovery SPI.
  8. cfg.setDiscoverySpi(spi);
  9. // Start Ignite node.
  10. Ignition.start(cfg);

Maven构件
如果要使用TcpDiscoveryKubernetesIpFinder的话,需要将ignite-kubernetes加入依赖。

Ignite的KubernetesIPFinder需要配置和部署一个特定的Kubernetes服务,他会维护一个所有活动Ignite容器组(节点)的IP地址列表。
每次启动一个新的Ignite容器组,IP搜索器都会通过Kubernetes的API访问服务来获得已有的Ignite容器组的地址列表,使用这些地址,新的节点就会发现其他的集群节点,然后最终加入Ignite集群。
这个服务需要手动配置,然后在部署的Ignite容器组启动之前启动,下面就是这个服务的典型配置:

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. # Name of Ignite Service used by Kubernetes IP finder for IP addresses lookup.
  5. name: ignite
  6. spec:
  7. clusterIP: None # custom value.
  8. ports:
  9. - port: 9042 # custom value.
  10. selector:
  11. # Must be equal to one of the labels set in Ignite pods'
  12. # deployement configuration.
  13. app: ignite

默认会假定服务名为ignite,如果修改了这个名字,一定确保要同时调整TcpDiscoveryKubernetesIpFinder.setServiceName(String)参数。
另外,也建议通过某种方式标记Ignite容器组,然后在服务的selector配置段中指定这个标记,比如,根据上面的配置启动的服务,就会有目的地监控标记为app: ignite的Kubernetes容器组。

在外面接入容器化的Ignite集群
TcpDiscoveryKubernetesIpFinder从设计上来说是用于Kubernetes环境内部的,这就意味着所有的Ignite节点以及与这个集群交互的应用,都需要被Kubernetes容器化。
然而,如果想要从Kubernetes外部接入Ignite集群,那么:
1. 在Ignite容器组的YAML配置中设置hostNetwork=true,这样节点就可以从外部通过TCP/IP与容器化的Ignite节点(容器组)建立连接。
2. 为在Kubernetes环境外部的节点使用同一个TcpDiscoveryKubernetesIpFinder

2.4.3.配置参数

通常来说,TcpDiscoveryKubernetesIpFinder在设计上是可以直接用的,但是如果需要进行细粒度的控制,下面的参数也可以进行调整:

属性 描述 默认值
setServiceName(String) 设置用于Ignite容器组IP地址检索的Kubernetes服务的名字,这个服务名字必须与服务的Kubernetes配置中的名字一致。 ignite
setNamespace(String) 设置Kubernetes服务所属的命名空间。 default
setMasterUrl(String) 设置Kubernetes的API服务器的主机名。 https://kubernetes.default.svc.cluster.local:443
setAccountToken(String) 设置服务标记文件的路径。 /var/run/secrets/kubernetes.io/serviceaccount/token
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注