本章說明如何啟用和配置高可用性階段作業持續性。
Application Server 經由 HTTP 階段作業資料和有狀態階段作業 Bean (SFSB) 階段作業資料的容錯移轉提供高可用性作業階段持續性。容錯移轉表示在伺服器實例或硬體出現故障時,其他伺服器實例接管分散式階段作業。
在滿足以下條件時,分散式階段作業可在多個 Sun Java System Application Server 實例中執行:
每個伺服器實例均可以存取同一高可用性資料庫 (HADB)。如需有關如何啟用此資料庫的資訊,請參閱 configure-ha-cluster(1)。
每個伺服器實例均部署相同的可分散 Web 應用程式。web.xml 部署描述元檔案的 web-app 元素必須包含 distributable 元素。
Web 應用程式使用高可用性階段作業持續性。如果將不可分散的 Web 應用程式配置為使用高可用性階段作業持續性,伺服器會向記錄檔寫入錯誤。
必須使用 deploy 或 deploydir 指令 (--availabilityenabled 選項設定為 true) 部署 Web 應用程式。如需有關這些指令的更多資訊,請參閱 deploy(1) 和 deploydir(1)。
階段作業容錯移轉時,對開啟的檔案或網路連線的任何參照都會遺失。編碼應用程式時必須牢記此限制。
僅可以將某些物件連結至支援容錯移轉的分散式階段作業。與 Servlet 2.4 規格相反,如果不支援容錯移轉的物件類型連結至分散式階段作業,Sun Java System Application Server 不會丟出 IllegalArgumentException。
可以將以下物件連結至支援容錯移轉的分散式階段作業:
所有 EJB 元件的本地主機參照和物件參照。
共同存在的實體 Bean、有狀態階段作業 Bean 和分散式實體 Bean 遠端主機參照、遠端參照
分散式階段作業 Bean 遠端主機和遠端參照
InitialContext 和 java:comp/env 的 JNDI 環境。
UserTransaction 物件。但是,如果出現故障的實例從未重新啟動,則任何就緒的全域作業事件都將遺失,且可能無法正確回復或確定。
可串列化 Java 類型
無法將以下物件類型連結至支援容錯移轉的階段作業:
JDBC DataSource
Java Message Service (JMS) ConnectionFactory 和 Destination 物件
JavaMail™ 階段作業
連線工廠
受管理的物件。
Web 服務參照
通常,對於這些物件,容錯移轉不可用。但是,容錯移轉可能在某些情況下可用,例如,如果物件是可串列化的。
以下目錄包含說明階段作業持續性的範例應用程式:
install_dir/samples/ee-samples/highavailability install_dir/samples/ee-samples/failover
以下範例應用程式說明 SFSB 階段作業持續性:
install_dir/samples/ee-samples/failover/apps/sfsbfailover
本小節說明如何設定高可用性階段作業持續性,包含以下主題:
高可用性階段作業持續性與動態部署、動態重新載入和自動部署不相容。這些功能適用於開發而非生產環境,因此必須在啟用 HA 階段作業持續性之前停用它們。如需有關如何停用這些功能的資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.2 管理指南」中的第 2 章「部署應用程式」。
建立 Application Server 叢集。
如需更多資訊,請參閱建立叢集。
為叢集建立 HADB 資料庫。
如需更多資訊,請參閱 configure-ha-cluster(1)。
為叢集設定 HTTP 負載平衡。
如需更多資訊,請參閱設定 HTTP 負載平衡
啟用所需 Application Server 實例和 Web 或 EJB 容器的可用性。
然後配置階段作業持續性設定。選擇以下方法之一:
使用 Admin Console。請參閱啟用伺服器實例的可用性。
使用 asadmin 指令行公用程式。請參閱 set(1) 和 configure-ha-persistence(1)。
重新啟動叢集中的每個伺服器實例。
如果實例目前正在處理請求,請在重新啟動該實例前將其靜止,這樣,它就有足夠的時間來處理正在處理的請求。如需更多資訊,請參閱停用 (靜止) 伺服器實例或叢集
啟用所需的特定 SFSB 的可用性。
選取所需的階段作業狀態的檢查點操作方法。請參閱配置個別 Bean 的可用性
在部署期間啟用個別應用程式、Web 模組或 EJB 模組的可用性。
在管理主控台中,核取 [可用性已啟用] 核取方塊,或使用 asadmin deploy 指令 (--availabilityenabled 選項設定為 true)。
伺服器實例,依預設啟用。啟用伺服器實例階段作業可用性,表示所有在伺服器實例上執行的應用程式皆可具有高可用性階段作業持續性。如需說明,請參閱下一小節啟用伺服器實例的可用性。
容器 (Web 或 EJB),依預設啟用。如需有關在容器層級啟用可用性的資訊,請參閱:
應用程式,依預設停用。
獨立 Web 或 EJB 模組,依預設停用。
個別 SFSB,依預設停用。
若要在給定範圍啟用可用性,還必須在所有更高層級也啟用。例如,若要啟用應用程式層級的可用性,必須在伺服器實例層級和容器層級啟用可用性。
給定層級的預設值是其上一層級的設定值。例如,如果已啟用容器層級的可用性,則依預設啟用應用程式層級的可用性。
如果已停用伺服器實例層級的可用性,則啟用其他任何層級的可用性都不生效。如果已啟用伺服器實例層級的可用性,除非已明確停用,否則將啟用所有層級的可用性。
若要啟用伺服器實例的可用性,請使用 asadmin set 指令將配置的 availability-service.availability-enabled 特性設定為 true。
例如,如果配置名稱為 config1:
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849 config1.availability-service.availability-enabled="true" |
在樹形元件中,展開 [配置] 節點。
展開要編輯的配置之節點。
選取 [可用性服務] 節點。
在 [可用性服務] 頁面,核取 [可用性服務] 核取方塊來啟用實例層級的可用性。
若要停用可用性,請取消核取該方塊。
此外,如果為獲得階段作業持續性而變更了用於連線 HADB 的 JDBC 資源,可以變更儲存池名稱。如需詳細資訊,請參閱 configure-ha-cluster(1)。
按一下 [儲存] 按鈕。
停止和重新啟動伺服器實例。
J2EE 應用程式通常具有大量階段作業狀態資料。Web 購物車即為階段作業狀態的經典範例。而且,應用程式可以快取頻繁需要的階段作業物件資料。實際上,幾乎所有需要進行大量使用者互動活動的應用程式均需要維護階段作業狀態。
若要使用 asadmin 啟用並配置 Web 容器可用性,請參閱 configure-ha-persistence(1)。
此外,還可使用 asadmin set 指令將配置的 availability-service.web-container-availability.availability-enabled 特性設定為 true,然後使用 configure-ha-persistence 根據需要設定特性。
例如,如下使用 set 指令,其中 config1 為配置名稱:
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849 config1.availability-service.web-container-availability.availability-enabled="true" asadmin configure-ha-persistence --user admin --passwordfile secret.txt --type ha --frequency web-method --scope modified-session --store jdbc/hastore --property maxSessions=1000:reapIntervalSeconds=60 cluster1 |
在樹形元件中,選取所需配置。
按一下 [可用性服務]。
選取 [Web 容器可用性] 標籤。
核取 [可用性服務] 核取方塊以啟用可用性。若要停用可用性,請取消核取該方塊。
請按照以下可用性設定小節中的說明變更其他設定。
重新啟動伺服器實例。
[可用性服務] 的 [Web 容器可用性] 標籤讓您可以變更以下可用性設定:
持續性類型:為啟用了可用性的 Web 應用程式指定階段作業持續性機制。允許的值為 memory (無持續性)、file (檔案系統) 和 ha (HADB)。
必須配置並啟用 HADB 後,才能使用 ha 階段作業持續性。如需配置詳細資訊,請參閱 configure-ha-cluster(1)。
如果啟用了 Web 容器可用性,預設為 ha。否則,預設為 memory。對於需要階段作業持續性的生產環境,請使用 ha。前兩個類型 (memory 和 file ) 的持續性不提供高可用性階段作業持續性。
持續性頻率:指定儲存階段作業狀態的頻率。僅當持續性類型為 ha 時適用。允許的值包括 :
web-method - 將回應傳送回用戶端之前,在每個 Web 請求結束時儲存階段作業狀態。此模式為發生故障時完全更新階段作業狀態提供了最好的保證。此為預設值。
time-based - 在背景中以 reapIntervalSeconds 儲存特性設定的頻率儲存階段作業狀態。此模式不保證完全更新階段作業狀態。但是,它可以提供很大的效能改善,因為在每個請求之後都不儲存狀態。
持續性範圍:指定階段作業物件數和儲存階段作業狀態的頻率。僅當持續性類型為 ha 時適用。允許的值包括:
session - 每次均儲存整個階段作業狀態。此模式為正確儲存任何可分散 Web 應用程式的階段作業資料提供了最好的保證。此為預設值。
modified-session - 如果階段作業狀態已修改,則儲存整個階段作業狀態。如果呼叫了 HttpSession.setAttribute() 或 HttpSession.removeAttribute(),則系統將認為階段作業已修改。必須保證每次變更屬性時都呼叫 setAttribute()。這不是 J2EE 規格的需求,但是此模式需要這樣做才能正常工作。
modified-attribute - 僅儲存修改過的階段作業屬性。若要使此模式正常工作,您必須遵循一些使用準則:
每次修改階段作業狀態時均呼叫 setAttribute()。
確定各屬性之間沒有交叉參照。系統將對每個不同屬性關鍵字下的物件圖形單獨進行串列化並單獨儲存。如果每個單獨的關鍵字下的物件之間存在物件交叉參照,則它們將不會進行正確串列化和反串列化。
在多個屬性之間分布階段作業狀態,或者至少在唯讀屬性和可修改屬性之間分布階段作業狀態。
單次登入狀態:核取此方塊以啟用單次登入狀態的持續性。若要停用可用性,請取消核取該方塊。如需更多資訊,請參閱將階段作業容錯移轉與單次登入配合使用
HTTP 階段作業存放區:如果為獲得階段作業持續性而變更了用於連線 HADB 的 JDBC 資源,可以變更 HTTP 階段作業存放區。如需詳細資訊,請參閱 configure-ha-cluster(1)。
若要啟用和配置個別 Web 應用程式的可用性,請編輯應用程式部署描述元檔案 sun-web.xml。應用程式部署描述元中的設定會置換 Web 容器的可用性設定。
session-manager 元素的 persistence-type 屬性決定應用程式使用之階段作業持續性的類型。必須將該屬性設定為 ha 才能啟用高可用性階段作業持續性。
如需有關 sun-web.xml 檔案的更多資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.2 Developer’s Guide」中的「The sun-web.xml File」。
<sun-web-app> ... <session-config> <session-manager persistence-type=ha> <manager-properties> <property name=persistenceFrequency value=web-method /> </manager-properties> <store-properties> <property name=persistenceScope value=session /> </store-properties> </session-manager> ... </session-config> ...
在單一 Application Server 實例中,使用者經過應用程式認證後,即無需分別經在相同實例上執行的其他應用程式重新認證。這稱為單次登入。如需更多資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.2 Developer’s Guide」中的「User Authentication for Single Sign-on」。
若要使該功能在 HTTP 階段作業防故障備用到叢集中另一個實例後仍然可用,必須將單次登入資訊保留在 HADB 中。若要保持單次登入資訊,首先請啟用伺服器實例和 Web 容器的可用性,然後啟用單次登入狀態容錯移轉。
您可以使用 Admin Console 在 [可用性服務] 的 [Web 容器可用性] 標籤中啟用單次登入狀態容錯移轉 (如配置 Web 容器的可用性中所述),還可以使用 asadmin set 指令將配置的 availability-service.web-container-availability.sso-failover-enabled 特性設定為 true。
例如,如下使用 set 指令,其中 config1 為配置名稱:
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849 config1.availability-service.web-container-availability. sso-failover-enabled="true"
可以透過單一名稱和密碼的組合存取的應用程式構成一個單次登入群組。對於與應用程式 (是單次登入群組的一部分) 相對應的 HTTP 階段作業,如果其中一個階段作業逾時,其他階段作業並不會失效,並且仍然可用。這是因為一個階段作業的逾時不應影響其他階段作業的可用性。
因此,如果一個階段作業逾時並且您嘗試從執行該階段作業的同一瀏覽器視窗存取相應的應用程式,則無需再次進行認證。但是將建立一個新的階段作業。
以屬於含有其他兩個應用程式的單次登入群組的購物車應用程式為例。假設其他兩個應用程式的階段作業逾時值大於購物車應用程式的階段作業逾時值。如果購物車應用程式的階段作業逾時,並且您嘗試從執行該階段作業的同一瀏覽器視窗執行購物車應用程式,則無需再次進行認證。但是,前一輛購物車將遺失,並且必須建立一輛新的購物車。即使執行購物車應用程式的階段作業已逾時,其他兩個應用程式也會繼續照常執行。
類似地,可假定與其他兩個應用程式中的任何一個應用程式對應的階段作業逾時。當從執行該階段作業的同一瀏覽器視窗連線應用程式時,您無需再次進行認證。
此運作方式僅適用於階段作業逾時情況。如果啟用了單次登入,並且使用 HttpSession.invalidate() 令其中一個階段作業失效,則屬於單次登入群組的所有應用程式之階段作業都將失效。如果您嘗試存取屬於單次登入群組的任一應用程式,則需要再次進行認證,系統將為存取該應用程式的用戶端建立一個新的階段作業。
有狀態階段作業 Bean (SFSB) 包含用戶端特定的狀態。用戶端與有狀態階段作業 Bean 之間存在一對一關係。建立時,EJB 容器會為每個 SFSB 提供一個唯一的階段作業 ID,此 ID 將 SFSB 連結至用戶端。
在伺服器實例出現故障時,SFSB 的狀態可以儲存在持續性存放區中。SFSB 的狀態在其使用週期中預先定義的時間儲存於持續性存放區中。這稱為檢查點操作。如果啟用,檢查點操作通常在 Bean 完成任何作業事件之後發生,即使作業事件回復。
但是,如果 SFSB 參與了 Bean 管理的作業事件,可能會在 Bean 方法執行的當中確定該作業事件。因為 Bean 的狀態可能由於方法呼叫而處於過渡過程中,因此不是對 Bean 狀態進行檢查點操作的恰當時間。這種情況下,如果 Bean 在方法結束時不在其他作業事件的範圍內,EJB 容器會在相應方法結束時對 Bean 的狀態進行檢查點操作。如果 Bean 管理的作業事件使用多個方法,檢查點操作將延遲,直至後續方法結束時沒有使用中的作業事件。
SFSB 的狀態無需是作業事件,且可能做為非作業事件商務方法而進行了重大修改。如果這是適用於 SFSB 的情況,可以指定檢查點方法清單 (如指定進行檢查點操作方法中所述)
如果可分散 Web 應用程式參照 SFSB,且 Web 應用程式的階段作業容錯移轉,則 EJB 參照也將容錯移轉。
如果在 Application Server 實例停止時取消部署使用階段作業持續性的 SFSB,則可能不會清除持續性存放區中的階段作業資料。若要防止發生此情況,請在 Application Server 實例執行時取消部署 SFSB。
選取 [EJB 容器可用性] 標籤。
核取 [可用性服務] 核取方塊。
若要停用可用性,請取消核取此核取方塊。
請按照可用性設定中的說明變更其他設定
按一下 [儲存] 按鈕。
重新啟動伺服器實例。
若要啟用 EJB 容器的可用性,請使用 asadmin set 指令為配置設定以下三個特性:
availability-service.ejb-container-availability. availability-enabled
availability-service.ejb-container-availability. sfsb-persistence-type
availability-service.ejb-container-availability. sfsb-ha-persistence-type
例如,如果 config1 為配置名稱,則使用以下指令:
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability .availability-enabled="true"
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability .sfsb-persistence-type="file"
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849config1.availability-service.ejb-container-availability .sfsb-ha-persistence-type="ha"
[可用性服務] 的 [EJB 容器可用性] 標籤可讓您變更以下可用性設定:
HA 持續性類型:為啟用了可用性的 SFSB 指定階段作業持續性和鈍化機制。允許的值包括 file (檔案系統) 和 ha (HADB)。對於需要階段作業持續性的生產環境,請使用預設值 ha。
SFSB 持續性類型:為尚未啟用可用性的 SFSB 指定鈍化機制。允許的值包括 file (預設值) 和 ha。
如果將任一持續性類型設定為 file,EJB 容器都將指定用於儲存鈍化階段作業 Bean 狀態的檔案系統位置。檔案系統的檢查點操作對於測試很有用,但對生產環境無用。如需更多資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.2 管理指南」中的「配置儲存特性」。
如果任何其他伺服器實例出現故障,HA 持續性會使伺服器實例的叢集可以回復 SFSB 狀態。HADB 也用做鈍化和啟動儲存。在需要 SFSB 狀態持續性的生產環境中使用此選項。如需更多資訊,請參閱 configure-ha-cluster(1)。
SFSB 儲存池名稱:如果為獲得階段作業持續性而變更了用於連線 HADB 的 JDBC 資源,可以變更 SFSB 儲存池名稱。如需詳細資訊,請參閱 configure-ha-cluster(1)。
如果停用了可用性,本機檔案系統將用於 SFSB 狀態鈍化,但不用於持續性。若要變更 SFSB 狀態的儲存位置,請變更 EJB 容器中的 [階段作業存放區位置] 設定。如需更多資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.2 管理指南」中的「配置儲存特性」。
部署期間,可以啟用個別應用程式或 EJB 模組的 SFSB 可用性:
如果使用 Admin Console 部署,請核取 [可用性已啟用] 核取方塊。
如果使用 asadmin deploy 或 asadmin deploydir 指令部署,請將 --availabilityenabled 選項設定為 true。如需更多資訊,請參閱 deploy(1) 和 deploydir(1)。
若要啟用個別 SFSB 的可用性並選取進行檢查點操作方法,請使用 sun-ejb-jar.xml 部署描述元檔案。
若要啟用高可用性階段作業持續性,請在 ejb 元素中設定 availability-enabled="true"。若要控制 SFSB 快取的大小和運作方式,請使用以下元素:
max-cache-size:指定快取中保留的階段作業 Bean 的最大數。如果快取溢出 (Bean 的個數超出 max-cache-size),則容器會鈍化一些 Bean 或將 Bean 的串列化狀態寫入檔案。用於建立檔案的目錄來自使用配置 API 的 EJB 容器。
resize-quantity
cache-idle-timeout-in-seconds
removal-timeout-in-seconds
victim-selection-policy
如需有關 sun-ejb-jar.xml 的更多資訊,請參閱「Sun Java System Application Server Enterprise Edition 8.2 Developer’s Guide」中的「The sun-ejb-jar.xml File」。
<sun-ejb-jar> ... <enterprise-beans> ... <ejb availability-enabled="true"> <ejb-name>MySFSB</ejb-name> </ejb> ... </enterprise-beans> </sun-ejb-jar>
如果啟用,檢查點操作通常在 Bean 完成任何作業事件之後發生,即使作業事件回復。若要在導致 Bean 狀態重大修改之非作業事件商務方法結束時,指定其他可選 SFSB 檢查點操作,請使用 checkpoint-at-end-of-method 元素 (在 sun-ejb-jar.xml 部署描述元檔案中的 ejb 元素中)。
如果要在建立之後立即對 SFSB 的初始狀態進行檢查點操作,checkpoint-at-end-of-method 元素中的非作業事件方法可以是:
在 SFSB 的主介面中定義的 create() 方法
對於僅使用容器管理的作業事件之 SFSB,Bean 遠端介面中的方法使用作業事件屬性 TX_NOT_SUPPORTED 或 TX_NEVER 標記
對於僅使用 Bean 管理的作業事件之 SFSB,即不啟動也不確定 Bean 管理作業事件的方法
忽略此清單中提及的任何其他方法。在這些方法呼叫的每一個結尾,EJB 容器均將 SFSB 的狀態儲存至持續性存放區。
如果 SFSB 未參與任何作業事件,且如果 checkpoint-at-end-of-method 元素中未明確指定其任何方法,則根本不會對 Bean 的狀態進行檢查點操作 (即使此 Bean 的availability-enabled="true")
為了取得更好的效能,請指定方法的小子集。此方法應該完成對 Bean 的狀態做出重要修改的大量工作或結果。
<sun-ejb-jar> ... <enterprise-beans> ... <ejb availability-enabled="true"> <ejb-name>ShoppingCartEJB</ejb-name> <checkpoint-at-end-of-method> <method> <method-name>addToCart</method-name> </method> </checkpoint-at-end-of-method> </ejb> ... </enterprise-beans> </sun-ejb-jar>