Sun Cluster 資料服務開發者指南 (適用於 Solaris 作業系統)

第 2 章 開發資料服務

本章介紹如何使應用程式高度可用或可延伸,並提供有關開發資料服務的詳細資訊。

本章涵蓋下列主題:

分析應用程式的適當性

建立資料服務的第一步是確定目標應用程式是否滿足高可用性或可延伸性的需求。如果應用程式無法滿足所有需求,您可以修改應用程式原始碼以使其高度可用或可延伸。

以下清單概括了使應用程式高度可用或可延伸所應滿足的要求。如需更多詳細資訊,或如需修改應用程式原始碼,請參閱附錄 B範例資料服務程式碼清單


備註 –

可延伸服務必須滿足以下高可用性的條件,還必須滿足一些附加條件,這些附加條件位於此清單的後面。


另外,可延伸服務必須滿足以下需求︰

對於可延伸服務,應用程式特性還決定了負載平衡策略。例如,負載平衡策略 Lb_weighted,允許任何實例回應用戶端請求,而不適用於使用伺服器上的記憶體內快取進行用戶端連線之應用程式。在此情況下,您應該指定負載平衡策略,將指定用戶端的流量限定為應用程式的一個實例。負載平衡策略 Lb_stickyLb_sticky_wild 重複將某一用戶端的所有請求傳送至同一應用程式實例,在此實例中它們可以使用記憶體內快取。請注意,如果多個用戶端請求來自不同用戶端,則 RGM 在該服務的實例間分配這些請求。請參閱實施故障轉移資源,以取得有關設定可延伸資料服務的負載平衡策略的更多資訊。

確定要使用的介面

Sun Cluster 開發者支援套件 (SUNWscdev) 提供了兩組編碼資料服務方法的介面:

Sun Cluster 開發者支援套件還包括 SunPlex Agent Builder,一個自動化資料服務建立的工具。

以下為開發資料服務的建議之方法︰

  1. 決定是在 C shell 還是在 Korn shell 中編碼。如果您決定使用 Korn shell,則無法使用 DSDL,因為 DSDL 僅提供 C 介面。

  2. 執行 Agent Builder,指定必需的資訊,產生資料服務 (包含原始可執行程式碼、RTR 檔案和套裝軟體)。

  3. 如果產生的資料服務需要自訂,您可以將 DSDL 程式碼加入至產生的來源檔案中。Agent Builder 透過註釋指示來源檔案中可自行加入程式碼的特定位置。

  4. 如果程式碼需要進一步的自訂才能支援目標應用程式,您可以將 RMAPI 函數加入現有來源代碼中。

實際上,您可採用很多方法來建立資料服務。例如,您可以以使用 DSDL 或 RMAPI 函數從頭編寫的程式來完全替代產生的一個方法或監視器程式,而非將自己的程式碼增加到由 Agent Builder 產生的程式碼中的指定位置。但是,無論您如何處理,在大多數情況下,使用 Agent Builder 啟動是有意義的,原因如下︰


備註 –

與 RMAPI (提供一組 C 函數和一組在程序檔中使用的指令) 不同,DSDL 僅提供一個 C 函數介面。因此,如果您在 Agent Builder 中指定 Korn shell (ksh) 輸出,則產生的來源代碼將向 RMAPI 發出呼叫,這是因為沒有 DSDL ksh 指令。


設定撰寫資料服務的開發環境

在開始開發資料服務之前,您必須安裝 Sun Cluster 開發套裝軟體 (SUNWscdev) 以取得 Sun Cluster 標頭和程式庫檔案的存取權。儘管在所有叢集節點上均已安裝此套裝軟體,但是您通常在單獨的、非叢集開發機器 (而非叢集節點) 上開發資料服務。在此典型情況下,您必須使用 pkgadd 指令在開發機器上安裝 SUNWscdev 套裝軟體。

當編譯和連結程式碼時,您必須設定特別選項以識別標頭和程式庫檔案。


備註 –

在 Solaris 作業系統與 Sun Cluster 產品中,您不能混淆相容模式編譯的 C++ 程式碼與標準模式編譯的 C++ 程式碼。因此,如果您要建立基於 C++ 的資料服務以便在 Sun Cluster 上使用,則必須編譯該資料服務,如下所示︰


完成開發 (在非叢集節點上) 之後,您可以將完成的資料服務傳送至叢集以進行測試。


備註 –

請確保您正在使用 Solaris 8 作業系統或更高版本的 Solaris 作業系統之 Developer 或 Entire Distribution 軟體群組。


本小節中的程序說明如何完成以下作業︰

Procedure如何設置開發環境

此程序說明如何安裝 SUNWscdev 套件和如何為資料服務開發設定編譯程式選項和連結程式選項。

步驟
  1. 成為超級使用者,或者假定一個對等身份。

  2. 將目錄變更為所需的 CD-ROM 目錄。


    # cd cd-rom-directory
    
  3. 安裝目前目錄中的 SUNWscdev 套裝軟體。

    • 對於區域環境中的 Solaris 10 作業系統,作為全域區域中的全域管理員,請鍵入以下指令︰


      # pkgadd -G -d . SUNWscdev
      

      假設 SUNWscdev 的內容不影響與非全域區域共用的全域區域中的任何區域,則將 SUNWscdev 套裝軟體增加至全域區域。

    • 對於 Solaris 作業系統的任何其他版本,或非區域環境中的 Solaris 10 作業系統,請鍵入以下指令︰


      # pkgadd -d . SUNWscdev
      
  4. makefile 中,請指定識別資料服務程式碼的包含檔案和程式庫檔案的編譯器和連結程式選項。

    指定 -I 選項來識別 Sun Cluster 標頭檔案,指定 -L 選項來指定開發系統上的編譯時間程式庫搜尋路徑,以及指定 -R 選項來指定叢集中的執行階段連結程式之程式庫搜尋路徑。

    # Makefile for sample data service
    ...
    
    -I /usr/cluster/include
    
    -L /usr/cluster/lib
    
    -R /usr/cluster/lib
    ...

將資料服務傳送至叢集

在開發機器上完成資料服務後,必須將資料服務傳送至叢集以進行測試。若要降低傳送過程中發生錯誤的可能性,請將資料服務程式碼和 RTR 檔案合併到一個套裝軟體中,並在叢集的所有節點上安裝此套裝軟體。


備註 –

不管您使用 pkgadd 還是使用某種其他方法來安裝資料服務,均必須將該資料服務放置在所有叢集節點上。請注意,Agent Builder 會自動建立此套裝軟體。


設定資源特性和資源類型特性

Sun Cluster 提供一組資源類型特性和資源特性,您可以使用這些特性定義資料服務的靜態配置。資源類型特性指定資源的類型、資料類型版本、API 版本以及每種回呼方法的路徑。資源類型特性列出所有的資源類型特性。

資源特性 (如 Failover_modeThorough_probe_interval) 以及方法逾時也定義資源的靜態配置。動態資源特性 (如 Resource_stateStatus) 反映管理的資源之使用中狀態。資源特性說明資源特性。

您可在資源類型註冊 (RTR) 檔案中宣告資源類型和資源特性,該檔案是資料服務必不可少的元件。RTR 檔案在叢集管理員將資料服務註冊到 Sun Cluster 時定義資料服務的初始配置。

因為 Agent Builder 宣告對於任何資料服務均有用且必需的特性集,所以請使用 Agent Builder 來產生資料服務的 RTR 檔案。例如,特定的特性 (如 Resource_type) 必須在 RTR 檔案中進行宣告。否則,資源服務註冊會失敗。其他特性,儘管並非必需的,只有在 RTR 檔案中進行宣告,叢集管理員才能使用它們。有些特性無論是否宣告均可用,因為 RGM 定義這些特性並提供預設值。若要避免此層級的複雜性,請使用 Agent Builder 以確保產生正確的 RTR 檔案。如有必要,您稍後可以編輯 RTR 檔案以變更特定的值。

本小節的其餘部分將顯示由 Agent Builder 建立的 RTR 檔案範例。

宣告資源類型特性

叢集管理員無法配置在 RTR 檔案中宣告的資源類型特性。它們成為該資源類型永久配置的一部分。


備註 –

只有叢集管理員才能配置資源類型特性 Installed_nodes。您不能在 RTR 檔案中宣告 Installed_nodes


資源類型宣告的語法如下所示︰

property-name = value;

備註 –

資源群組、資源以及資源類型的特性名稱區分大小寫。當您指定特性名稱時,您可以使用大寫和小寫字母的任意組合。


這些是資料服務範例 (smpl) 在 RTR 檔案中的資源類型宣告︰

# Sun Cluster Data Services Builder template version 1.0
# Registration information and resources for smpl
#
#NOTE: Keywords are case insensitive, i.e., you can use
#any capitalization style you prefer.
#
Resource_type = "smpl";
Vendor_id = SUNW;
RT_description = "Sample Service on Sun Cluster";

RT_version ="1.0"; 
API_version = 2;
Failover = TRUE;

Init_nodes = RG_PRIMARIES;

RT_basedir=/opt/SUNWsmpl/bin;

Start           =    smpl_svc_start;
Stop            =    smpl_svc_stop;

Validate        =    smpl_validate;
Update          =    smpl_update;

Monitor_start   =    smpl_monitor_start;
Monitor_stop    =    smpl_monitor_stop;
Monitor_check   =    smpl_monitor_check;

提示 –

您必須宣告 Resource_type 特性為 RTR 檔案中的第一個項目。否則,資源類型註冊會失敗。


第一組資源類型宣告提供有關資源類型的基本資訊。

Resource_typeVendor_id

提供資源類型的名稱。您可以單獨使用 Resource_type 特性指定資源類型名稱 (smpl) 或透過將 Vendor_id 特性作為前綴 (使用「.」將其與資源類型分隔) 來指定資源類型名稱 (SUNW.smpl),如範例所示。如果您使用 Vendor_id,請確定其為定義資源類型的公司股票代號。資源類型名稱在叢集中必須是唯一的。


備註 –

依慣例,將資源類型名稱 (vendoridApplicationname) 作為套裝軟體名稱。從 Solaris 9 作業系統開始,供應商 ID 和應用程式名稱的組合可以超過九位字元。但是,如果您使用舊版的 Solaris 作業系統,供應商 ID 和應用程式名稱的組合不能超過九位字元,儘管 RGM 不執行此限制。

另一方面,Agent Builder 在所有情況下都從資源類型名稱明確產生套裝軟體名稱,因此其執行九位字元限制。


RT_description

簡要說明資源類型。

RT_version

識別資料服務範例的版本。

API_version

識別 API 的版本。例如,API_version = 2 表示資料服務可以安裝在 Sun Cluster 3.0 及其以後的任何 Sun Cluster 版本上。API_version = 5 表示資料服務可以安裝在 Sun Cluster 3.1 9/04 及其以後的任何 Sun Cluster 版本上。但是,API_version = 5 也表示資料服務無法安裝在 Sun Cluster 3.1 9/04 之前發行的任何 Sun Cluster 版本上。資源類型特性中的 API_version 項目更詳細地說明了此特性。

Failover = TRUE

表示資料服務無法在可在多個節點上同時處於線上狀態的資源群組中執行。也就是說,此宣告指定容錯移轉資料服務。資源類型特性中的 Failover 項目更詳細地說明了此特性。

StartStopValidate

提供由 RGM 呼叫的各個回呼方法程式的路徑。這些路徑與由 RT_basedir 指定的路徑相對。

剩餘資源類型宣告提供配置資訊。

Init_nodes = RG_PRIMARIES

指定 RGM 僅在可以主控資料服務的節點上呼叫 InitBootFiniValidate 方法。由 RG_PRIMARIES 指定的節點是安裝資料服務的所有節點之子集。將其值設定為 RT_INSTALLED_NODES,以指定 RGM 在安裝資料服務的所有節點上呼叫這些方法。

RT_basedir

指向 /opt/SUNWsample/bin 作為完整相對路徑 (如回呼方法路徑) 的目錄路徑。

StartStopValidate

提供由 RGM 呼叫的各個回呼方法程式的路徑。這些路徑與由 RT_basedir 指定的路徑是相對的。

宣告資源特性

與資源類型特性相同,在 RTR 檔案中宣告資源特性。依慣例,在 RTR 檔案中資源特性宣告緊跟在資源類型宣告之後。資源宣告的語法為一組由大括弧包含的性質值對:

{
    attribute = value;
    attribute = value;
             .
             .
             .
    attribute = value;
}

對於由 Sun Cluster 提供的資源特性 (稱為系統定義的特性),您可以在 RTR 檔案中變更特定的屬性。例如,Sun Cluster 為每種回呼方法提供方法逾時特性之預設值。在 RTR 檔案中,您可以指定不同預設值。

也可以透過使用由 Sun Cluster 提供的特性屬性集,在 RTR 檔案中定義新的資源特性 (稱為延伸特性)。資源特性屬性列出用於變更和定義資源特性的屬性。在 RTR 檔案中,延伸特性宣告緊跟在系統定義特性宣告之後。

第一組系統定義的資源特性指定回呼方法的逾時值。

...

# Resource property declarations appear as a list of bracketed
# entries after the resource type declarations. The property 
# name declaration must be the first attribute after the open
# curly bracket of a resource property entry.
#
# Set minimum and default for method timeouts.
{
        PROPERTY = Start_timeout;
        MIN=60;
        DEFAULT=300;
}

{
        PROPERTY = Stop_timeout;
        MIN=60;
        DEFAULT=300;
}
{
        PROPERTY = Validate_timeout;
        MIN=60;
        DEFAULT=300;
}
{
        PROPERTY = Update_timeout;
        MIN=60;
        DEFAULT=300;
}
{
        PROPERTY = Monitor_Start_timeout;
        MIN=60;
        DEFAULT=300;
}
{
        PROPERTY = Monitor_Stop_timeout;
        MIN=60;
        DEFAULT=300;
{
        PROPERTY = Monitor_Check_timeout;
        MIN=60;
        DEFAULT=300;
}

特性 (PROPERTY = value) 的名稱必須是每個資源特性宣告的第一個屬性。您可以在特性屬性在 RTR 檔案中定義的限制內配置資源特性。例如,範例中每個方法逾時的預設值為 300 秒。叢集管理員可以變更此值。但是,可允許的最小值 (由 MIN 屬性指定) 為 60 秒。資源特性屬性含有資源特性屬性之清單。

下一組資源特性定義在資料服務中具有特定用途的特性。

{
        PROPERTY = Failover_mode;
        DEFAULT=SOFT;
        TUNABLE = ANYTIME;
}
{
        PROPERTY = Thorough_Probe_Interval;
        MIN=1;
        MAX=3600;
        DEFAULT=60;
        TUNABLE = ANYTIME;
}

# The number of retries to be done within a certain period before concluding
# that the application cannot be successfully started on this node.
{
        PROPERTY = Retry_count;
        MAX=10;
        DEFAULT=2;
        TUNABLE = ANYTIME; 
}

# Set Retry_interval as a multiple of 60 since it is converted from seconds
# to minutes, rounding up. For example, a value of 50 (seconds)
# is converted to 1 minute. Use this property to time the number of
# retries (Retry_count).
{
        PROPERTY = Retry_interval;
        MAX=3600;
        DEFAULT=300;
        TUNABLE = ANYTIME;
}

{
        PROPERTY = Network_resources_used;
        TUNABLE = WHEN_DISABLED;
        DEFAULT = "";
}
{
        PROPERTY = Scalable;
        DEFAULT = FALSE;
        TUNABLE = AT_CREATION;
}
{
        PROPERTY = Load_balancing_policy;
        DEFAULT = LB_WEIGHTED;
        TUNABLE = AT_CREATION;
}
{
        PROPERTY = Load_balancing_weights;
        DEFAULT = "";
        TUNABLE = ANYTIME;
}
{
        PROPERTY = Port_list;
        TUNABLE = ANYTIME;
        DEFAULT = ;
}

這些資源特性宣告包含 TUNABLE 屬性。此屬性限制叢集管理員可以變更與其關聯的特性值的情況。例如,值 AT_CREATION 表示叢集管理員僅能在建立資源時指定此值且稍後無法變更。

對於大多數特性,您可以接受 Agent Builder 產生的預設值,除非您有理由變更它們。有關這些特性的資訊如下所示。如需附加資訊,請參閱資源特性r_properties(5) 線上手冊。

Failover_mode

表示當 StartStop 方法失敗時,RGM 應該遷移資源群組還是中斷節點。

Thorough_probe_intervalRetry_countRetry_interval

在故障監視器中使用。Tunable 等同於 ANYTIME,因此如果故障監視器沒有以最佳方式運作,叢集管理員可以對其進行調整。

Network_resources_used

資料服務使用的邏輯主機名稱或共用的位址資源之清單。Agent Builder 宣告此特性,從而叢集管理員在配置資料服務時可以指定資源清單 (如果資源存在)。

Scalable

設定為 FALSE,表示此資源不使用叢集網路 (共用位址) 功能。如果將此特性設定為 FALSE,資源類型特性 Failover 必須設定為 TRUE 以表示容錯移轉服務。請參閱將資料服務傳送至叢集實施回呼方法,以取得有關如何使用此特性的附加資訊。

Load_balancing_policyLoad_balancing_weights

自動宣告這些特性。但是,這些特性在容錯移轉資源類型中無用。

Port_list

識別伺服器偵聽通訊埠的清單。Agent Builder 宣告此特性,從而叢集管理員在配置資料服務時可以指定連接埠清單。

宣告延伸特性

延伸特性顯示於 RTR 檔案範例的結尾處。

# Extension Properties
#

# The cluster administrator must set the value of this property to point to the 
# directory that contains the configuration files used by the application.
# For this application, smpl, specify the path of the configuration file on
# PXFS (typically named.conf).
{
        PROPERTY = Confdir_list;
        EXTENSION;
        STRINGARRAY;
        TUNABLE = AT_CREATION;
        DESCRIPTION = "The Configuration Directory Path(s)";
}

# The following two properties control restart of the fault monitor.
{
        PROPERTY = Monitor_retry_count;
        EXTENSION;
        INT;
        DEFAULT = 4;
        TUNABLE = ANYTIME;
        DESCRIPTION = "Number of PMF restarts allowed for fault monitor.";
}
{
        PROPERTY = Monitor_retry_interval;
        EXTENSION;
        INT;
        DEFAULT = 2;
        TUNABLE = ANYTIME;
        DESCRIPTION = "Time window (minutes) for fault monitor restarts.";
}
# Time out value in seconds for the probe.
{
        PROPERTY = Probe_timeout;
        EXTENSION;
        INT;
        DEFAULT = 120;
        TUNABLE = ANYTIME;
        DESCRIPTION = "Time out value for the probe (seconds)";
}

# Child process monitoring level for PMF (-C option of pmfadm).
# Default of -1 means to not use the -C option of pmfadm.
# A value of 0 or greater indicates the desired level of child-process.
# monitoring.
{
        PROPERTY = Child_mon_level;
        EXTENSION;
        INT;
        DEFAULT = -1;
        TUNABLE = ANYTIME;
        DESCRIPTION = “Child monitoring level for PMF";
}
# User added code -- BEGIN VVVVVVVVVVVV
# User added code -- END   ^^^^^^^^^^^^

Agent Builder 將建立以下延伸特性,這些延伸特性對大多數資料服務均有用。

Confdir_list

指定應用程式配置目錄的路徑,此路徑資訊對許多應用程式均有用。叢集管理員配置資料服務時,可以提供此目錄的位置。

Monitor_retry_countMonitor_retry_interval 以及 Probe_timeout

控制故障監視器自身 (而非伺服器常駐程式) 的重新啟動。

Child_mon_level

將監視層級設定為由 PMF 執行。請參閱 pmfadm(1M) 線上手冊,以取得更多資訊。

您可以在由 User added code 注釋分隔的區域中建立附加延伸特性。

實施回呼方法

本小節提供有關實作回呼方法的一般資訊。

存取資源和資源群組特性資訊

通常,回呼方法需要對資源特性的存取權。RMAPI 提供 shell 指令和 C 函數,可在回呼方法中使用以存取系統定義的資源特性和延伸資源特性。請參閱 scha_resource_get(1HA)scha_resource_get(3HA) 線上手冊。

DSDL 提供存取系統定義的特性的 C 函數集 (每種特性均具有一個函數),以及存取延伸特性的一個函數。請參閱 scds_property_functions(3HA)scds_get_ext_property(3HA) 線上手冊。

您無法使用特性機制儲存資料服務的動態狀態資訊,因為除 StatusStatus_msg 之外,沒有用於設定資源特性的 API 函數。相反,您應該在全域檔案中儲存動態的狀態資訊。


備註 –

叢集管理員可以透過使用 scrgadm 指令或藉由圖形管理指令或介面來設定特定的資源特性。但是,請勿使用任何回呼方法呼叫 scrgadm,因為 scrgadm 在叢集重新配置過程中 (即 RGM 呼叫此方法時) 失敗。


方法的等冪性

通常,RGM 不會使用同一引數在同一資源上連續多次呼叫一個方法。但是,如果 Start 方法失敗,即使資源從未啟動,RGM 也可以在資源上呼叫 Stop 方法。同樣,資源常駐程式可能因其自身原因中止,而 RGM 可能仍會在資源常駐程式上執行 Stop 方法。Monitor_startMonitor_stop 方法亦是如此。

由於這些原因,您必須在 StopMonitor_stop 方法中建立等冪性。使用同一引數在同一資源上多次呼叫 StopMonitor_stop,其效果與單次呼叫相同。

等冪性的一種含意為,即使資源或監視器已停止,並且不執行任何工作,StopMonitor_stop 也必須傳回 0 (成功)。


備註 –

InitFiniBootUpdate 方法必須也等冪。Start 方法不需要具有等冪性。


一般資料服務

通用資料服務 (GDS) 是一種機制,其透過將簡單應用程式插入 Sun Cluster Resource Group Manager 架構而使其高度可用或可延伸。 該機制不需要編碼資料服務,編碼資料服務是使應用程式高度可用或可延伸的常用方法。

GDS 模型依賴於預編譯的資源類型 SUNW.gds,來與 RGM 架構進行互動式操作。請參閱第 10 章, 一般資料服務,以取得附加資訊。

控制應用程式

每當節點處於連結或斷開連結叢集程序中時,回呼方法會啟用 RGM 來控制基本資源 (即應用程式)。

啟動與停止資源

資源類型實作至少需要 Start 方法和 Stop 方法。RGM 在正確的時間和正確的節點上呼叫資源類型的方法程式,以將資源群組置於離線或線上狀態。例如,當叢集節點當機後,RGM 會將由該節點主控的任何資源群組移至新的節點。您必須實施 Start 方法,為 RGM 提供重新啟動存活主機節點上每個資源的方法。

Start 方法必須在資源已啟動且在本機節點上可用之後才傳回。請確定需要很長初始化期間的資源類型在 Start 方法上具有足夠長的逾時設定。若要確保有足夠的逾時時間,請在 RTR 檔案中設定 Start_timeout 特性的預設值和最小值。

您必須為 RGM 使資源群組離線的情形實施 Stop 方法。例如,假設在節點 1 上將資源群組置於離線並在節點 2 上重新置於線上。在將資源群組置於離線時,RGM 會在群組中的資源上呼叫 Stop 方法以停止節點 1 上的所有作業。當在節點 1 上完成所有資源的 Stop 方法後,RGM 會將資源群組在節點 2 上重新置於線上。

Stop 方法必須在資源已完全停止其在本機節點上的所有活動且完全關閉後才返回。Stop 方法最安全的實作會終止與此資源相關的本機節點上的所有程序。需要長時間來關閉的資源類型應該在 Stop 方法上具有足夠長的逾時設定。在 RTR 檔案中設定 Stop_timeout 特性。

Stop 方法失敗或逾時會導致資源群組進入錯誤狀態,此錯誤狀態需要叢集管理員介入。為了避免此種狀態,StopMonitor_stop 方法實作應該嘗試從所有可能的錯誤情況回復。理想情況是,這些方法以 0 (成功) 錯誤狀態退出,即已成功停止本機節點上的資源及其監視器的所有活動。

決定使用哪些 StartStop 方法

本小節提供有關何時使用 StartStop 方法 (相對於使用 Prenet_startPostnet_stop 方法) 的一些提示。您必須在用戶端和資料服務的主從式網路協定方面有豐富的知識,以決定要使用的正確方法。

使用網路位址資源的服務可能要求以特定順序 (與邏輯主機名稱位址配置相對) 完成啟動或停止步驟。可選用的回呼方法 Prenet_startPostnet_stop 將啟用資源類型實作,以在同一資源群組中的網路位址配置為線上或離線前後,執行特殊啟動和關閉作業。

在呼叫資料服務的 Prenet_start 方法之前,RGM 將呼叫探索網路位址 (但不配置網路位址) 的方法。在呼叫資料服務的 Postnet_stop 方法之後,RGM 將呼叫不探索網路位址的方法。當 RGM 將資源群組置於線上時,其順序如下所示︰

  1. 探索網路位址。

  2. 呼叫資料服務的 Prenet_start 方法 (如果有的話)。

  3. 配置網路位址。

  4. 呼叫資料服務的 Start 方法 (如果有的話)。

當 RGM 使資源群組離線時會發生反向:

  1. 呼叫資料服務的 Stop 方法 (如果有的話)。

  2. 取消配置網路位址。

  3. 呼叫資料服務的 Postnet_stop 方法 (如果有的話)。

  4. 不探索網路位址。

在決定使用 StartStopPrenet_startPostnet_stop 方法時,首先考量伺服器端。將含有資料服務應用程式資源和網路位址資源的資源群組置於線上時,RGM 會在呼叫資料服務資源 Start 方法前,呼叫此方法將網路位址配置為線上。因此,如果資料服務需要在啟動時配置網路位址,請使用 Start 方法啟動資料服務。

同樣,當使包含資料服務應用程式資源和網路位址資源的資源群組離線時,RGM 會在呼叫資料服務資源 Stop 方法後,呼叫這些方法來取消配置網路位址。因此,如果資料服務需要在停止時將網路位址配置為線上,請使用 Stop 方法停止資料服務。

例如,若要啟動或停止資料服務,您可能必須執行資料服務的管理公用程式或程式庫。有時,資料服務具有使用主從式網路介面執行管理的管理公用程式或程式庫。即管理公用程式呼叫伺服器常駐程式,從而網路位址可能需要出現,以便使用管理公用程式或程式庫。在此情形下,請使用 StartStop 方法。

如果資料服務需要在其啟動與停止時將網路位址配置為離線,請使用 Prenet_start 方法和 Postnet_stop 方法來啟動與停止該資料服務。考量用戶端軟體是否將依據網路位址或資料服務在叢集重新配置 (透過 SCHA_GIVEOVER 引數 scha_control() 或透過 scswitch 進行切換保護轉移) 之後是否首先置於線上而做出不同回應。例如,用戶端實作可能進行最低限度的重試,並在確定資料服務通訊埠不可用之後不久放棄。

如果資料服務在其啟動時不需要將網路位址配置為線上,請在配置網路介面之前啟動該資料服務。以此種方式啟動資料服務,確保資料服務能在將網路位址配置為線上時立即回應用戶端請求。因此,用戶端不太可能停止重試。在此情形下,請使用 Prenet_start 方法 (而非 Start 方法) 來啟動資料服務。

如果您使用 Postnet_stop 方法,則資料服務資源在取消配置網路位址時仍會出現。僅在將網路位址配置為離線後才能執行 Postnet_stop 方法。因此,資料服務的 TCP 或 UDP 服務連接埠或其 RPC 程式編號始終顯示為對網路上的用戶端可用 (當網路位址也不回應時除外)。


備註 –

如果您在叢集中安裝 RPC 服務,該服務不得使用以下程式編號︰100141、100142 與 100248。這些編號是分別為 Sun Cluster 常駐程式 rgmd_receptionistfedpmfd 保留的。如果您安裝的 RPC 服務使用以上任一程式編號,請變更該 RPC 服務的程式編號。


決定使用 StartStop 方法 (相對於 Prenet_startPostnet_stop 方法) 或使用二者,必須考量伺服器和用戶端的需求和運作方式。

InitFiniBoot 方法

三種可選用的方法,InitFini 以及 Boot,啟用 RGM 在資源上執行初始化和終止程式碼。

當資源由於以下情況而被管理時,RGM 將執行 Init 方法以執行資源的一次初始化︰

當資源由於以下情況而未被管理時,RGM 將執行 Fini 方法以清除資源︰

清除必須是等冪的。也就是說,如果清除已完成,Fini 將成功結束。

RGM 將在新近連結至叢集的節點上執行 Boot 方法,即該節點已經啟動或重新啟動。

Boot 方法通常執行與 Init 相同的初始化。此初始化必須是等冪的,即如果資源在本機節點上已經初始化,BootInit 將成功結束。

監視資源

通常,您要實作監視器以在資源上執行定期故障探測,來偵測經過探測的資源是否正常運作。如果故障探測失敗,監視器可以嘗試在本機上重新啟動或請求容錯移轉受影響的資源群組。監視器將透過呼叫 scha_control() RMAPI 函數或 scds_fm_action() DSDL 函數來請求容錯移轉。

您還可以監視資源的效能,並調校或報告效能。寫入特定資源類型的故障監視器是可選用的。即使您選擇不寫入此故障監視器,資源類型也會受益於 Sun Cluster 自身對叢集所執行的基本監視。Sun Cluster 偵測主機硬體的故障、主機作業系統的嚴重故障,以及能夠在主機公用網路上通訊的主機之故障。

儘管 RGM 不直接呼叫資源監視器,RGM 仍會提供自動啟動資源監視器的功能。使資源離線時,RGM 會先呼叫 Monitor_stop 方法以停止本機節點上的資源監視器,然後才停止資源自身。在將資源置於線上時,RGM 將在啟動資源本身後呼叫 Monitor_start 方法。

scha_control() RMAPI 函數和 scds_fm_action() DSDL 函數 (呼叫 scha_control()) 將啟用資源監視器以請求將資源群組容錯移轉至其他節點。作為其一項完整性檢查,scha_control() 將呼叫 Monitor_check (如果已定義) 以確定請求的節點是否足以主控含有資源的資源群組。如果返回的 Monitor_check 報告節點不可靠,或方法逾時,則 RGM 將尋找其他節點來執行容錯移轉請求。如果 Monitor_check 在所有節點上均失敗,則取消容錯移轉。

資源監視器可以設定 StatusStatus_msg 特性以反映監視器的資源狀態檢視。使用 scha_resource_setstatus() RMAPI 函數、scha_resource_setstatus 指令或 scds_fm_action() DSDL 函數來設定這些特性。


備註 –

儘管 StatusStatus_msg 特性專用於資源監視器,任何程式均可設定這些特性。


請參閱定義故障監視器,以取得使用 RMAPI 實作的故障監視器之範例。請參閱SUNW.xfnts 故障監視器,以取得使用 DSDL 實作的故障監視器之範例。請參閱「Sun Cluster Data Services Planning and Administration Guide for Solaris OS」,以取得有關在 Sun 提供的資料服務中所建立的故障監視器之資訊。

將訊息記錄加入資源

如果您要將狀況訊息與其他叢集訊息記錄在同一記錄檔中,請使用簡易函數 scha_cluster_getlogfacility() 來擷取記錄叢集訊息所使用的工具編號。

將此工具編號與一般的 Solaris syslog() 函數配合使用,以將訊息寫入叢集日誌。您還可以透過一般的 scha_cluster_get() 介面,存取叢集日誌工具資訊。

提供程序管理

RMAPI 與 DSDL 提供程序管理工具,以實施資源監視器與資源控制回呼。RMAPI 定義以下工具︰

程序監視器工具 (PMF)︰pmfadmrpc.pmfd

提供監視程序及其附屬程序的方法,以及在程序中止時重新啟動程序的方法。此工具由啟動和控制監視的程序之 pmfadm 指令以及 rpc.pmfd 常駐程式構成。

DSDL 提供一組函數 (由名稱 scds_pmf_ 處理) 來實作 PMF 功能性。請參閱PMF 函數,以取得 DSDL PMF 功能性簡介以及個別函數的清單。

pmfadm(1M)rpc.pmfd(1M) 線上手冊更詳細地說明了此指令和常駐程式。

halockrun

保持檔案鎖定時用於執行子程式的程式。此指令便於在 shell 程序檔中使用。

halockrun(1M) 線上手冊更詳細地說明了此指令。

hatimerun

在逾時控制下執行的子程式的程式。此指令便於在 shell 程序檔中使用。

DSDL 提供 scds_hatimerun() 函數,以實作 hatimerun 功能性。

hatimerun(1M) 線上手冊更詳細地說明了此指令。

為資源提供管理支援

叢集管理員在資源上執行的動作包含設定與變更資源特性。API 定義 ValidateUpdate 回呼方法,從而讓您可以建立攔截這些管理動作的程式碼。

當叢集管理員更新資源或其所在群組的特性時,RGM 將呼叫可選用的 Validate 方法。RGM 會將資源及其所在資源群組的特性值傳送給 Validate 方法。RGM 將在由資源類型的 Init_nodes 特性所指定的叢集節點集上呼叫 Validate。請參閱資源類型特性rt_properties(5) 線上手冊,以取得有關 Init_nodes 的資訊。RGM 會在套用建立或更新之前呼叫 Validate。在任何導致建立或更新發生故障的節點上,故障會結束此方法的程式碼。

RGM 僅在叢集管理員變更資源或群組特性時呼叫 Validate,而不是在 RGM 設定特性,或在監視器設定 StatusStatus_msg 資源特性時。

RGM 呼叫可選用的 Update 方法,以通知執行中的資源其特性已變更。在叢集管理員成功設定資源或其群組的特性後,RGM 將執行 Update。RGM 在資源上線運作的節點上呼叫該方法。該方法可以使用 API 存取函數,以讀取可能影響使用中資源的特性值,並相應地調整正在執行的資源。

實施故障轉移資源

容錯移轉資源群組含有網路位址 (如內建資源類型 LogicalHostnameSharedAddress) 以及容錯移轉資源 (如容錯移轉資料服務的資料服務應用程式資源)。當資料服務進行容錯移轉或切換保護轉移時,網路位址資源及其附屬資料服務資源將在叢集節點之間移動。RGM 提供多種支援故障轉移資源實作的特性。

將布林值 Failover 資源類型特性設定為 TRUE,以限制在可以同時在多個節點上置於線上的資源群組中配置資源。此特性的預設值為 FALSE,因此您必須在 RTR 檔案中為容錯移轉資源宣告為 TRUE

Scalable 資源特性將決定資源是否使用叢集共用的位址工具。對於容錯移轉資源,將 Scalable 設定為 FALSE,因為容錯移轉資源不使用共用的位址。

RG_mode 資源群組特性可以讓叢集管理員識別資源群組是容錯移轉群組還是可延伸群組。如果 RG_modeFAILOVER,則 RGM 將群組的 Maximum_primaries 特性設定為 1,並限制資源群組由單一節點主控。RGM 不允許在 RG_modeSCALABLE 的資源群組上建立 Failover 特性為 TRUE 的資源。

Implicit_network_dependencies 資源群組特性指定 RGM 應該強制執行群組中的非網路位址資源對所有網路位址資源 (LogicalHostnameSharedAddress) 之明確的強相依性。因此,直到將群組中的網路位址配置為線上時,才會呼叫群組中的非網路位址 (資料服務) 資源的 Start 方法。Implicit_network_dependencies 特性預設為 TRUE

實施可延伸資源

可延伸資源可以同時在多個節點上置於線上。可延伸資源包含資料服務,如用於 Sun Java System Web Server 的 Sun Cluster HA (以前為用於 Sun ONE Web Server 的 Sun Cluster HA) 和用於 Apache 的 Sun Cluster HA。

RGM 會提供許多支援實作可延伸資源的特性。

將布林值 Failover 資源類型特性設定為 FALSE,以允許在可以同時在多個節點上處於線上的資源群組中配置資源。

Scalable 資源特性將決定資源是否使用叢集共用的位址工具。將此特性設定為 TRUE,因為可延伸服務使用共用的位址資源以使可延伸服務的多個實例顯示為對客戶端的單一服務。

RG_mode 特性可讓叢集管理員識別資源群組為故障轉移資源群組或可延伸資源群組。如果 RG_modeSCALABLE,則 RGM 會允許 Maximum_primaries 具有大於 1 的值,也就是說群組可以由多個節點同時主控。RGM 允許在 RG_modeSCALABLE 的資源群組中創設 Failover 特性為 FALSE 的資源。

叢集管理員建立可延伸資源群組以含有可延伸服務資源,建立單獨的容錯移轉資源群組以含有可延伸的資源所附屬的共用位址資源。

叢集管理員使用 RG_dependencies 資源群組特性,指定在某節點上使資源群組上線或者離線所依據的順序。此排序對於可延伸服務很重要,這是因為可延伸資源與其所依賴的共用位址資源位於不同的資源群組中。可延伸資料服務要求其網路位址 (共用位址) 資源在啟動該資料服務之前已配置完成。因此,叢集管理員必須將 RG_dependencies 特性 (含有可延伸服務的資源群組之特性) 設定為包含含有共用的位址資源之資源群組。

當您在 RTR 檔案中宣告資源的 Scalable 特性時,RGM 會自動為資源建立以下可延伸特性集。

Network_resources_used

識別此資源使用的共用位址資源。此特性預設為空字串,因此叢集管理員必須在建立資源時提供可延伸服務使用的共用位址之實際清單。scsetup 指令和 SunPlex Manager 提供可自動設置可延伸服務之必備資源和群組之功能。

Load_balancing_policy

指定資源的負載平衡策略。您可以在 RTR 檔案中明確設定策略 (或允許預設值 LB_WEIGHTED)。在其他情況下,叢集管理員可以在建立資源時變更此值 (除非您在 RTR 檔案中將 Load_balancing_policyTunable 設定為 NONEFALSE)。以下為您可以使用的合法值︰

LB_WEIGHTED

負載是依照 Load_balancing_weights 特性中所設定的權重而在各節點中進行分配的。

LB_STICKY

總是將可延伸服務的給定用戶端 (由用戶端 IP 位址識別) 發送到叢集的同一個節點。

LB_STICKY_WILD

連接萬用字元 sticky 服務之 IP 位址的給定用戶端 (以用戶端的 IP 位址來識別) 始終被傳送到同一叢集節點,無論其目標通訊埠編號為何。

對於具有 LB_STICKYLB_STICKY_WILDLoad_balancing_policy 的可延伸服務,在服務處於線上時變更 Load_balancing_weights 可能導致重設現有的用戶端關聯性。在此情況下,即使叢集中的一個節點先前已服務過用戶端,其他節點也可能服務隨後的用戶端請求。

同樣地,在叢集上啟動服務的新實例可能會重設現有的用戶端關聯性。

Load_balancing_weights

指定要發送至每個節點的負載。其格式為 weight@node,weight@node,其中 weight 是一個整數,反映分配到指定的 node 之負載的相對部分。分配到節點的負載分數值,是此節點的權重除以使用中實例的權重總量。例如,1@1,3@2 指定節點 1 接收負載量的四分之一,節點 2 接收負載量的四分之三。

Port_list

識別伺服器要在其上進行偵聽的通訊埠。此特性預設為空字串。您可以在 RTR 檔案中提供通訊埠清單。否則,叢集管理員在建立資源時必須提供通訊埠的實際清單。

您可以建立可以由叢集管理員配置為可延伸或容錯移轉的資料服務。若要如此,請在資料服務的 RTR 檔案中宣告 Failover 資源類型特性和 Scalable 資源特性為 FALSE。指定 Scalable 特性在建立時可調。

Failover 特性值 FALSE 允許將資源配置到可延伸資源群組。叢集管理員可以在建立資源時透過將 Scalable 的值變更為 TRUE 來啟用共用位址,以建立可延伸服務。

另一方面,即使 Failover 設定為 FALSE,叢集管理員仍可將資源配置到容錯移轉資源群組,以實作容錯移轉服務。叢集管理員不變更 Scalable 的值 (為 FALSE)。若要支援此情形,您應該在 Scalable 特性上使用 Validate 方法進行檢查。如果 ScalableFALSE,請驗證資源是否已配置到容錯移轉資源群組。

「Sun Cluster 概念指南 (適用於 Solaris 作業系統)」含有有關可延伸資源的附加資訊。

可延伸服務的驗證檢查

每當使用設定為 TRUE 的可延伸特性建立或更新資源時,RGM 均會驗證各種資源特性。如果未正確配置特性,則 RGM 會拒絕所嘗試的更新或建立。RGM 執行下列檢查:

寫入與測試資料服務

使用 TCP 持續作用來保護伺服器

在伺服器端,使用 TCP 持續作用來保護伺服器避免因當機的 (或網路分割的) 用戶端而消耗系統資源。如果沒有清除長時間當機的伺服器中的資源,則最終在用戶端當機和重新啟動時,消耗的資源會無限制地增長。

如果主從式通訊使用 TCP 串流,則用戶端和伺服器均應該啟用 TCP 持續作用機制。甚至在非 HA 的單一伺服器情形下,此規定也適用。

其他導向連接協定也可以具有持續連接機制。

在用戶端一端,使用 TCP 持續作用啟用用戶端,以在網路位址資源從一個實體主機容錯移轉或切換保護轉移至其他實體主機時得到通知。網路位址資源的該傳送會中斷 TCP 連接。然而,除非用戶端已啟用持續連接,否則,如果當時連接突然中斷,該用戶端未必會獲悉連接中斷。

例如,假定用戶端等待伺服器對長時間要求的回應,用戶端的要求訊息已經到達伺服器,並且在 TCP 層已對該訊息做出回應。在此情形下,用戶端的 TCP 模組無需持續重新傳輸請求。而且,用戶端應用程式被鎖定,等待對請求的回應。

如果可能,除使用 TCP 持續作用機制之外,用戶端應用程式還必須在其層級上執行自己的定期持續作用。TCP 持續作用機制並非適用於所有可能界限內的情況。使用應用程式層級的持續作用通常要求主從式協定支援空作業或至少一個有效的唯讀作業,例如狀態作業。

測試 HA 資料服務

本小節提供有關如何在 HA 環境中測試資料服務實作之建議。這些測試情況是一些建議,並不十分詳盡。您需要存取測試平台 Sun Cluster 配置,從而使測試工作不影響生產機器。

測試 HA 資料服務是否於資源群組在實體主機上移動的所有情況中正常運作。這些情況包括系統當機與使用 scswitch 指令。測試用戶端機器在這些事件之後是否繼續獲取服務。

測試方法的等冪性。例如,暫時將每種方法取代為呼叫原來方法兩次或多次之簡短 shell 程序檔。

協調資源之間的相依性

有時候,在執行用戶端請求時,一個主從式資料服務會請求其他主從式資料服務。例如,資料服務 A 附屬於資料服務 B,如果請求 A 提供服務,則 B 必須提供其服務。Sun Cluster 透過允許在資源群組內配置資源相依性來提供此要求。此相依性會影響 Sun Cluster 啟動與停止資料服務所依據的順序。請參閱 scrgadm(1M) 線上手冊,以取得詳細資訊。

如果某一資源類型的資源附屬於其他類型的資源,您需要指導叢集管理員正確配置資源和資源群組。或者,提供正確配置資源和資源群組的程序檔或工具。如果附屬資源必須在同一節點上作為「所附屬的」資源執行,則這兩種資源必須配置於同一資源群組。

決定是否使用明確的資源相依性,或將其省略並輪詢 HA 資料服務的自有程式碼中其他資料服務的可用性。為了使相依與被相依的兩種資源可以在不同節點上執行,請將它們配置到獨立的資源群組。在此情況下必須輪詢,因為不可能跨群組配置資源相依性。

某些資料服務本身不直接儲存資料,而是依賴於其他後端資料服務來儲存其所有資料。這樣的資料服務將所有讀取要求與更新要求轉換為對後端資料服務的呼叫。例如,考量假定的主從式約會行事曆服務將其所有資料儲存於 SQL 資料庫 (如 Oracle)。該約會日曆服務有其自己的主從式網路協定。例如,它可能已使用 RPC 規格語言( 例如,ONC RPC) 定義了其協定。

在 Sun Cluster 環境中,您可以使用 HA-ORACLE 使後端 Oracle 資料庫高度可用。然後,您可以寫入啟動和停止約會行事曆常駐程式的簡單方法。叢集管理員會在 Sun Cluster 中註冊約會行事曆資源類型。

如果約會行事曆應用程式必須在與 Oracle 資料庫相同的節點上執行,則叢集管理員會在與 HA-ORACLE 資源相同的資源群組中配置約會行事曆資源,使約會行事曆資源附屬於 HA-ORACLE 資源。使用在 scrgadm 中的 Resource_dependencies 特性標記指定此相依性。

如果 HA-ORACLE 資源可以在與約會行事曆資源不同的節點上執行,則叢集管理員會將其配置到兩個獨立的資源群組中。叢集管理員可能在 Oracle 資源群組上配置行事曆資源群組的資源群組相依性。但是,僅當在同一節點上同時啟動或停止兩組資源群組時,資源群組相依性才有效。因此,在啟動日曆資料服務常駐程式之後,該常駐程式可以在等待 Oracle 資料庫變得可用時進行輪詢。在此情形下,行事曆資源類型的 Start 方法通常傳回成功。但是,如果 Start 方法被無限期鎖定,此方法會將資源群組置於忙碌狀態。此忙碌狀態會阻止進一步的狀態變更,例如在群組上編輯、容錯移轉或切換保護轉移。但是,如果行事曆資源的 Start 方法逾時或以非零狀態結束,其逾時或非零結束狀態可能導致當 Oracle 資料庫不可用時資源群組在兩個或更多節點之間反復。