Cluster

集群自定義應用程序

  • April 26, 2019

我有一個由 java 編寫的自定義應用程序。我想知道起搏器是否可以集群這個應用程序。例如,將此應用程序複製到兩個不同的節點並通過起搏器設置集群。有一次只有一個應用程序工作,當主節點出現故障時,我的應用程序開始在第二個節點上工作,簡單來說,我需要一種方法來集群我的簡單應用程序,比如用 packemaker 集群 nginx 伺服器,

還有任何解決方案可以集群兩個作業系統。如果第一個作業系統出現故障,第二個作業系統開始服務請求?

提前致謝


澄清我的情況。我有一個處理一些消息的 java 應用程序。它不像服務,而是像本地應用程序一樣。我想確保我的應用程序的一個實例始終在我的集群的兩個或多個節點中執行,並且當我的應用程序的一個實例在我的集群的一個節點中執行時,其他實例不允許工作。我知道起搏器如何工作並將浮動 ip 用作資源。我想知道是否有任何解決方案可以將我的應用程序添加為資源或起搏器監控我的應用程序以及在失敗時切換到其他節點。


更新:有關更多資訊,我想在物理伺服器上部署應用程序,但我不能使用虛擬化和 VM。此外,像 Vmware FT 這樣的方法有一些限制,比如 VCPU 的最大數量和 RAM。我認為如果我可以使用起搏器作為集群資源管理器應該會容易得多,但我不知道如何將我的應用程序作為資源引入以及如何將所有流量路由到我的主伺服器以及伺服器或應用程序何時出現流量下降並請求路由到其他節點。

不幸的是,我的應用程序不像服務。通常我的應用程序從不同的伺服器收集資訊並將它們發送到另一台伺服器,因此負載均衡器等方法不適合我的場景。

我的集群需要一個浮動 IP,當 serverA 出現故障時,所有流量都切換到 ServerB(輸入和輸出),集群也開始在 serverB 上停止應用程序。當 ServerA 恢復線上時,所有請求(輸入或輸出)都會路由到 ServerA 並在 ServerB 上停止應用程序。

我將根據您問題中的一些細節在我的答案中做出一些假設,因為我必須這樣做才能建構一個不太通用的答案。抱歉,如果此資訊不正確。

假設:

  • 您的 Java 應用程序一次只能在一個節點上執行,並且是有狀態的。
  • 這個應用程序沒有特殊的執行狀態,會響應非常簡單的啟動和停止操作,並且可以很容易地被監控。
  • 此應用程序沒有 LSB 初始化腳本或 systemd 單元文件來控制其狀態

Pacemaker 使用所謂的資源代理 (RA) 來控制應用程序的狀態。在大多數情況下,這些 RA 是 bash 或 python 腳本,並且特定於應用程序的腳本可用於更好地與這些應用程序互動,而不僅僅是啟動和停止程序。但是,有幾種資源代理旨在處理“任意”應用程序,例如您描述的那個。

“Anything”資源代理應該處理這種情況,並且非常通用。請參閱它的 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

請記住,這些資源需要同時配置和排序,以確保它們在同一個節點上以正確的啟動/停止順序執行。似乎這可以通過一個“組”來解決。

引用自:https://serverfault.com/questions/964396