对自定义应用程序进行群集

对自定义应用程序进行群集

我有一个用 Java 编写的自定义应用程序。我想知道是否可以通过 Pacemaker 来集群此应用程序。例如,将此应用程序复制到两个不同的节点,并通过 Pacemaker 设置集群。一次只有一个应用程序工作,当主节点发生故障时,我的应用程序开始在第二个节点上工作,简而言之,我需要一种方法来集群我的简单应用程序,例如使用 Packemaker 集群 nginx 服务器,

还有什么解决方案可以集群两个操作系统吗?如果第一个操作系统出现故障,第二个操作系统将开始处理请求?

提前致谢


为了阐明我的情况。我有一个处理一些消息的 Java 应用程序。它不像服务,而像本地应用程序一样运行。我想确保我的应用程序的一个实例始终在群集的两个或更多节点中运行,并且当我的应用程序的一个实例在群集的一个节点中运行时,其他实例不允许工作。我知道起搏器如何工作并使用浮动 IP 作为资源。我想知道是否有任何解决方案可以将我的应用程序添加为资源或起搏器监视我的应用程序,并在失败时切换到其他节点。


更新:有关更多信息,我想在物理服务器上部署应用程序,但无法使用虚拟化和 VM。此外,像 Vmware FT 这样的方法有一些限制,例如 VCPU 和 RAM 的最大数量。我认为如果我可以使用 pacemaker 作为集群资源管理器,应该会容易得多,但我不知道如何将我的应用程序作为资源引入,如何将所有流量路由到我的主服务器,以及当服务器或应用程序出现流量故障时,请求路由到其他节点。

不幸的是,我的应用程序不像一个服务。通常我的应用程序从不同的服务器收集信息并将它们发送到另一台服务器,因此像负载均衡器这样的方法不适合我的场景。

我的集群需要一个浮动 IP,当服务器 A 停机时,所有流量都会切换到服务器 B(输入和输出),同时集群会在服务器 B 上启动已停止的应用程序。当服务器 A 恢复在线时,所有请求(输入或输出)都会路由到服务器 A,并在服务器 B 上停止应用程序。

答案1

我将根据您问题中的一些细节在回答中做出一些假设,因为我必须这样做才能构建一个不那么笼统的答案。如果这些信息不正确,请原谅。

假设:

  • 您的 Java 应用程序必须一次只在一个节点上运行,并且是有状态的。
  • 该应用程序没有奇特的运行状态,将响应非常简单的启动和停止操作,并且可以轻松监控。
  • 此应用程序没有 LSB 初始化脚本或 systemd 单元文件来控制其状态

Pacemaker 使用所谓的资源代理 (RA) 来控制应用程序的状态。在大多数情况下,这些 RA 是 bash 或 python 脚本,并且可以使用特定于应用程序的脚本来更好地与这些应用程序交互,而不仅仅是启动和停止进程。但是,有几种资源代理旨在处理“任意”应用程序,例如您描述的应用程序。

“任何”资源代理都应该处理这种情况,并且非常通用。有关具体如何实现的详细信息,请参阅其 git 页面。但是,这里有一个通过 crmsh 定义的原语示例:

primitive p_anything_java-app ocf:heartbeat:anything \
    params binfile="/opt/executable-file" monitor_hook="/opt/monitor-script" \
    op start interval=0 timeout=60 \
    op stop interval=0 timeout=60 \
    op monitor interval=30 timeout=60

这只是一个例子。如果这不是最简单的应用程序,您可能需要定义更多的参数才能使事情保持一致。

“Anything” RA 的替代方案是 LSB 或 systemd RA,它们均可与标准 systemd 单元文件或 LSB 初始化脚本交互。如果您的应用程序可以在该规范内进行管理,那么最好创建一个单元文件或初始化脚本并使用此方法,因为它提供了一种可靠的方法来运行您的应用程序(集群和非集群),而无需在 Pacemaker 中定义所有相关路径和参数。这也是实现资源监控的更好方法,这在 HA 资源中至关重要。


至于您的“浮动” IP 地址,可以使用 IPaddr2 原语来建立。IPaddr2 将利用 GARP 来宣布 Pacemaker 分配的接口辅助 IP 地址的存在,该地址可以与您的应用程序共置以实现节点间故障转移网络。这确实需要在公共子网和广播域上操作集群节点。

请参阅 RA 中的注释以获取使用详情。

如果您安装了相关资源代理,您还可以通过以下方式从“crmsh”获取使用详情:

crm ra info IPaddr2

请记住,这些资源需要并排放置,以确保它们在同一个节点上运行,并按照正确的启动/停止顺序运行。似乎可以通过一个“组”来解决此问题。

答案2

我不太明白你到底想问什么,但一般来说:

您始终可以使用集群管理器(如 Pacemaker)创建故障转移集群。这不需要应用程序本身提供特殊支持。

在故障转移群集中,群集管理器将确保只有任何时候都只有一个应用程序实例在运行,拥有应用程序所需的所有独特资源(即 IP 地址、存储等)。

如果一个节点发生故障,那么资源将被转移, 应用程序将启动在另一个节点上(应用程序尚未启动并运行),将停机时间减少到绝对最短(理论上)。


其他集群模式(应用程序同时在多个节点上运行)通常需要应用程序或基础设施中的特殊支持。

其他集群模式通常带有某种形式的负载平衡,以将请求分发到应用程序的活动实例。

经常(并非总是)当负载均衡器将所有用户引导到一个活动节点并且第二个节点是热备用时,应用程序将开箱即用,应用程序已在运行但直到主节点发生故障时才会使用。

要使用主动-主动负载平衡,将一些用户定向到一个节点,将其他并发用户定向到另一个节点,这需要专门为水平扩展和负载平衡设计的应用程序或非常愚蠢的非交互式应用程序。

相关内容