系統管理員需要有能力安裝與註冊現有資源類型的新版本,以允許註冊多版本給定資源類型,以及將現有資源類型遷移至新版本的資源類型,而不必刪除或重新建立該資源。 資源開發者需要瞭解提供資源類型升級與資源遷移的要求。
新版本資源類型與舊版資源類型相比有以下幾方面不同:
資源類型屬性的性質可變更
宣告的資源屬性集 (包含標準屬性與延伸屬性) 可變更
宣告的方法集可不同
方法或監視器的實作可變更。
資源類型開發者決定何時可以將現有的資源從以下可調性選項中遷移至新版本。 選項以受限制性從最少到最多的順序列出:
隨時 (Anytime)
資源未監視時 (When_unmonitored)
資源離線時 (When_offline)
資源停用時 (When_disabled)
資源群組未受管理時 (When_unmanaged)
建立時 (At_creation)
在本章中,討論如何進行升級時均會使用 scrgadm 指令。 管理員不受限於僅使用 scrgadm 指令,也可以使用 GUI 或 scsetup 指令來進行升級。
資源類型名稱的三個程式元件為在 RTR 檔案中指定為 Vendor_id、Resource_type 和 RT_version 的屬性。 scrgadm 指令將插入句點分割元與逗號分割元,以建立資源類型的名稱:
vendor_id.resource_type:rt_version |
Vendor_id 前綴用來區別兩個由不同供應商提供的相同名稱的註冊檔案。 RT_version 區別具有相同基本資源類型 的多個註冊版本 (升級)。 為了確保 Vendor_id 是唯一的,建議的方法是使用公司建立資源類型的證券代號。
如果 RT_version 字串包含空白、定位符、斜線 (/)、反斜線 (\)、星號 (*)、問號 (?)、逗號 (,)、分號 (;)、左方括號 ([) 或右方括號 (]) 字元,註冊資源類型將失敗。
RT_Version 屬性 (在 Sun Cluster 3.0 中可選用) 在 Sun Cluster 3.1 中是一個強制字串。
scha_resource_get -O Type -R resource_name -G resource_group_name |
在 Sun Cluster 3.1 之前註冊的資源類型名稱將繼續使用以下語法:
vendor_id.resource_type |
支援升級之資源類型的 RTR 檔案必須包含 #$upgrade 指令,其後不跟隨以下格式的指令,或跟隨多個:
#$upgrade_from version tunability |
upgrade_from 指令包含字串 #$upgrade_from,該字串後跟隨 RT_Version,然後是資源的可調性限制。 如果對其正在執行升級的資源類型不屬於某個版本,則會將 RT_Version 指定為一個空字串,如以下最後一個範例所示:
#$upgrade_from "1.1" when_offline #$upgrade_from "1.2" when_offline #$upgrade_from "1.3" when_offline #$upgrade_from "2.0" when_unmonitored #$upgrade_from "2.1" anytime #$upgrade_from "" when_unmanaged |
當系統管理員嘗試變更資源 Type_version 時,RGM 將實施這些針對資源的限制。 如果目前版本的資源類型未顯示在清單中,則 RGM 將強加 When_unmanaged 的可調性。
這些指令必須顯示在 RTR 檔案的資源類型屬性宣告區段與 RTR 檔案的資源宣告區段之間。 請參閱 rt_reg(4)。
每當變更 RTR 檔案中的內容時,請變更 RTR 檔案中的 RT_Version 字串。 此屬性的值必須明確指出哪一個是新版本的資源類型以及哪一個是舊版本的資源類型。 如果未對 RTR 檔案進行任何變更,則無需變更 RT_Version 字串。
Sun Cluster 3.0 中的資源類型名稱不包含版本後綴:
vendor_id.resource_name |
即使在您將叢集軟體升級為 Sun Cluster 3.1 或更高版本之後,原來在 Sun Cluster 3.0 下註冊的資源類型仍將繼續使用此格式的名稱。 同樣,如果 RTR 檔案在執行於 Sun Cluster 3.1 或更高版本軟體的叢集上進行了註冊,則其 RTR 檔案遺失了 #$upgrade 指令的資源類型將被提供一個 Sun Cluster 3.0 格式的名稱,且沒有版本後綴。
您可以使用 Sun Cluster 3.0 中的 #$upgrade 或 #$upgrade_from 指令來註冊 RTR 檔案,但不支援將現有的資源遷移至 Sun Cluster 3.0 中的新資源類型。
標準資源 屬性 Type_version 將儲存資源類型的 RT_Version 屬性。 該屬性不會顯示在 RTR 檔案中。 系統管理員將透過使用以下指令來編輯此屬性值:
scrgadm -c -j resource -y Type_version=new_version |
目前版本的資源類型
RTR 檔案中的 #$upgrade_from 指令
如果已知新資源類型版本的 Update 方法、Stop 方法、Monitor_check 方法和 Postnet_stop 方法與舊資源類型版本的啟動方法 (Prenet_stop 和 Start) 相容,並且如果已知新資源類型版本的 Fini 方法與舊版本的 Init 方法相容。 該方案僅需在升級之前停止該資源監視器程式
如果已知新資源類型版本的 Update、Stop、Monitor_check 方法或 Postnet_stop 方法與較舊資源類型版本的啟動方法 (Prenet_stop 和 Start) 不相容,但與較舊版本的 Init 方法相容,當將類型升級套用至資源時,該資源必須處於離線狀態。
如果新資源類型版本的 Fini 方法與較舊版本的 Init 方法不相容。 該可調性值需要現有資源群組切換到不受管理狀態,然後您才可以升級資源。
如果資源無法升級為新資源類型版本。 僅可以建立新版本的新資源。
At_creation 的可調性意味著資源類型開發者可以禁止將現有資源遷移至新類型。 在這種情況下,系統管理員必須先刪除資源然後重新建立資源。 這樣相當於宣告僅可以在建立時設定資源的版本。
系統管理員編輯資源的 Type_version 屬性時,現有的資源將具有新資源類型版本。 這將遵循用來編輯其他資源屬性的相同慣例執行,除了某些資訊將源自或取自新資源類型版本而非目前版本之外:
所有屬性的資源屬性性質 (如 min、max、arraymin、arraymax、預設以及可調性) 都取自新資源類型版本
可套用至 Type_version 屬性的可調性取自 RTR 檔案中的 #$upgrade_from 指令以及現有資源的資源類型之 RT_version 屬性。 此可調性與 property_attributes(5) 中描述的可調性不同。
將會套用新資源類型版本的 Validate 方法。 這將確保屬性性質對於新資源類型有效。 如果現有的資源屬性性質不符合新資源類型版本的驗證條件,系統管理員必須透過 scrgadm 指令行提供此類屬性的有效值。 如果新資源類型版本開始使用未在舊版本中宣告且不具有預設值的屬性,可能會出現這種情況。 如果現有資源的某個屬性被指定了對於新資源類型版本無效的值,也可能出現這種情況。
在舊版本資源類型中宣告的資源屬性可以在新版本資源類型中不宣告。 當將資源遷移至新版本時,屬性將從資源中刪除。
Validate 方法可以查詢資源的目前 Type_version (使用 scha_resource_get) 以及新 Type_version (其透過 Validate 指令行傳送)。 因此,Validate 可以排除不受支援版本的升級。
Sun Cluster Data Services Planning and Administration Guide for Solaris OS中的「Upgrading a Resource Type」 一節包含有關升級或遷移資源類型的其他資訊。
讀取新資源類型的升級說明文件,以找出資源類型變更與資源可調性限制。
在所有叢集節點上安裝資源類型升級套件。
安裝新資源類型套件所建議的練習處於滾動升級模式: 當在非叢集模式中啟動節點時,pkgadd 將會出現。
以下是在叢集模式中的節點上可安裝新資源類型套件的情形:
如果資源類型套件安裝保持方法程式碼不變更,而僅更新監視器,則有必要在安裝期間停止對所有該類型資源的監視。
如果資源類型套件安裝保持方法程式碼與監視器程式碼都不變更,則沒有必要在安裝期間停止對資源的監視,因為安裝僅將新 RTR 檔案置於磁碟上。
使用 scrgadm (或對等) 指令註冊新資源類型版本,參考 RTR 檔案的升級。
RGM 將建立一個新資源類型,其名稱的格式為
vendor_id.resource_type:version |
如果資源類型升級僅安裝在節點的子集上,則您必須將新資源類型的 Installed_nodes 屬性設定為在其上實際安裝新資源類型的節點。
當資源具有新類型 (透過新建或更新) 時,RGM 將需要資源群組 nodelist 為資源類型的 Installed_nodes 清單之子集。
scrgadm -c -t resource_type -h installed_node_list |
對於預先升級類型 (將要遷移至升級的類型) 的每一個資源,請呼叫 scswitch 以將資源或其資源群組的狀態變更為由升級說明文件指示的適當狀態。
對於預先升級類型 (將要遷移至升級的類型) 的每一個資源,請編輯資源並將其 Type_version 屬性變更為新版本。
scrgadm -c -j resource -y Type_version=new_version |
如有必要,您可以透過相同指令將相同資源的其他屬性編輯為適當的值。
透過反轉在步驟 5中呼叫的指令,回復到資源或資源群組的上一個狀態。
您可以將資源的資源類型降級為舊版本。 您可以將資源降級為舊版本資源類型時的條件比您將資源升級為新版本資源類型時的條件更嚴格。 您必須首先取消對資源群組的管理。 此外,您僅可以將資源降級為資源類型的允許升級版本。 您可以透過使用 scrgadm -p 指令來識別允許升級的版本。 在輸出中,允許升級的版本包含後綴:version。
將包含要降級的資源之資源群組切換為離線狀態。
scswitch -F -g resource_group |
停用要降級的資源與資源群組中的所有資源。
scswitch -n -j resource_to_downgrade scswitch -n -j resource1 scswitch -n -j resource2 scswitch -n -j resource3 ... |
依相依順序停用檔案,以最大相依 (應用程式資源) 開始並以最小相依 (網路位址資源) 結束。
取消管理資源群組。
scswitch -u -g resource_group |
若要,請跳至下一個步驟。
若否,請重新註冊需要的舊版本。
scrgadm -a -t resource_type_name |
透過指定您需要的舊版本 Type_version 來降級資源。
scrgadm -c -j resource_to_downgrade -y Type_version=old_version |
如有必要,您可以透過相同指令將相同資源的其他屬性編輯為適當的值。
使包含降級資源的資源群組處於受管理狀態,啟用所有資源並切換群組上線運作。
scswitch -Z -g resource_group |
RGM 儲存所有資源,從而任何系統管理員未明確設定的預設屬性均不會儲存於 CCR (叢集配置儲存庫) 的資源項目中。 當從 CCR 讀取資源時,RGM 將從資源類型獲取遺失資源屬性的預設值 (或如果資源類型中未定義,請使用系統定義的預設值)。 正是這個儲存屬性的方法可允許升級的資源類型定義新屬性或現有屬性的新預設值。
當編輯資源屬性時,RGM 會將透過編輯指令指定的屬性儲存於 CCR 中。
如果升級版本的資源類型宣告預設屬性的新預設值,則新預設值將由現有資源繼承,即使宣告了該屬性僅 At_creation 或 When_disabled 可調。 如果新預設的應用程式將引起 Stop、Postnet_stop 或 Fini 方法失敗,則資源類型實作者必須在升級資源時相應地限制資源的狀態。 透過限制 Type_version 屬性的可調性來完成此作業。
新資源類型版本 Validate 方法可以檢查以確定現有的屬性性質是適當的。 如果不適當,系統管理員可以透過編輯 Type_version 屬性以將資源升級至新資源類型版本的相同指令,來將現有資源的屬性編輯為適當的值。
當建立於 Sun Cluster 3.0 中的資源遷移至以後版本時,它們不會繼承資源類型的新預設屬性性質,因為其預設屬性儲存於 CCR 中。
資源類型開發者必須提供具有新資源的說明文件,該新資源提供以下資訊:
說明所有屬性的加入、變更或刪除
說明如何使屬性與新需求一致
呼出所有新預設屬性性質
通知系統管理員可以透過用來編輯 Type_version 屬性以將資源升級至新資源類型版本的相同指令,來將現有資源的屬性編輯為適當的值。
您可以在 Sun Cluster 3.0 中註冊支援升級的資源類型,但其名稱記錄在 CCR 中,而不包含版本後綴。 若要在 Sun Cluster 3.0 和 Sun Cluster 3.1 (以及更高版本) 中均可正常執行,該資源類型的監視器必須能夠處理二者的命名慣例:
vendor_id.resource_name:version vendor_id.resource_name |
監視器程式碼可決定要使用的正確名稱,方法為透過執行對等的:
scha_resourcetype_get -O RT_VERSION -T VEND.myrt scha_resourcetype_get -O RT_VERSION -T VEND.myrt:vers |
然後將輸出值與 vers 進行比較。 對於 vers 的特定值,這些指令中僅一個會成功,因為在兩個不同的名稱下不可能註冊兩次相同版本的資源類型。
儘管某些問題相似,但是升級應用程式代碼與升級代理程式代碼仍有區別。 應用程式升級可能會伴隨資源類型升級也可能不會。
這些範例說明多種不同資源類型安裝方案與升級方案。 已經基於對資源類型實作進行的變更之類型選擇了可調性資訊與封裝資訊。 可調性將資源的遷移套用至新資源類型。
所有範例都假定:
資源類型將在 Solaris 套裝軟體中提供。 請參閱 pkgadd(1M) 和 pkgrm(1M)。
由於僅有一個舊版本資源類型,因此在新 RTR 檔案中僅有一個 #$upgrade_from 指令
如果 RGM 有可能在從磁碟移除方法時呼叫它們,則安裝程序將不會移除或覆寫這些方法
除非另有註明,否則新方法與舊方法相容
在進行安裝或遷移之前,使用正確的 scswitch(1M) 指令或對等指令將資源與資源群組移至需要的狀態。 以下範例展示如何將資源群組移至不受管理狀態:
scswitch -M -n -j resource scswitch -n -j resource scswitch -F -g resource_group scswitch -u -g resource_group |
您可以透過使用以下指令來註冊資源類型:
scrgadm -a -t resource_type -f path_to_RTR_file |
您可以透過使用以下指令來遷移資源:
scrgadm -c -j resource -y Type_version=version \ -y property=value \ -x property=value ... |
遷移之後,使用適當的 scswitch(1M) 指令或對等指令將資源與資源群組回復到其上一個狀態:
scswitch -M -e -j resource scswitch -e -j resource scswitch -o -g resource_group scswitch -Z -g resource_group |
資源類型開發者可能需要指定比這些範例中所使用可調性值具有更多限制性的可調性值。 可調性值取決於對資源類型實作所做的確切變更。 此外,資源類型開發者可能會選擇使用不同的封裝方案來取代這些範例中使用的 Solaris 封裝。
表 3–1 升級資源類型的範例
變更類型 |
可調性 |
封裝 |
程序 |
---|---|---|---|
僅在 RTR 檔案中進行屬性變更。 |
Anytime |
僅提供新 RTR 檔案。 |
在所有節點上執行新 RTR 檔案的 pkgadd。 註冊新資源類型。 遷移資源。 |
方法被更新。 |
Anytime |
將更新的方法置於一個與舊方法不同的路徑中。 |
在所有節點上執行已更新方法的 pkgadd。 註冊新資源類型。 遷移資源。 |
新的監視器程式。 |
When_unmonitored |
僅覆寫舊版監視器。 |
停用監視。 在所有的節點上執行新監視器程式的 pkgadd。 註冊新資源類型。 遷移資源。 啟用監視。 |
方法被更新。 新的 Update/Stop 方法與舊的 Start 方法不相容。 |
When_offline |
將更新的方法置於一個與舊方法不同的路徑中。 |
在所有節點上執行已更新方法的 pkgadd。 註冊新資源類型。 使資源離線。 遷移資源。 使資源上線。 |
方法將更新,而新屬性將新增至 RTR 檔案。 新方法需要新屬性。 (目的在於萬一資源所在的資源群組在某個節點上從離線狀態移至線上狀態,可允許資源群組保持線上狀態,但阻止資源上線運作。) |
When_disabled |
覆寫舊版方法。 |
停用資源。
註冊新資源類型。 遷移資源。 啟用資源。 |
方法將更新,而新屬性將新增至 RTR 檔案。 新方法不需要新屬性。 |
Anytime |
覆寫舊版方法。 |
在該程序期間,RGM 將呼叫新方法,即使尚未執行遷移 (將會配置新屬性)。 新方法在不具有新屬性的情況下能夠工作很重要。 註冊新資源類型。 遷移資源。 |
方法被更新。 新的 Fini 方法與舊的 Init 方法不相容。 |
When_unmanaged |
將更新的方法置於一個與舊方法不同的路徑中。 |
使資源所在的資源群組不受管理。 在所有節點上執行已更新方法的 pkgadd。 註冊資源類型。 遷移資源。 使資源所在的資源群組受管理。 |
方法被更新。 未對 RTR 檔案進行任何變更。 |
不適用。 未對 RTR 檔案進行任何變更 |
覆寫舊版方法。 |
由於未對 RTR 檔案進行任何變更,因此不需要註冊或遷移資源。 |
註冊新的資源類型時,其 RTR 檔案在磁碟上必須是可存取的
當建立新類型的資源時,所有宣告的方法路徑名稱與新類型的監視器程式均必須位於磁碟上並且是可執行的。 只要資源處於使用中狀態,則舊方法與監視器程式都必須保留在適當位置。
若要決定最適當的封裝,資源類型實作者必須考量以下問題:
RTR 檔案是否變更?
屬性的預設值或可調性是否變更?
屬性的 min 或 max 值是否變更?
升級是否會新增或刪除屬性?
方法程式碼是否變更?
監視器程式碼是否變更?
新方法或監視器程式碼與舊版本是否相容?
一些資源類型升級不會涉及新方法或監視器程式碼。 例如,資源類型升級可能僅變更資源屬性的預設值或可調性。 由於方法程式未變更,因此安裝升級的唯一要求是具有可讀 RTR 檔案的有效路徑名稱。
如果不需要重新註冊舊資源類型,則新 RTR 檔案可以覆寫舊版本。 否則,新的 RTR 檔案可置於新的路徑名稱中。
如果升級變更屬性的預設值或可調性,新版本的 Validate 方法可以在遷移時確認現有的屬性性質對於新資源類型有效。 如果升級變更屬性的 min、max 或 type 性質,則 scrgadm 指令在遷移時自動驗證這些限制。
升級說明文件必須呼出所有的新預設屬性性質。 說明文件必須通知系統管理員可以透過用來編輯 Type_version 屬性以將資源升級至新資源類型版本的相同指令,來將現有資源的屬性編輯為適當的值。
如果升級新增或刪除屬性,則很可能也必須變更某些回呼方法或監視器程式碼。
如果在更新的資源類型中僅變更監視器程式碼,則套件安裝可以覆寫監視器二進位檔。 在安裝新的套件前,說明文件必須通知系統管理員暫停監視。
如果在更新的資源類型中僅變更方法程式碼,請務必確定新方法程式碼是否與舊版本相容。 這樣可決定新方法程式碼是否必須儲存於新的路徑名稱中,或是否可以覆寫舊方法。
如果新的 Stop、Postnet_stop 以及 Fini 方法 (如果已宣告) 可以套用至由舊版 Start、Prenet_stop 或 Init 方法初始化或啟動的資源,則可能會以新方法覆寫舊方法。
如果新方法程式碼與舊版本不相容,則必須停止或取消配置使用舊版本方法的資源,然後才能將資源遷移至升級的資源類型。 如果新方法覆寫舊方法,則在進行資源類型升級之前,新方法將要求關閉 (或可能不管理) 所有此類型的資源。 如果新方法與舊方法個別儲存 (且可同時存取新方法與舊方法),則甚至在沒有向下相容性的情況下,都可能安裝新資源類型並逐個升級資源。
即使新方法是向下相容的,也可能要求每次升級一個資源以使用新方法,而其他資源繼續使用舊方法。 仍有必要將新方法儲存於個別目錄中,而非覆寫舊方法。
將每個資源類型版本的方法儲存於個別目錄中的優勢是,如果新的版本出現問題,可以很容易將資源切換回舊的資源類型版本。
一個封裝方法是包含套件中仍支援的所有舊版本。 這樣可允許新的套件版本取代舊的版本,而不覆寫或刪除舊方法路徑。 決定支援多少個舊版本取決於資源類型開發者。
建議不要覆寫方法或對目前位於叢集中節點上的方法執行 pkgrm/pkgadd。 如果 RGM 要在某個方法於磁碟上不可存取時呼叫該方法,則可能出現非預期的結果。 移除或取代正在執行方法的二進位碼也可能引起非預期的結果。