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 5.8 或更高版本 Solaris 作業系統的 Developer 或 Entire Distribution 軟體群組。


使用本節中的程序來:

設定開發環境

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

  1. 成為超級使用者,或成為對等角色並將目錄變更為您要使用的 CD-ROM 目錄。


    # cd CD-ROM_directory
    
  2. 在目前目錄中安裝 SUNWscdev 套件。


    # pkgadd -d . SUNWscdev
    
  3. 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 自動將 RTR 檔案和資料服務程式碼封裝在一起。


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

Sun Cluster 提供一組資源類型特性和資源特性,您可以使用這些特性定義資料服務的靜態配置。資源類型特性指定資源的類型、資源的版本、API 的版本等,同時還指定每個回呼方法的路徑。資源類型特性列出了全部資源類型特性。

資源特性 (如 Failover_modeThorough_probe_interval) 和方法逾時還定義了資源的靜態配置。動態資源特性 (如 Resource_stateStatus) 反映受管理資源的作用中狀態。資源特性描述了資源特性。

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

因為 Agent Builder 宣告的特性集對任意資料服務都是有用且必需的,所以建議您使用 Agent Builder 產生資料服務的 RTR 檔案。例如,必須在 RTR 檔案中宣告某些特性 (如 Resource_type),否則資料服務的註冊將會失敗。儘管其他特性非必需,但除非系統管理員在 RTR 檔案中對其進行宣告,否則將無法使用;然而有些特性無論您是否對其進行宣告都可用,這是因為 RGM 定義它們並提供預設值。為了避免此層複雜性,您可簡單地使用 Agent Builder 來保證產生正確的 RTR 檔案。如果需要,您可以稍後編輯 RTR 檔案來變更特定值。

本小節的其餘部分將為您完整介紹一個 Agent Builder 建立的 RTR 檔案範例。

宣告資源類型特性

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


注意 –

一種資源類型特性 Installed_nodes 可由系統管理員配置。實際上,它僅可由系統管理員配置,您無法在 RTR 檔案中宣告它。


資源類型宣告的語法為:


property_name = value;

注意 –

RGM 處理特性名稱時不區分大小寫。在 Sun 提供的 RTR 檔案中,除了方法名稱,特性的慣例是名稱的第一個字母大寫,而其餘的字母小寫。方法名稱以及特性性質包含的都是大寫字母。


以下為資料服務範例 (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,請將其作為公司定義資源類型的證券符號。資源類型名稱在叢集中必須是唯一的。


注意 –

依慣例,資源類型名稱 (Resource_typeVendor_id) 將作為套件名稱。由於套件名稱被限制為最多使用九個字元,因此儘管 RGM 不執行此限制,將這兩個特性的字元總數限制為九個或更少也是個好主意。另一方面,Agent Builder 明確地從資源類型名稱產生套件名稱,因此它確實執行九個字元的限制。


RT_version

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

API_version

識別 API 的版本。例如,API_version = 2 表示資料服務在 Sun Cluster 版本 3.0 下執行。

Failover = TRUE

指示資料服務無法在可以同時於多個節點上連線的資源群組中執行,即指定故障轉移資料服務。請參閱將資料服務傳送至叢集,以取得詳細資訊。

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 = AT_CREATION;
        DEFAULT = ;
}

這些資源特性宣告新增了 TUNABLE 性質,該性質會限制系統管理員可以變更其值的機會。AT_CREATION 表示管理員僅能在建立資源時指定值,而以後則無法變更該值。

對於這些特性中的大多數,您可以接受 Agent Builder 產生的預設值,除非需要對其進行變更。以下是有關這些特性的資訊 (如需其他資訊,請參閱資源特性r_properties(5) 線上說明手冊):

Failover_mode

指示 RGM 在 StartStop 方法失敗的情況下,是應重新配置資源群組還是中斷該節點。

Thorough_probe_intervalRetry_countRetry_interval

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

Network_resources_used

資料服務使用的邏輯主機名稱或共用位址資源清單。Agent Builder 宣告此特性,以便系統管理員可在配置資料服務時指定一系列的資源 (如果有的話)。

Scalable

設定為 FALSE,以指示此資源不使用叢集網路 (共用位址) 工具。此設定與設定為 TRUE (表示故障轉移服務) 的資源類型 Failover 特性一致。請參閱將資料服務傳送至叢集實施回呼方法,以取得有關如何使用此特性的其他資訊。

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),以取得詳細資訊。

您可以在使用者加入的程式碼註釋所分割的區域內建立附加延伸特性。

實施回呼方法

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

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

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

DSDL 提供一組存取系統定義特性的 C 函式 (每個特性一個),以及一個存取延伸特性的函式。請參閱 scds_property_functions(3HA) scds_get_ext_property(3HA) 線上說明手冊。

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


注意 –

叢集管理員可以使用 scrgadm 指令、透過可用圖形管理指令或透過可用圖形管理介面設定特定的資源特性。但是,請勿自任何回呼方法呼叫 scrgadm,這是因為在叢集重新配置期間,即 RGM 呼叫該方法時,scrgadm 會失敗。


方法的等冪性

RGM 一般不會在同一資源上以相同的引數連續多次呼叫一個方法。但是,如果 Start 方法失敗,即使資源從未啟動,RGM 也會在該資源上呼叫 Stop 方法。同樣,資源常駐程式可能會自動終止,而 RGM 仍然會在其上呼叫其 Stop 方法。這些情形也同樣適用於 Monitor_startMonitor_stop 方法。

鑒於這些原因,您必須在 StopMonitor_stop 方法中建置等冪性。在同一資源上用相同參數重複呼叫 StopMonitor_stop 可獲得與單一呼叫相同的結果。

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


注意 –

InitFiniBoot 以及 Update 方法也必須具有等冪性。Start 方法不需要具有等冪性。


一般資料服務

一般資料服務 (GDS) 是一種透過將簡單應用程式插入 Sun Cluster 的資源群組管理員架構,使這些應用程式高度可用或具可延伸性的機制。此機制不需要代理程式的編碼,該編碼為使應用程式高度可用或可延伸的典型方法。

GDS 模型依賴預先編譯的資源類型 SUNW.gds 來與 RGM 框架相互作用。

請參閱第 10 章, 一般資料服務,以取得其他資訊。

控制應用程式

每當節點處於加入或離開叢集的過程中,回呼方法即會啟用 RGM 來控制基礎資源 (應用程式)。

啟動與停止資源

資源類型實現至少需要 Start 方法和 Stop 方法。RGM 在適當節點、適當時機呼叫資源類型的方法程式,以使資源群組離線與上線運作。例如,叢集節點當機之後,RGM 會將該節點主控的所有資源群組移至新節點。您必須實施 Start 方法,為 RGM 提供重新啟動存活主機節點上每個資源的方法。

Start 方法必須在資源已啟動且在本機節點上可用之後才傳回。請確保為初始化時間長的資源類型在其 Start 方法上設定足夠長的逾時 (在資源類型註冊檔案中設定 Start_timeout 特性的預設值和最小值)。

您必須為 RGM 使資源群組離線的情形實施 Stop 方法。例如,假定某資源群組在 Node1 上離線又在 Node2 上恢復線上狀態。在使該資源群組離線時,RGM 在該群組的資源上呼叫 Stop 方法來停止 Node1 上的所有作業。在 Node1 上對所有資源執行完 Stop 方法後,RGM 將使該資源群組在 Node2 上恢復線上狀態。

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

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

決定要使用的 StartStop 方法

本節提供有關何時使用 StartStop 方法與何時使用 Prenet_start Postnet_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 方法停止資料服務。

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

如果資料服務需要在其啟動與停止時取消配置網路位址,請使用 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 方法,或者兩者都使用,均必須考慮伺服器與用戶端的需求與行為。

InitFini 以及 Boot 方法

三種可選用的方法 (InitFiniBoot) 均可使 RGM 在資源上執行初始化程式碼與終止程式碼。當資源成為受管理狀態 (即資源所在的資源群組從未受管理狀態切換為受管理狀態,或者在已受管理的資源群組中建立資源) 時,RGM 會呼叫 Init 方法以執行資源的一次性初始化。

當資源成為未受管理狀態 (即資源所在的資源群組切換為未受管理狀態,或者從受管理的資源群組中刪除資源) 時,RGM 會呼叫 Fini 方法以清除該資源。清除作業必須等冪,即如果清除作業已經完成,則 Fini 會退出 0 (成功)。

RGM 在新近連結叢集 (即,已經啟動或者重新啟動) 的節點上呼叫 Boot 方法。

Boot 方法通常執行與 Init 相同的初始化。此初始化作業必須等冪,即如果已經在本機節點上初始化資源,則 BootInit 會退出 0 (成功)。

監視資源

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

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

儘管 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 在所有的節點上均失敗,則會取消故障轉移。

資源監視器可以設定 Status 特性與 Status_msg 特性,以反映監視器對資源狀態的觀點。請使用 RMAPI scha_resource_setstatus() 函式、 scha_resource_setstatus 指令或者 DSDL scds_fm_action() 函式來設定這些特性。


注意 –

儘管 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 定義下列工具 (請參閱線上援助頁,以取得有關其中每個指令與程式的詳細資訊):

程序監視設備:pmfadmrpc.pmfd

程序監視設備 (PMF) 提供監視程序及其子代以及當程序失效時重新啟動程序的方法。該工具由用來啟動和控制受監視程序的 pmfadm 指令和 rpc.pmfd 常駐程式組成。

halockrun

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

hatimerun

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

DSDL 提供 scds_hatimerun 函式,以實施 hatimerun 功能性。

DSDL 提供實施 PMF 功能性的函式集 (scds_pmf_*)。請參閱PMF 函式,以取得 DSDL PMF 功能性的概觀以及個別函式的清單。

為資源提供管理支援

資源上的管理動作包括設定與變更資源特性。API 定義 Validate 回呼方法與 Update 回呼方法,以便可以鉤住這些管理動作。

在建立資源時以及在管理動作更新資源或資源所在群組的特性時,RGM 會呼叫可選用的 Validate 方法。RGM 會將資源及其所在資源群組的特性值傳送給 Validate 方法。RGM 在資源類型的 Init_nodes 特性 (請參閱資源類型特性或者 rt_properties(5) 線上說明手冊,以取得關於 Init_nodes 的資訊) 所指示的叢集節點集上呼叫 Validate。RGM 在套用建立或更新之前呼叫 Validate,則任何節點上的方法故障退出碼都會導致建立或更新失敗。

僅當透過管理動作變更資源或群組特性時,RGM 才會呼叫 Validate,而在 RGM 設定特性或監視器設定資源特性 StatusStatus_msg 時,RGM 不會呼叫該方法。

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

實施故障轉移資源

故障轉移資源群組包含網路位址 (例如,內建的資源群組邏輯主機名稱與共用位址) 與故障轉移資源 (例如,故障轉移資料服務的資料服務應用程式資源)。當資料服務故障轉移或切換保護移轉時,網路位址資源及其相依的資料服務資源在叢集節點之間移動。RGM 提供多種支援故障轉移資源實作的特性。

將布林資源類型特性 Failover 設定為 TRUE,以限制在一次可在多個節點上連線的資源群組中對資源進行配置。此特性預設為 FALSE,因此您必須在 RTR 檔案中針對故障轉移資源將此特性宣告為 TRUE

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

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

Implicit_network_dependencies 資源群組特性指定 RGM 應該在群組內執行非網路位址資源對所有網路位址資源 (邏輯主機名稱與共用位址) 的隱含牢固相依性。這表明在完成群組中的網路位址配置之前,將不會呼叫群組中非網路位址 (資料服務) 資源上的 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 允許 Failover 特性為 FALSE 的資源群組創設在 RG_modeSCALABLE 的資源群組中。

叢集管理員建立一個可延伸資源群組 (用來納入可延伸服務資源) 與一個獨立的故障轉移資源群組 (用來納入可延伸資源所依賴的共用位址資源)。

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

當您在 RTR 檔案中針對資源宣告 Scalable 特性時,RGM 會自動為資源建立下列一組可延伸特性:

Network_resources_used

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

Load_balancing_policy

指定資源的負載平衡策略。您可以在 RTR 檔案中明確設定該策略 (或者允許預設值 LB_WEIGHTED)。無論在哪種情況下,叢集管理員均可以在建立資源時變更該值 (除非您在 RTR 檔案中將 Load_balancing_policyTunable 設定為 NONE 或者 FALSE)。合法值包括:

LB_WEIGHTED

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

LB_STICKY

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

LB_STICKY_WILD

總是將連接到萬用字元黏性服務的 IP 位址之給定用戶端 (由用戶端 IP 位址識別) 發送到同一個叢集節點,而不管該用戶端將要到哪個通訊埠編號。

對於使用 Load_balancing_policyLB_STICKY 或者 LB_STICKY_WILD 的可延伸服務,當服務處於線上狀態時變更 Load_balancing_weights 可能導致重設現有用戶端的相似性。在這種情況下,其他節點可能會處理後續用戶端的要求,即使該用戶端先前是由叢集中的另一個節點處理的。

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

Load_balancing_weights

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

Port_list

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

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

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

另一方面,即使 Failover 設定為 FALSE,管理員也可以將資源配置到故障轉移資源群組,以實施故障轉移服務。管理員不會變更 Scalable 的值 FALSE。為了支援此偶然性,您應該使用 Validate 方法對 Scalable 特性進行檢查。如果 ScalableFALSE,請驗證是否已將該資源配置到故障轉移資源群組。

Sun Cluster 概念指南 (適用於 Solaris 作業系統)包含有關可延伸資源的其他資訊。

可延伸服務的驗證檢查

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

寫入與測試資料服務

本節提供有關寫入與測試資料服務的一些資訊。

使用持續連接

在伺服器端,針對非作用中 (或者網路分割) 的用戶端使用 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 資料庫保持無法使用狀態。