持續可用性的代碼
您的應用系統在計畫性維護、非計畫性停機和資料庫負載不平衡時,會從應用系統隱藏持續提供。結合應用程式最佳實務、簡單組態和 Oracle Autonomous AI Database,可確保您的應用程式持續可供使用。
將計畫性維護活動從應用程式隱藏的最佳方式,是在維護時段之前,從每個資料庫工作負載位置通透地清空工作。Oracle 的連線集區和中間層 (包括 WebLogic Server、Oracle Universal Connection Pool (UCP)、OCI Session Pool 和 ODP.NET Unmanaged Provider) 均會感知快速應用程式通知 (FAN),因此在資料庫服務排定移動之前會收到通知,以允許在維護之前正常清空工作。FAN 通知會自動觸發關閉閒置連線、在新的服務位置開啟新連線,並允許在即將關閉的服務位置中完成作用中工作的可設定時間。主要的協力廠商 JDBC 中間層 (例如 IBM WebSphere) 允許在設定 UCP 時使用相同的行為。對於無法使用 UCP 的 JDBC 型應用程式,Oracle 會使用 Oracle 驅動程式和連線測試來提供解決方案。
為了隱藏因元件或通訊失敗而導致的非計畫性停機,Oracle 提供:
-
通知。 FAN 是隱藏中斷的第一步。FAN 會通知用戶端,並在發生中斷時中斷其目前的網路等待。這樣可以避免長時間網路等待的延遲應用程式。重要的是,當服務再度可用時,FAN 也會呼叫階段作業的重新平衡。
-
復原。 在通知用戶端之後,「通透應用程式連續性 (TAC)」或「應用程式連續性 (AC)」會重新建立與新工作負載位置 (Real Application Clusters (RAC) 組態中執行資料庫的其他資料庫執行處理) 的連線,並儘可能重新執行進行中 (未確認) 的工作。在新位置上重新執行進行中的工作,通常應用程式可以繼續執行,而不需要知道發生任何失敗。
在配置的清空間隔期間,TAC 或 AC 也會在未清空 (完成其目前資料庫作業) 的階段作業進行計畫性維護時執行。
應用程式組態檢查清單
您可以依照下列準則,讓應用程式持續可供使用:
提示:請參閱 ATP-Direct 白皮書的持續可用性應用系統,瞭解使用自治式 AI 資料庫導入持續可用性應用系統的最佳做法。
使用資料庫服務連線
資料庫服務提供基礎基礎架構的透明度:FAN、連線資料、通透應用程式連續性 (TAC)、應用程式連續性 (AC)、切換、用戶群組,以及許多其他功能和作業都會在服務的使用上進行預測。
專用 Exadata 基礎架構上的自治式 AI 資料庫提供數對預先定義的資料庫服務供您選擇,如自治式 AI 資料庫的預先定義資料庫服務名稱中所述。所有提供 FAN 與清空功能,且兩個異動處理配對預設為啟用 TAC。API 可用來變更所有預先定義服務上的 TAC 或 AC 設定值 (請參閱啟用容錯移轉的服務屬性 )。
設定高可用性連線字串
Oracle 建議在連線至 Oracle Autonomous AI Database 時,使用下方顯示的連線字串組態。Oracle 提供的 tnsnames.ora 檔案中內嵌的連線字串會以此方式設定。請勿在用戶端上使用簡易連線命名,因為這類連線沒有高可用性功能。
所有 Oracle 從屬端版本 12.2 或更新版本都使用此 TNS:
alias =
(DESCRIPTION =
(CONNECT_TIMEOUT= 120)(RETRY_COUNT=20)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)
(ADDRESS_LIST =
(LOAD_BALANCE=on)
(ADDRESS = (PROTOCOL = TCP)(HOST=*scan-host*)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME = *service-name*)))
使用 Oracle 驅動程式版本 12.1 或更舊版本的 JDBC 連線時,請使用下列項目
alias =
(DESCRIPTION =
(CONNECT_TIMEOUT= 15)(RETRY_COUNT=20)(RETRY_DELAY=3)
(ADDRESS_LIST =
(LOAD_BALANCE=on)
(ADDRESS = (PROTOCOL = TCP)(HOST=*scan-host*)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME = *service-name*)))
使用快速應用程式通知 (FAN)
FAN 會在服務中斷或恢復時,立即通知應用程式。若無 FAN,應用程式可能會在硬體和網路故障後暫停 TCP/IP 逾時,並在資源繼續時省略以重新平衡。所有 Oracle 集區和所有 Oracle 應用程式伺服器都使用 FAN。第三方 JAVA 應用程式伺服器可以使用 UCP 來啟用 FAN。
使用 FAN 時不需要變更任何應用程式。這些只是組態變更。
若要在計畫性維護期間持續提供服務,請使用 FAN 搭配:
-
Oracle 集區或
-
第三方 JDBC 應用程式伺服器的 UCP 或
-
最新的 Oracle 從屬端驅動程式
若為非計畫性停機期間的持續服務,請使用 FAN 搭配:
-
通透應用程式連續性或
-
應用程式連續性
FAN 涵蓋範圍
FAN 事件與下列項目整合:
-
Oracle Fusion Middleware 和 Oracle WebLogic Server
-
Oracle Data Guard Broker
-
JDBC 精簡型和 Oracle Call Interface (OCI) 介面的 Oracle JDBC 通用連線集區或驅動程式
-
未受管理與受管理提供者的 ODP.NET 連線集區
-
Oracle Tuxedo
-
SQL*Plus
-
適用於 Python、Node.js 及 PHP 等語言的 Oracle Database 驅動程式
-
全域資料服務
-
使用 Oracle JDBC 通用連線集區的第三方 JDBC 應用程式伺服器
-
監聽器
在用戶端中啟用 FAN
使用設定高可用性的連線字串中顯示的 TNS 別名。此連線字串用於在使用 Oracle Database 12c 或更新版本的從屬端驅動程式時,自動在從屬端設定 FAN 事件接收的 Oracle Notification Service (ONS) 訂閱。ONS 提供資料庫層與從屬端層之間的安全通訊路徑,讓從屬端能夠收到服務可用性 (元件停止或啟動) 的通知,以及執行時期負載平衡建議,以便在正常作業期間有更好的工作位置。
視用戶端而定,在應用程式組態特性中啟用 FAN,如下所示:
-
通用連線集區或 JDBC 精簡型驅動程式 (從 12.2 開始)
設定特性
FastConnectionFailoverEnabled。 -
適用於 Oracle 的 WebLogic Active GridLink
預設會啟用 RAC FAN 和快速連線容錯移轉。
-
Oracle WebLogic Server、IBM WebSphere、IBM Liberty、Apache Tomcat、Red Hat WildFly (JBoss)、JDBC 應用程式
使用「通用連線集區」作為連線集區取代項目。
-
ODP.Net 從屬端 (受管理和未受管理的提供者)
如果使用 ODP.Net 12.1 或更舊版本,請在連線字串中設定
"HA events = true;pooling=true"。 -
Oracle Call Interface (OCI) 從屬端和以 OCI 為基礎的驅動程式
沒有原生設定值的 Oracle Call Interface (OCI) 從屬端可以使用
oraacces.xml檔案,並將events設為true。Python、Node.js 及 PHP 具有原生選項。在 Python 和 Node.js 中,您可以在建立連線集區時設定事件模式。在 PHP 中,編輯
php.ini新增項目oci8.events=on。 -
SQL*Plus
預設會啟用 FAN。
預先定義的資料庫服務提供使用 TLS 公事包式認證的 TCPS 連線。視應用程式類型 (JDBC 或 Oracle Call Interface) 而定,公事包組態必須遵循特定的規則,如設定 FAN 的從屬端 (包括選擇性公事包) 中所述。
使用建議的課堂練習允許清空
應用程式使用狀況的最佳作法是取出需要的時間連線,然後在目前的動作完成時將它們重新存入集區。這對於實現良好效能、在程式實際執行時重新平衡工作,以及在維護時段進行清空工作十分重要。
Oracle 建議您使用 FAN 感知 Oracle 連線集區來隱藏計畫性維護。您的應用程式使用具有 FAN 的 Oracle 集區並在要求之間傳回集區連線時,不會影響使用者。您不需要進行任何應用程式變更,即可使用 FAN。當 Oracle 連線集區收到 FAN 事件以進行計畫性停機時,會將執行處理的所有連線標示為要清空。已存回的連線會立即關閉,這樣就不會重複使用。當使用中的連線返回集區時,系統會關閉這些連線。這可讓所有連線在一段時間內正常關閉。
如果您使用第三方 Java 型應用程式伺服器,則達到清空和容錯移轉的最有效方法就是將集區化資料來源取代為 UCP。許多應用程式伺服器都支援這種方法,包括 Oracle WebLogic Server、IBM WebSphere、IBM Liberty、Apache Tomcat、Red Hat WildFly (JBoss)、Spring、Hibernate 以及其他。來自 Oracle 和其他提供者的白皮書 (例如 IBM) 說明如何將 UCP 與這些應用程式伺服器搭配使用。使用 UCP 作為資料來源,可允許將 UCP 功能 (例如快速連線容錯移轉、程式實際執行負載平衡、應用程式連續性和通透應用程式連續性) 與完整認證搭配使用。
啟用通透應用程式連續性 (TAC) 或應用程式連續性 (AC)
TAC 會以通透的方式追蹤和記錄階段作業和交易狀態,以便在可復原的中斷後復原資料庫階段作業。預先定義之資料庫服務的兩組異動處理預設為啟用 TAC。
AC 可自訂,讓您選擇重新執行副作用,或在 TAC 不允許的容錯移轉時新增複雜的回呼。如果您使用 Oracle 12c 驅動程式 (JDBC-thin 或 Oracle Call Interface),或者想要使用副作用或回呼進行自訂,或讓應用程式使用階段作業持續時間暫時表格等狀態,且不會跨要求進行清除,請使用 AC。
使用通透應用程式連續性的步驟
-
如果您需要在正在使用的資料庫服務中啟用「通透應用程式連續性」,請參閱啟用容錯移轉的服務屬性。
-
使用下列其中一個支援的從屬端。
Oracle 強烈建議您使用最新的從屬端驅動程式。Oracle Database 19c 用戶端驅動程式及更新版本提供 TAC 的完整支援。
-
Oracle JDBC 重新執行驅動程式 18c 或更新版本。這是 Oracle Database 18c for Application Continuity 提供的 JDBC 驅動程式功能。
-
Oracle Universal Connection Pool (UCP) 18c 或更新版本與 Oracle JDBC 重新執行驅動程式 18c 或更新版本。
-
使用 Oracle JDBC 重新執行驅動程式 18c 或更新版本的 UCP 的 Oracle WebLogic Server Active GridLink 或協力廠商 JDBC 應用程式伺服器。
-
使用 Oracle JDBC 重新執行驅動程式 18c 或更新版本的 Java 連線集區或獨立 Java 應用程式。
-
Oracle Call Interface 階段作業集區 19c 或更新版本。
-
SQL*Plus 19c (19.3) 或更新版本
-
ODP.NET pooled,Unmanaged Driver 18c 或更新版本 (
"Pooling=true"預設為 12.2 和更新版本)。 -
使用 19c OCI 驅動程式或更新版本的 Oracle Call Interface 型應用程式。
-
-
將連線傳回「連線集區」。
如果應用程式使用連線,您不需要對應用程式進行任何變更來識別要求界限:
-
從 Oracle 連線集區,或
-
從 Oracle JDBC 重新執行驅動程式 18c 或更新版本,或
-
從使用 19c 或更新版本的 Oracle Call Interface 型應用程式
使用連線集區時,應用程式應在完成每個要求時,傳回與集區的連線。Oracle 建議應用程式僅在需要時取出連線。在不使用時保持連線不是良好的實行範例。使用所列驅動程式的「通透應用程式連續性」也會偵測可以新增界限的位置,並建立自己的界限。
-
-
使用
FAILOVER_RESTORE啟用「通透應用程式連續性」會自動回復預先設定的階段作業狀態。如果您發現除了標準集之外還需要預先設定階段作業狀態,則可以註冊回呼或 UCP 標籤來還原這些狀態。如果您發現需要複雜的階段作業狀態 (例如暫時表格或
SYS_CONTEXT) 已回復,請使用提供此彈性的「應用程式連續性」。 -
啟用應用程式中的可變用途
可變函數是可在每次執行時傳回新值的函數。為
SYSDATE、SYSTIMESTAMP、SYS_GUID和sequence.NEXTVAL提供保留原始結果的支援。Application Continuity 19c 和更新版本會自動為 SQLKEEPs mutables。如果您的應用程式使用或敏感可變函數,則 DBA 必須發出GRANT KEEP權限。授予KEEP權限時,重新執行會在重新執行時套用原始函數結果。舉例而言:SQL> GRANT [KEEP DATE TIME | KEEP SYSGUID] ... TO USERSQL> GRANT KEEP SEQUENCE mySequence TO myUser ON sequence.object -
已停用副作用
附帶效果是一種外部動作,例如傳送郵件、傳輸檔案或使用 TCP。「通透應用程式連續性」會偵測副作用,且不會重新執行。如果您想要重新執行副作用,請使用允許此額外彈性的「應用程式連續性」。
使用應用程式連續性的步驟
-
如果您需要在使用的資料庫服務中啟用「應用程式連續性」,請參閱啟用容錯移轉的服務屬性。
-
使用下列其中一個支援的從屬端。
-
Oracle JDBC 重新執行驅動程式 12c 或更新版本。這是 Oracle Database 12c for Application Continuity 提供的 JDBC 驅動程式功能。
-
Oracle Universal Connection Pool (UCP) 12c 或更新版本與 Oracle JDBC 重新執行驅動程式 12c 或更新版本。
-
使用 UCP 搭配 Oracle JDBC 重新執行驅動程式 12c 或更新版本的 Oracle WebLogic Server Active GridLink 和第三方 JDBC 應用程式伺服器。
-
使用 Oracle JDBC 重新執行驅動程式 12c 或更新版本搭配要求界限或集區化資料來源的 Java 連線集區或獨立 Java 應用程式。
-
使用 Oracle Call Interface Session Pool 12c Release 2 或更新版本的應用程式和語言驅動程式。
-
SQL*Plus 19.3 或更新版本。
-
ODP.NET pooled,Unmanaged Driver 12c Release 2 或更新版本 (
"Pooling=true";"Application Continuity=true"預設在 12.2 和更新版本)
-
-
將連線傳回「連線集區」。
如果應用程式使用支援要求界限的 Oracle 連線集區或第三方 JDBC 集區,則您不需要對應用程式進行任何變更,即可識別要求界限。最佳作法是使用 Oracle 集區,並在要求之間傳回該集區的連線。Oracle 建議應用程式僅在需要時取出連線。在不使用時保持連線不佳作法,這樣可防止通透的計畫性維護。
-
使用
FAILOVER_RESTORE大多數常見狀態都會使用
FAILOVER_RESTORE=LEVEL1自動回復。如果您的應用程式除了標準集之外,還預先設定階段作業狀態,則您必須註冊回呼或 UCP 標籤,才能還原這些狀態。在服務上設定FAILOVER_RESTORE=LEVEL1並使用:-
Java 的連線初始化回呼或 (資料夾) Oracle Call Interface 的 TAF 回呼或
-
通用連線集區或 WebLogic 伺服器連線標籤
-
-
啟用應用程式中的可變用途
可變函數是可在每次執行時傳回新值的函數。為
SYSDATE、SYSTIMESTAMP、SYS_GUID和sequence.NEXTVAL提供保留原始結果的支援。Application Continuity 19c 和更新版本會自動為 SQLKEEPs mutables,因此不需要採取任何動作。如果需要 PL/SQL 的可變項目,DBA 必須發出GRANT KEEP權限。授予KEEP權限時,重新執行會在重新執行時套用原始函數結果。舉例而言:SQL> GRANT [KEEP DATE TIME | KEEP SYSGUID] ... TO USERSQL> GRANT KEEP SEQUENCE mySequence TO myUser ON sequence.object -
決定您是否要重新執行副作用
附帶效果是一種外部動作,例如傳送郵件、傳輸檔案或使用 TCP。使用「應用程式連續性」時,除非應用程式另有指定,否則會重新執行副作用。如果要求具有不應重新執行的外部動作,則該要求可以使用未啟用「應用程式連續性」的連線,或者可以使用 Java 的
disableReplay()API 或 Oracle Call Interface 的OCIRequestDisableReplay()來停用該要求的重新執行。如果您不想重新執行所有副作用,請使用「通透應用程式連續性」。