[关闭]
@liyuj 2017-04-07T22:03:30.000000Z 字数 16162 阅读 5933

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

14.部署

14.1.部署

Ignite对部署没有要求,可以非常容易地部署到私有主机或者任意的云环境,比如,Ignite可以独立部署,也可以部署在Kubernetes或者Docker容器中,还有Apache Mesos以及Hadoop Yarn。它可以运行在物理主机中,也可以部署在虚拟机中。

14.2.Docker部署

Docker可以将Ignite应用及其所有的依赖打包进一个标准的容器,Docker会自动下载Ignite发布版,将代码部署进Ignite以及配置节点,他还可以自动启动配置好的Ignite节点,这样的集成方式,使得通过简单地重启Ignite的Docker容器就可以部署新的代码。

14.2.1.启动Ignite Docker容器

要运行Docker容器,需要拉取然后启动一个Docker映像,默认会下载最新的版本,但是在这里可以看到一个完整的清单。
可以使用如下的命令拉取Ignite docker映像:

  1. # Pull latest version.
  2. sudo docker pull apacheignite/ignite
  3. # Pull ignite version {ignite-version}
  4. sudo docker pull apacheignite/ignite:{ignite-version}

可以使用docker run来运行Ignite docker容器:

  1. # Run latest version.
  2. sudo docker run -it --net=host
  3. -e "CONFIG_URI=$CONFIG_URI"
  4. [-e "OPTION_LIBS=$OPTION_LIBS"]
  5. [-e "JVM_OPTS=$JVM_OPTS"]
  6. ...
  7. apacheignite/ignite
  8. # Run ignite version {ignite-version}
  9. sudo docker run -it --net=host
  10. -e "CONFIG_URI=$CONFIG_URI"
  11. [-e "OPTION_LIBS=$OPTION_LIBS"]
  12. [-e "JVM_OPTS=$JVM_OPTS"]
  13. ...
  14. apacheignite/ignite:{ignite-version}

下面的配置参数在docker容器中可以通过环境变量进行传递:

名称 描述 默认 示例
CONFIG_URI Ignite配置文件的URL(也可以相对于类路径的META-INF文件夹),下载的配置文件会保存于./ignite-config.xml https://raw.githubusercontent.com/apache/ignite/ master/examples/config/example-cache.xml
OPTION_LIBS 会被包含在类路径中的可选库 ignite-log4j, ignite-spring,ignite-indexing ignite-aws,ignite-aop
JVM_OPTS 通过docker命令传递给ignite实例的环境变量。 -Xms1g -Xmx1g -server -XX:+AggressiveOpts -XX:MaxPermSize=256m
EXTERNAL_LIBS 库文件URL列表 http://central.maven.org/maven2/io/undertow/undertow-servlet/1.3.10.Final/undertow-servlet-1.3.10.Final.jar,http://central.maven.org/maven2/io/undertow/undertow-build-config/1.0.0.Beta24/undertow-build-config-1.0.0.Beta24.jar

14.2.2.示例

要启动Ignite的docker容器,可以使用如下的命令:

  1. sudo docker run -it --net=host -e "IGNITE_CONFIG=https://raw.githubusercontent.com/apache/ignite/master/examples/config/example-cache.xml" apacheignite/ignite

之后应该看到如下的输出日志:

14.3.AWS部署

Ignite的AMI(Amazon机器映像)可以通过AWS的EC2管理控制台配置一个简单的Ignite集群,通过AMI进行安装,可以快速地部署一个Ignite集群。

14.3.1.Amazon EC2部署

区域 映像
US-WEST ami-9cdbb3fc
US-EAST ami-ce82caa4
EU-CENTRAL ami-191b0775

或者,也可以使用Apache Ignite关键字在Community AMIs中搜索映像:

- 选择一个Instance Type;
- 打开Configure Instance并且展开Advanced Details;
- 添加下面的任意配置参数;

名称 描述 默认 示例
CONFIG_URI Ignite配置文件的URL(也可以相对于类路径的META-INF文件夹),下载的配置文件会保存于./ignite-config.xml https://raw.githubusercontent.com/apache/ignite/ master/examples/config/example-cache.xml
OPTION_LIBS 会被包含在类路径中的可选库 ignite-log4j, ignite-spring,ignite-indexing ignite-aws,ignite-aop
JVM_OPTS 通过docker命令传递给ignite实例的环境变量。 -Xms1g -Xmx1g -server -XX:+AggressiveOpts -XX:MaxPermSize=256m
EXTERNAL_LIBS 库文件URL列表 http://central.maven.org/maven2/io/undertow/undertow-servlet/1.3.10.Final/undertow-servlet-1.3.10.Final.jar,http://central.maven.org/maven2/io/undertow/undertow-build-config/1.0.0.Beta24/undertow-build-config-1.0.0.Beta24.jar
IGNITE_VERSION Ignite的版本 latest 1.7.0

如下图所示:

首选Ignite版本
IGNITE_VERSION属性可以视具体情况而定。

  1. sudo docker ps
  1. sudo docker logs -f CONTAINER_ID
  1. sudo docker exec -it container_id /bin/bash

14.4.Google计算部署

Ignite的映像可以通过Google计算控制台配置一个简单的Ignite集群,通过映像进行安装,可以快速地部署一个Ignite集群。

14.4.1.Google计算部署

  1. gcloud compute images create ignite-image \
  2. --source-uri gs://ignite-media/ignite-google-image.tar.gz

要了解更多信息,可以参照cloud.google.com

名称 描述 默认 示例
CONFIG_URI Ignite配置文件的URL(也可以相对于类路径的META-INF文件夹),下载的配置文件会保存于./ignite-config.xml https://raw.githubusercontent.com/apache/ignite/ master/examples/config/example-cache.xml
OPTION_LIBS 会被包含在类路径中的可选库 ignite-log4j, ignite-spring,ignite-indexing ignite-aws,ignite-aop
JVM_OPTS 通过docker命令传递给ignite实例的环境变量。 -Xms1g -Xmx1g -server -XX:+AggressiveOpts -XX:MaxPermSize=256m
EXTERNAL_LIBS 库文件URL列表 http://central.maven.org/maven2/io/undertow/undertow-servlet/1.3.10.Final/undertow-servlet-1.3.10.Final.jar,http://central.maven.org/maven2/io/undertow/undertow-build-config/1.0.0.Beta24/undertow-build-config-1.0.0.Beta24.jar
IGNITE_VERSION Ignite的版本 latest 1.7.0

如下图所示:

首选Ignite版本
IGNITE_VERSION属性可以视具体情况而定。

  1. sudo docker ps
  1. sudo docker logs -f CONTAINER_ID
  1. sudo docker exec -it container_id /bin/bash

14.5.Mesos部署

14.5.1.摘要

Apache Ignite支持在Mesos集群上调度和运行Ignite节点。
Apache Mesos是一个集群管理器,他提供了一个通用运行环境以及所有的必要资源来部署、运行和管理分布式应用。他对资源的管理和隔离有助于充分利用服务器资源。
要了解Apache Mesos的更多信息,请参照:http://mesos.apache.org/

14.5.2.Ignite Mesos框架

常规部署Apache Ignite集群需要下载Apache Ignite发行版,修改配置参数以及启动节点。Apache Ignite Mesos框架由调度器任务组成,可以极大地简化集群的部署。

14.5.3.运行Ignite Mesos框架

要运行Ignite Mesos框架需要配置好的正在运行的Apache Mesos集群,如果需要如何Apache Mesos集群的信息,请参照:https://docs.mesosphere.com/getting-started/datacenter/install/

确保主节点和从节点监听正确的IP地址,否则无法保证Mesos集群能正常工作。

通过Marathon运行框架
当前建议的做法是通过Marathon运行框架。

  1. {
  2. "id": "ignition",
  3. "instances": 1,
  4. "cpus": 2,
  5. "mem": 2048,
  6. "ports": [0],
  7. "uris": [
  8. "http://host/ignite-mesos-<ignite-version>-jar-with-dependencies.jar"
  9. ],
  10. "env": {
  11. "IGNITE_NODE_COUNT": "4",
  12. "MESOS_MASTER_URL": "zk://localhost:2181/mesos",
  13. "IGNITE_RUN_CPU_PER_NODE": "2",
  14. "IGNITE_MEMORY_PER_NODE": "2048",
  15. "IGNITE_VERSION": "1.0.5"
  16. },
  17. "cmd": "java -jar ignite-mesos-<ignite-version>-jar-with-dependencies.jar"
  18. }
  1. curl -X POST -H "Content-type: application/json" --data-binary @marathon.json http://<marathon-ip>:8080/v2/apps/
  1. # The number of nodes in the cluster.
  2. IGNITE_NODE_COUNT=1
  3. # Mesos ZooKeeper URL to locate leading master.
  4. MESOS_MASTER_URL=zk://localhost:2181/mesos
  5. # The number of CPU Cores for each Apache Ignite node.
  6. IGNITE_RUN_CPU_PER_NODE=4
  7. # The number of Megabytes of RAM for each Apache Ignite node.
  8. IGNITE_MEMORY_PER_NODE=4096
  9. # The version ignite which will be run on nodes.
  10. IGNITE_VERSION=1.7.0

14.5.4.配置

所有配置都是通过环境变量或者配置文件处理的(这非常适用于简化marathon的配置以运行框架),下面的配置参数可以根据需要进行配置:

名称 描述 默认值 示例
IGNITE_RUN_CPU_PER_NODE 每个Ignite节点的CPU核数 没有限制 2
IGNITE_MEMORY_PER_NODE 每个节点的内存数量(M) 没有限制 1024
IGNITE_DISK_SPACE_PER_NODE 每个节点占用的磁盘容量(M) 1024 2048
IGNITE_NODE_COUNT 集群内的节点数量 5 10
IGNITE_TOTAL_CPU Ignite集群的CPU核数 没有限制 5
IGNITE_TOTAL_MEMORY Ignite集群占用的内存(M) 没有限制
IGNITE_TOTAL_DISK_SPACE Ignite集群占用的磁盘空间(M) 没有限制 5120
IGNITE_MIN_CPU_PER_NODE 要运行Ignite节点所需的CPU核数的最小值 1 4
IGNITE_MIN_MEMORY_PER_NODE 要运行Ignite节点所需的内存的最小值(M) 256 1024
IGNITE_VERSION 节点要运行的Ignite的版本 latest 1.6.0
IGNITE_WORK_DIR 保存Ignite发行版的 ignite-release /opt/ignite/
IGNITE_XML_CONFIG Apache Ignite配置文件的路径 /opt/ignite/ignite-config.xml
IGNITE_CONFIG_XML_URL Apache Ignite配置文件的URL https://example.com/default-config.xml
IGNITE_USERS_LIBS 要添加到类路径的库文件的路径 /opt/libs/
IGNITE_USERS_LIBS_URL 要添加到类路径的库文件的URL列表,逗号分割 https://example.com/lib.zip,https://example.com/lib1.zip
MESOS_MASTER_URL 要定位主节点的Mesos Zookeeper的URL zk://localhost:2181/mesos zk://176.0.1.45:2181/mesos or 176.0.1.45:2181
IGNITE_PACKAGE_URL Ignite的压缩包URL,这个参数可以用于替换IGNITE_VERSION参数。 http://apache-mirror.rbc.ru/pub/apache//ignite/1.7.0/apache-ignite-1.7.0-src.zip
IGNITE_PACKAGE_PATH Ignite的压缩包路径,这个参数在访问因特网受限时是有用的。 /opt/ignite/apache-ignite-fabric-1.6.0-bin.zip
IGNITE_HTTP_SERVER_IDLE_TIMEOUT 设置一个HTTP连接的最大空闲时间(毫秒),jetty服务器会使用,服务器提供了ignite的mesos框架所需的资源,比如ignite压缩包,用户的库文件,配置等。 30000 30000

14.6.Yarn部署

14.6.1.摘要

与Yarn的集成可以支持在Yarn集群上调度和运行Apache Ignite节点。
Yarn是一个资源管理器,他提供了一个包括所有必要资源的通用的运行环境来进行分布式应用的部署,运行和管理,他对资源的管理和隔离有助于充分利用服务器资源。
要了解Yarn的信息,请参照http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html

14.6.2.Ignite Yarn应用

部署Apache Ignite集群的典型步骤是下载Ignite的发行版,修改配置文件以及启动节点。与Yarn的集成可以避免这些操作,Ignite Yarn应用可以极大的简化集群的部署,它由如下组件组成:

14.6.3.运行Ignite Yarn应用

要运行Ignite应用,需要配置和运行Yarn和Hadoop集群,要了解如何配置集群的信息,可以参照: http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/ClusterSetup.html.

  1. # The number of nodes in the cluster.
  2. IGNITE_NODE_COUNT=2
  3. # The number of CPU Cores for each Apache Ignite node.
  4. IGNITE_RUN_CPU_PER_NODE=1
  5. # The number of Megabytes of RAM for each Apache Ignite node.
  6. IGNITE_MEMORY_PER_NODE=2048
  7. # The version ignite which will be run on nodes.
  8. IGNITE_VERSION=1.0.6
  1. hadoop java jar ignite-yarn-<ignite-version>.jar ./ignite-yarn-<ignite-version>.jar cluster.properties

14.6.4.配置

所有的配置都是通过环境变量和属性文件进行的,下面的配置参数可以根据需要进行配置:

名称 描述 默认值
IGNITE_XML_CONFIG 指向Apache Ignite配置文件的HDFS路径
IGNITE_WORK_DIR 用于保存Ignition发行版的目录 ./ignite-release
IGNITE_RELEASES_DIR 保存Ignite发行版的HDFS路径 /ignite/releases/
IGNITE_USERS_LIBS 要添加到CLASSPATH的库文件的HDFS路径
IGNITE_MEMORY_PER_NODE 每个Ignite节点占用的内存的大小(M),这个是Java堆的大小。 2048
IGNITE_MEMORY_OVERHEAD_PER_NODE 分配用于处理JVM原生日常管理、内部字符串等的内存量,但是如果用的话也包括堆外内存。YARN用于容器运行Ignite节点的必要内存量是IGNITE_MEMORY_PER_NODE和IGNITE_MEMORY_OVERHEAD_PER_NODE之和。 IGNITE_MEMORY_PER_NODE * 0.10,最小值
IGNITE_HOSTNAME_CONSTRAINT 从节点约束
IGNITE_NODE_COUNT 集群节点的数量 3
IGNITE_RUN_CPU_PER_NODE 每个Ignite节点的CPU核数 2
IGNITE_VERSION 节点上运行的Ignite版本 latest
IGNITE_PATH 到Ignite构建的hdfs路径,当yarn集群运行在内网无法访问互联网时,这个属性很有用。

14.7.Kubernetes部署

14.7.1.摘要

Ignite集群可以非常容易地通过Kubernetes来进行部署和维护,Kubernetes是一个开源的软件,它可以对容器化的应用进行自动化地部署、伸缩以及管理。
本章节会说明如何将Ignite集群部署到Kubernetes环境中。

14.7.2.Kubernetes IP搜索器

在Kubernetes中,要启用Ignite节点的自动发现,需要在IgniteConfiguration中启用TcpDiscoveryKubernetesIpFinder,下面会创建一个名为example-kube.xml的配置文件示例,然后定义IP搜索器配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:util="http://www.springframework.org/schema/util"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/util
  9. http://www.springframework.org/schema/util/spring-util.xsd">
  10. <bean id="ignite.cfg"
  11. class="org.apache.ignite.configuration.IgniteConfiguration">
  12. <property name="discoverySpi">
  13. <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
  14. <property name="ipFinder">
  15. <bean
  16. class="org.apache.ignite.spi.discovery.tcp.ipfinder.kubernetes.TcpDiscoveryKubernetesIpFinder">
  17. </bean>
  18. </property>
  19. </bean>
  20. </property>
  21. </bean>
  22. </beans>

14.7.3.Kubernetes的Ignite检索服务

Ignite的KubernetesIPFinder,需要配置和部署一个特定的Kubernetes服务,由它来维护所有有效的Ignite容器组(pod,意译为容器组)的IP地址列表。
每当一个新容器组启动时,IP搜索器会通过Kubernetes的API接入服务,来获取其余已有Ignite容器组的地址列表,使用这些地址,新的节点会发现其他的集群节点,然后最终加入集群。
按照下面的方式可以配置该服务:
ignite-service.yaml:

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

然后使用如下的命令将其部署到Kubernetes中:

  1. kubectl create -f ignite-service.yaml

确保服务已经启动运行:

  1. kubectl get svc ignite

输出大概像下面这样:

  1. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  2. ignite None <none> 9042/TCP 29s

14.7.4.共享Ignite的集群配置

在使用Ignite的docker映像在Kubernetes中部署Ignite容器组之前,需要找到一种方式,即如何将example-kube.xml(前面已经准备好)传递给docker映像。
可以使用好几种方法,下面,会说明如何通过一个共享的KubernetesPersistentVolume来共享Ignite的集群配置。

通过HTTP服务器来共享配置
在Microsoft的Azure的Kubernetes中部署Ignite这篇文章说明了如何通过HTTP服务器来共享Ignite的集群配置。

假定有名为/data/ignite的共享目录,这个目录任意Ignite容器组都可以访问,然后将example-kube.xml拷贝到这里。
创建一个实际存储支持的PersistentVolume配置,然后转到/data/ignite目录。
ignite-volume.yaml:

  1. kind: PersistentVolume
  2. apiVersion: v1
  3. metadata:
  4. name: ignite-volume
  5. labels:
  6. type: local
  7. spec:
  8. capacity:
  9. storage: 1Gi
  10. accessModes:
  11. - ReadWriteOnce
  12. hostPath:
  13. path: "/data/ignite"

使用下面的命令部署这个卷:

  1. kubectl create -f ignite-volume.yaml

检查该卷部署成功并且可以使用:

  1. kubectl get pv ignite-volume

输出大致如下:

  1. NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
  2. ignite-volume 1Gi RWO Retain Available 3m

最后,创建一个PersistentVolumeClaim,他会自动化地绑定到上面初始化的PersistentVolume
ignite-volume-claim.yaml:

  1. kind: PersistentVolumeClaim
  2. apiVersion: v1
  3. metadata:
  4. name: ignite-volume-claim
  5. spec:
  6. accessModes:
  7. - ReadWriteOnce
  8. resources:
  9. requests:
  10. storage: 1Gi

使用下面的配置创建PersistentVolumeClaim:

  1. kubectl create -f ignite-volume-claim.yaml

确保PersistentVolumeClaim已经创建,并且已经绑定到存储example-kube.xml配置的PersistentVolume

  1. kubectl get pvc ignite-volume-claim
  2. NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
  3. ignite-volume-claim Bound ignite-volume 1Gi RWO 2m
  4. kubectl get pv ignite-volume
  5. NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM REASON AGE
  6. ignite-volume 1Gi RWO Retain Bound default/ignite-volume-claim 13m

现在,就到了为Ignite容器组准备一个Kubernetes部署配置然后进行部署的时候了。

14.7.5.Ignite容器组部署

最后,需要为Ignite容器组定义一个YAML配置。
ignite-deployment.yaml:

  1. # An example of a Kubernetes configuration for Ignite pods deployment.
  2. apiVersion: extensions/v1beta1
  3. kind: Deployment
  4. metadata:
  5. # Custom Ignite cluster's name.
  6. name: ignite-cluster
  7. spec:
  8. # A number of Ignite pods to be started by Kubernetes initially.
  9. replicas: 2
  10. template:
  11. metadata:
  12. labels:
  13. # This label has to be added to the selector's section of
  14. # ignite-service.yaml so that the Kubernetes Ignite lookup service
  15. # can easily track all Ignite pods available deployed so far.
  16. app: ignite
  17. spec:
  18. volumes:
  19. # Custom name for the storage that holds Ignite's configuration
  20. # which is example-kube.xml.
  21. - name: ignite-storage
  22. persistentVolumeClaim:
  23. # Must be equal to the PersistentVolumeClaim created before.
  24. claimName: ignite-volume-claim
  25. containers:
  26. # Custom Ignite pod name.
  27. - name: ignite-node
  28. # Ignite Docker image. Kubernetes IP finder is supported starting from
  29. # Apache Ignite 1.9.0
  30. image: apacheignite/ignite:1.9.0
  31. env:
  32. # Ignite's Docker image parameter. Adding the jar file that
  33. # contain TcpDiscoveryKubernetesIpFinder implementation.
  34. - name: OPTION_LIBS
  35. value: ignite-kubernetes
  36. # Ignite's Docker image parameter. Passing the Ignite configuration
  37. # to use for an Ignite pod.
  38. - name: CONFIG_URI
  39. value: file:////data/ignite/example-kube.xml
  40. ports:
  41. # Ports to open.
  42. # Might be optional depending on your Kubernetes environment.
  43. - containerPort: 11211 # REST port number.
  44. - containerPort: 47100 # communication SPI port number.
  45. - containerPort: 47500 # discovery SPI port number.
  46. - containerPort: 49112 # JMX port number.
  47. volumeMounts:
  48. # Mounting the storage with the Ignite configuration.
  49. - mountPath: "/data/ignite"
  50. name: ignite-storage

如上所示,这个配置定义了一组环境变量(OPTION_LIBSCONFIG_URIL),它们会被Ignite的docker映像使用的特定脚本所处理,docker映像的完整配置参数列表在docker部署的相关章节有描述。

Ignite docker映像版本
Ignite的1.9.0及其后续版本才支持Kubernetes,因此要确保使用可用版本的docker映像,这里可以看到完整的标签列表。
通过HTTP共享Ignite配置
如果不方便通过PersistentVolumeClaim共享Ignite配置,也可以将其上传到一个HTTP服务器,然后将其地址配置为CONFIG_URI参数的值。

下一步,使用上面的配置将Ignite容器组部署到Kubernetes中:

  1. kubectl create -f ignite-deployment.yaml

检查Ignite容器组是否已经启动运行

  1. kubectl get pods

选择一个可用的容器组名称:

  1. NAME READY STATUS RESTARTS AGE
  2. ignite-cluster-3454482164-d4m6g 1/1 Running 0 25m
  3. ignite-cluster-3454482164-w0xtx 1/1 Running 0 25m

然后从中获取日志,确保这两个容器组可以互相发现对方。

  1. kubectl logs ignite-cluster-3454482164-d4m6g

14.7.6.调整Ignite集群大小

使用标准的Kubernetes API可以在运行中调整Ignite集群的大小,比如,如果希望扩充集群,从2个到5个节点,那么可以使用如下的命令:

  1. kubectl scale --replicas=5 -f ignite-deployment.yaml

再次确认集群已经扩展成功:

  1. kubectl get pods

输出会显示已经有5个容器组正在运行:

  1. NAME READY STATUS RESTARTS AGE
  2. ignite-cluster-3454482164-d4m6g 1/1 Running 0 34m
  3. ignite-cluster-3454482164-ktkrr 1/1 Running 0 58s
  4. ignite-cluster-3454482164-r20f8 1/1 Running 0 58s
  5. ignite-cluster-3454482164-vf8kh 1/1 Running 0 58s
  6. ignite-cluster-3454482164-w0xtx 1/1 Running 0 34m
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注