Apache Ignite(五):Ignite的集群部署与优化技巧

  Apache Ignite(五):Ignite的集群部署与优化技巧。Ignite 具有非常先进的集群能力,本文针对和集群有关的技术点做一个简短的介绍,然后针对实际应用的可能部署形式做了说明和对比,从中我们可以发现,Ignite 平台在部署的灵活性上,具有很大的优势。

  1. 相关概念

  1.1. 节点平等

  Ignite 没有 master 节点或者 server 节点,也没有 worker 节点或者 client 节点,按照 Ignite 的观点所有节点都是平等的。但是开发者可以将节点配置成 master,worker 或者 client 以及 data 节点。

  1.2. 发现机制

  Ignite 节点之间会自动感知,集群可扩展性强,不需要重启集群,简单地启动新加入的节点然后他们就会自动地加入集群。这是通过一个发现机制实现的,他使节点可以彼此发现对方,Ignite 默认使用TcpDiscoverySpi通过 TCP/IP 协议来作为节点发现的实现,也可以配置成基于多播的或者基于静态 IP 的,这些方式适用于不同的场景。

  1.3. 部署模式

  Ignite 可以独立运行,也可以在集群内运行,也可以将几个 jar 包嵌入应用内部以嵌入式的模式运行,也可以运行在 Docker 容器以及 Mesos 和 Yarn 等环境中,可以在物理机中运行,也可以在虚拟机中运行,这个广泛的适应性是他的一个很大的优势。

  1.4. 配置方式

  Ignite 的大部分配置选项,都同时支持通过基于 Spring 的 XML 配置方式以及通过 Java 代码的编程方式进行配置,这个也是个重要的优点。

  1.5. 客户端和服务端

  Ignite 中各个节点是平等的,但是可以根据需要将节点配置成客户端或者服务端,服务端节点参与缓存,计算,流式处理等等,而原生的客户端节点提供了远程连接服务端的能力。Ignite 原生客户端可以使用完整的 Ignite API,包括近缓存,事务,计算,流,服务等等。

  所有的 Ignite 节点默认都是以服务端模式启动的,客户端模式需要显式地启用,如下:

  复制代码

  

  2. 创建集群

  一个 Ignite 节点可以从命令行启动,可以用默认的配置也可以传递一个配置文件。可以启动很多的节点然后他们会自动地发现对方。

  要启动一个基于默认配置的网格节点,打开命令行然后切换到 IGNITE_HOME(安装文件夹),然后输入如下命令:

  $ bin/ignite.sh然后会看到大体如下的输出:

  复制代码

  1.[02:49:12] Ignite node started OK (id=ab5d18a6) 2.[02:49:12] Topology snapshot [ver=1, nodes=1, CPUs=8, heap=1.0GB]

  在嵌入式模式中,通过如下的代码同样可以启动一个节点:

  Ignite ignite = Ignition.start();## 3. 集群组

  从设计上讲,所有集群节点都是平等的,所以没有必要以一个特定的顺序启动任何节点,或者给他们赋予特定的规则。然而,Ignite 可以因为一些应用的特殊需求而创建集群节点的逻辑组,比如,可能希望只在远程节点上部署一个服务,或者给部分 worker 节点赋予一个叫做worker的规则来做作业的执行。比如,下面这个例子只把作业广播到远程节点(除了本地节点):

  复制代码

  final Ignite ignite = Ignition.ignite(); IgniteCluster cluster = ignite.cluster(); IgniteCompute compute = ignite.compute(cluster.forRemotes()); compute.broadcast(() -> System.out.println(” 节点 Id: ” + ignite.cluster().localNode().id()));

  Ignite 内置了很多预定义的集群组,同时还支持集群组的自定义。可以基于一些谓词定义动态集群组,这个集群组只会包含符合该谓词的节点。下面这个例子,一个集群组只会包括 CPU 利用率小于 50% 的节点,注意这个组里面的节点会随着 CPU 负载的变化而改变:

  复制代码

  IgniteCluster cluster = ignite.cluster(); ClusterGroup readyNodes = cluster.forPredicate((node) -> node.metrics().getCurrentCpuLoad() < 0.5);

  4. 集群配置

  Ignite 中,通过DiscoverySpi节点可以彼此发现对方,可以配置成基于多播的或者基于静态 IP 的。Ignite 提供了TcpDiscoverySpi作为DiscoverySpi的默认实现,它使用 TCP/IP 来作为节点发现的实现。

  对于多播被禁用的情况,TcpDiscoveryVmIpFinder会使用预配置的 IP 地址列表,只需要提供至少一个远程节点的 IP 地址即可,但是为了保证冗余一个比较好的做法是提供 2-3 个网格节点的 IP 地址。如果建立了与任何一个已提供的 IP 地址的连接,Ignite 就会自动地发现其他的所有节点。

  也可以同时使用基于多播和静态 IP 的发现,这种情况下,除了通过多播接受地址以外,TcpDiscoveryMulticastIpFinder也可以使用预配置的静态 IP 地址列表。

  下面的例子,显示的是如何通过预定义的 IP 地址列表建立集群:

  复制代码

  TcpDiscoverySpi spi = new TcpDiscoverySpi(); TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder(); // 设置预定义 IP 地址,注意端口或者端口范围是可选的。 ipFinder.setAddresses(Arrays.asList(“1.2.3.4”, “1.2.3.5:47500..47509”)); spi.setIpFinder(ipFinder); IgniteConfiguration cfg = new IgniteConfiguration(); cfg.setDiscoverySpi(spi); // 启动集群 Ignition.start(cfg);

  5. 零部署

  和计算等有关的代码可能是任意自定义的类,在 Ignite 中, 远程节点会自动感知这些类,不需要显式地将任何 jar 文件部署或者移动到任何远程节点上。这个行为是通过对等类加载(P2P 类加载)实现的,他是 Ignite 中的一个特别的分布式类加载器,实现了节点间的字节码交换。当对等类加载启用时,不需要在集群内的每个节点上手工地部署代码,也不需要每次在发生变化时重新部署。

  可以通过如下方法启用对等类加载;

  但是官方基于性能等原因的考虑,不建议在生产环境中使用对等类加载,这方面如何选择,开发者需要评估各个影响因素。

  6. 云部署

  对于很多的云环境,通常有多播被禁用以及 IP 地址不固定的限制,对于这种情况,Ignite 提供了发现的扩展机制解决了该问题,并且内置了对于常见的云服务(比如 AWS)的支持,本文不赘述,开发者可以参照相关的文档。

  7.Docker 等其他环境的部署

  对于 Docker、Mesos、Yarn 等环境,Ignite 同样支持,本文不赘述,开发者可以参照相关的文档。

  8. 部署实践

  Ignite 的部署模式非常的灵活,在实际的场景中可以针对实际需要采用不同的部署方式,下面做简单的总结和对比:

  8.1. 独立式 Ignite 集群

  这种情况下,集群的部署完全独立于应用,这个集群可以用于分布式计算,分布式缓存,分布式服务等,这时应用以客户端模式接入集群进行相关的操作,大体是如下的部署模式:

  (点击放大图像)

Apache Ignite(五)

  优点

  对已有的应用运行环境影响小,并且这个集群可以共享,为多个应用提供服务,对整个应用来说,额外增加了很多的计算和负载能力。

  缺点

  需要单独的一组机器,相对成本要高些,如果缓存操作并发不高或者计算不饱和,存在资源利用率低的情况。整体架构也变得复杂,维护成本也要高些。

  8.2. 嵌入式 Ignite 集群

  这种情况下,可以将必要的 jar 包嵌入已有应用的内部,利用 Ignite 的发现机制,自动建立集群,大体是如下的部署模式:

  (点击放大图像)

Apache Ignite(五)

  优点

  无需额外增加机器,成本最低,Ignite 可以和应用无缝集成,所有节点都为服务端节点,可以充分利用Ignite 的丰富功能。这个模式可扩展性最好,简单增加节点即可快速扩充整个系统的计算和负载能力。

  缺点

  Ignite 占用了服务器的部分资源,对应用整体性能有影响,可能需要进行有针对性的优化,应用更新时,集群可能需要重启,这时如果 Ignite 需要加载大量的数据,重启的时间可能变长,甚至无法忍受。

  8.3. 混合式 Ignite 集群

  这种情况下,将上述 2 种模式混合在一起,即同时增加机器部署独立集群,同时又将 Ignite 嵌入应用内部以服务端模式运行,通过逻辑集群组进行资源的分配,整体上形成更大的集群,大体是如下的部署模式:

  (点击放大图像)

Apache Ignite(五)

  这种模式更为灵活,调优后能做到成本、功能、性能的平衡,综合效果最佳。这时可以将缓存的数据通过集群组部署到应用外部的节点上,这样可以避免频繁的冷启动导致缓存数据频繁的长时间加载,对于计算,也能够动态地充分利用所有计算节点的资源。

  感谢郭蕾对本文的审校。

  给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。

  大会推荐:

  8 月 22~23 日的 AICon 深圳站 将以 “探索 AI 应用边界” 为主题,聚焦 Agent、多模态、AI 产品设计等热门方向,围绕企业如何通过大模型降低成本、提升经营效率的实际应用案例,邀请来自头部企业、大厂以及明星创业公司的专家,带来一线的大模型实践经验和前沿洞察。一起探索 AI 应用的更多可能,发掘 AI 驱动业务增长的新路径!

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享