Db2 V11.1m4fp4 HADR ROS 功能增強

收藏待读

Db2 V11.1m4fp4 HADR ROS 功能增強

簡介和背景

Db2 for Linux, UNIX, and Windows 的 HADR (High Availability Disaster Recovery) 是一種數據複製功能, 它以數據庫日誌的形式將主數據庫中的數據更改複製到備用數據庫中,備用數據庫通過重做日誌的方式實現和主數據庫的數據一致。

HADR 功能最初是在 Db2 V8.2 中引入的。在 Db2 V9.7 之前,備用服務器對於用戶來說是不可用的,用戶不能在備用數據庫上建立連接,這樣在一定程度上導致了資源浪費。從 V9.7 開始,Db2 引入了 ROS (Read on Standby,備機數據可讀)的特性。用戶可以在備用數據庫上建立連接,將只讀應用運行在備用數據庫上,從而降低主數據庫的負載,提高備用數據庫的利用率。從 V10.5 開始,HADR 支持 pureScale,但在 pureScale 環境中的 HADR 不支持 ROS 功能。HADR 目前也不支持 DPF。

為了能夠有效利用資源,很多客戶都啟用 HADR ROS 特性,在備用數據庫上執行報表查詢等只讀業務。但是在之前的版本中,HADR ROS 有一個很大的限制,即 replay-only window(僅重放窗口),許多的 DDL 語句和維護操作都會導致 replay-only window,從而影響備用數據庫上的連接和查詢。有的客戶會發現 replay-only window 的影響非常大,以至於他們不能很好的利用 ROS 的特性。

為了能夠增強 HADR ROS 特性的可用性,減小上述限制對備機查詢的影響,V11.1m4fp4 版本對 HADR ROS 特性做了功能增強,在大多數情況下避免觸發 replay-only window。

本文通過對之前版本的 HADR ROS 功能和增強後的 HADR ROS 功能的比較,介紹如何使用增強的 HADR ROS 功能、增強的 ROS 功能的限制以及如何查看 ROS 相關的診斷日誌信息。

V11.1m3fp3 及之前版本的的 HADR ROS 功能

啟用 HADR ROS 功能

為了使用 HADR ROS 功能,我們需要在備用數據庫上設置註冊變量 DB2_HADR_ROS。

DB2_HADR_ROS 缺省值為 OFF,將該變量設置為 ON,可打開備機可讀功能。為了使該變量生效,需要重啟 Db2 數據庫實例。

清單 1. 在備用服務器上啟用 HADR ROS 功能執行的命令

$ db2set DB2_HADR_ROS=ON
$ db2 deactivate db hadrdb
$ db2stop
$ db2start
$ db2 activate db hadrdb

啟動 HADR ROS 成功後,用戶就可以連接到備用數據庫,執行只讀操作。若 ROS 沒有設置成功,則用戶在連接備用數據庫中會出現 SQL1776N RC1 錯誤。

清單 2. 未啟動 ROS 功能時連接備用數據庫出現的錯誤信息

$ db2 CONNECT TO hadrdb
SQL1776N  The command is not supported on an HADR standby database 
or on an HADR standby database with the current configuration or state. 
Reason code = "1".

啟用了 HADR ROS 的備用數據庫只支持隔離級別未提交讀(UR)。如果查詢語句的隔離級別高於 UR,則會返回錯誤 SQL1773N RC1。

清單 3. 查詢語句的隔離級別高於 UR 時的錯誤信息

$ db2 "select * from t1 with CS"    
C1         
-----------
SQL1773N  The statement or command failed because it requires functionality 
that is not supported on a read-enabled HADR standby database. Reason code = 
"1".

清單 4. 查詢語句的隔離級別為 UR 時的返回信息

$ db2 "select * from t1 with UR"
C1         
-----------
  0 record(s) selected.

為了避免這一錯誤信息,我們可以在備用數據庫上設置註冊變量 DB2_STANDBY_ISO。

DB2_STANDBY_ISO 的缺省值為 NULL,當我們將它設置為 UR 後,在備用數據庫上執行的語句的隔離級別會被自動轉化為 UR。

清單 5. 設置註冊變量 DB2_STANDBY_ISO 執行的命令

$ db2set DB2_STANDBY_ISO=UR
$ db2 deactivate db hadrdb
$ db2stop
$ db2start
$ db2 activate db hadrdb

ROS 支持的 HADR 同步模式包括 ASYNC、NEARSYNC、SYNC 和 SUPERASYNC。在備用服務器處於本地保持 (local catch-up) 時不支持讀取功能。

HADR 備用數據庫上不允許執行任何寫操作。當我們嘗試在備用數據庫上執行 create table,insert,綁定包等寫操作時,會返回錯誤信息 SQL1773N RC5,提示備服務器不支持該操作。

清單 6. 在備用數據庫執行寫操作返回的錯誤信息

$ db2 "create table t6(c1 int)"
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL1773N  The statement or command failed because it requires functionality 
that is not supported on a read-enabled HADR standby database. Reason code = 
"5".

HADR ROS 的限制 – replay-only window(僅重放窗口)

在備機可讀的環境下,備用數據庫並不是每時每刻都能夠接受應用程序的連接並提供查詢服務的。在主數據庫上運行一些 DDL 語句和維護操作時,這些操作產生的日誌傳遞到備用數據庫,當備用數據庫開始重做這些日誌時,備用數據庫就會進入 replay-only window。

當備用數據庫上的 replay-only window 開始時,會強制關閉現有應用連接並返回錯誤信息 SQL1224N,同時在 replay-only window 期間,會阻止所有與備用服務器建立的新連接,並返回錯誤信息 SQL1776N RC4。當主數據庫上的所有 DDL 語句所在的事務都已提交,並且所有維護操作全部結束後,相應的數據庫日誌傳遞到備用數據庫,並且這些日誌被重做完成時,replay-only window 結束。此時,用戶可以在備用服務器上建立新連接。

用戶可通過在備用數據庫上執行 db2pd -db -hadr 命令來查看 replay-only window 狀態。

清單 7. db2pd 命令輸出中 replay-only window 相關的信息示例

$db2pd -db hadrdb -hadr
…
…
          READS_ON_STANDBY_ENABLED = Y
      STANDBY_REPLAY_ONLY_WINDOW_ACTIVE = Y
       STANDBY_REPLAY_ONLY_WINDOW_START = 10/08/2018 16:50:20
  STANDBY_REPLAY_ONLY_WINDOW_TRAN_COUNT = 2

Replay-only window on the active standby database 中列出了 V10.5 版本中會觸發 replay-only-window 的 DDL 或維護操作的列表。 我們可以看到許多語句都會導致 replay-only-window,這大大降低了 HADR ROS 的可用性。而且,不僅是用戶執行的語句命令會觸發 replay-only window,Db2 自動運行的一些維護操作也會導致備用數據庫進入 replay-only window。

為了減少 replay-only window 對備用數據庫上只讀業務的影響,我們可以採取以下方法:

  • 在主數據庫上將生成 replay-only window 的所有操作集中在較短時間內執行
  • 在主數據庫上儘快提交事務,以縮短 replay-only window
  • 關閉主數據庫上的自動維護功能

Db2 V11.1m4fp4 版本中 HADR ROS 功能的增強

在之前的版本中,雖然用戶可以使用 HADR ROS 功能,但由於 replay-only window 的限制,連接到備用數據庫上的連接很可能被中斷,對只讀業務造成影響,特別是當主數據庫上有大量的、時間不確定的、會產生 replay-only window 的命令和操作時,備用數據庫上的查詢操作幾乎無法進行。

新版本針對這一問題對 HADR ROS 功能做了增強,大大減小了備用數據庫上重做 DDL 語句或維護操作對查詢操作的影響,增強了備用數據庫 ROS 功能的可用性。

新特性及新的註冊變量

新版本中引入了新的註冊變量 DB2_HADR_ROS_AVOID_REPLAY_ONLY_WINDOW,用於設置是否啟用避免 replay-only window 的新特性。

DB2_HADR_ROS_AVOID_REPLAY_ONLY_WINDOW 缺省值為 OFF。在備用服務器上,當該變量為 OFF 時,該增強功能未被啟用,數據庫的行為和之前版本一致,備用數據庫上對大量 DDL 和維護操作的重做都會觸發 replay-only window。改變該註冊變量並重新激活備用數據庫使之生效。

在啟用了 ROS 功能時,將該變量設置為 ON 後,當大多數 DDL 或維護操作在重做時,備用數據庫將不會進入 replay-only window。在備用數據庫上,重做操作的優先級比應用查詢的優先級高。當重做 DDL 或維護操作所需要的鎖被應用連接所持有,則應用連接會被斷開(返回錯誤信息 SQL1224N),而其他的沒有鎖衝突的連接以及新連接都允許繼續執行。若應用連接需要的鎖被重做進程所持有,則應用連接需等待重做進程釋放該鎖。

清單 8. 設置新註冊變量執行的命令

$ db2set DB2_HADR_ROS_AVOID_REPLAY_ONLY_WINDOW=ON
$ db2 deactivate db hadrdb
$ db2 activate db hadrdb

另外,在 V11.1m4fp4 中,改變註冊變量 DB2_HADR_ROS 和 DB2_STANDBY_ISO 的值不用再重啟數據庫實例,只需重新激活備用數據庫就可以生效。

綜上所述,在 V11.1m4fp4 版本中,在 HADR 環境中使用 ROS 新增強特性需要在備用數據庫上設置相關註冊變量,然後重新激活備用數據庫。考慮到 HADR 主備數據庫的主備關係會發生轉換(takeover),建議在主備數據庫中都設進行相同的設置。

清單 9. V11.1m4fp4 版本中啟用 HADR ROS 新特性的步驟

$ db2set DB2_HADR_ROS=ON
$ db2set DB2_STANDBY_ISO=UR
$ db2set DB2_HADR_ROS_AVOID_REPLAY_ONLY_WINDOW=ON
$ db2 deactivate db hadrdb
$ db2 activate db hadrdb

新特性的限制

在之前的版本中,有大量的 DDL 語句和維護操作會觸發 replay-only window。在新版本中,設置 DB2_HADR_ROS_AVOID_REPLAY_ONLY_WINDOW 為 ON 之後,我們可以避免大多數 DDL 語句和維護操作觸發 replay-on window,但即使我們設置了該參數,仍有一些 DDL 語句仍會觸發 replay-only window。

在新版本中仍會觸發 replay-only window 的 DDL 語句包括:

  • CREATE, ALTER, or DROP WORKLOAD
  • GRANT USAGE ON WORKLOAD
  • REVOKE USAGE ON WORKLOAD
  • CREATE, ALTER, or DROP SERVICE CLASS
  • CREATE, ALTER, or DROP WORK CLASS SET
  • CREATE, ALTER, or DROP WORK ACTION SET
  • CREATE, ALTER, or DROP THRESHOLD
  • CREATE, ALTER, or DROP HISTOGRAM TEMPLATE
  • AUDIT
  • CREATE, ALTER, or DROP AUDIT POLICY
  • CREATE, ALTER, or DROP TRUSTED CONTEXT

診斷日誌信息

Replay-only window 的診斷日誌信息(V11.1m3fp3 版本新增)

從 V11.1m3fp3 版本開始,當備用數據庫處於 relay-only window 期間時,備用數據庫的 db2diag.log 可以包含指示 replay-only window 開始和結束的診斷信息,並可以包含觸發 replay-only window 的 DDL 或維護操作的信息。

註冊變量 DB2_HADR_REPLAY_ONLY_WINDOW_DIAGLEVEL 用於控制在 db2diag.log 中記錄 replay-only window 相關的診斷信息的詳細程度。當該註冊變量為 0 時,僅記錄 replay-only window 的起止信息;當該註冊變量為 1(默認值)時,除了記錄 replay-only window 的起止信息,還記錄觸發 replay-only window 的第一個操作的信息;當該註冊變量為 2 時,記錄 replay-only window 的起止信息,以及可以觸發 replay-only window 的所有操作的信息。修改該註冊變量不需要重啟數據庫實例。

備註:為了在 db2diag.log 中記錄觸發 replay-only window 的 DDL 或維護操作的語句文本信息,需要在主數據庫中將數據庫配置參數 LOG_DDL_STMTS 設置為 YES。

清單 10. 診斷日誌信息示例

2018-12-02-00.52.59.603204-300 E1146991E500          LEVEL: Warning
PID     : 32530                TID : 140126403421952 PROC : db2sysc
INSTANCE: qinling              NODE : 000            DB   : HADRDB
APPHDL  : 0-11                 APPID: *LOCAL.DB2.181202055252
HOSTNAME: testserver2
EDUID   : 90                   EDUNAME: db2redom (HADRDB)
FUNCTION: DB2 UDB, base sys utilities, sqeLocalDatabase::HdrForceAppsInReplayOnlyWindow, probe:100
DATA #1 : String, 28 bytes
Replay only window is active

2018-12-02-00.52.59.604335-300 I1148480E603          LEVEL: Info
PID     : 32530                TID : 140126403421952 PROC : db2sysc
INSTANCE: qinling              NODE : 000            DB   : HADRDB
APPHDL  : 0-11                 APPID: *LOCAL.DB2.181202055252
HOSTNAME: testserver2
EDUID   : 90                   EDUNAME: db2redom (HADRDB)
FUNCTION: DB2 UDB, recovery manager, SQLP_REPLAY_ONLY_WINDOW_STAT::sqlpSetDDLStmtForHadrReplayOnlyWindow, probe:9150
MESSAGE : DDL statement text
DATA #1 : String, 87 bytes
ALTER WORKLOAD SYSDEFAULTUSERWORKLOAD COLLECT ACTIVITY DATA ON COORDINATOR WITH DETAILS

2018-12-02-00.52.59.745804-300 E1149571E537          LEVEL: Warning
PID     : 32530                TID : 140126403421952 PROC : db2sysc
INSTANCE: qinling              NODE : 000            DB   : HADRDB
APPHDL  : 0-11                 APPID: *LOCAL.DB2.181202055252
HOSTNAME: testserver2
EDUID   : 90                   EDUNAME: db2redom (HADRDB)
FUNCTION: DB2 UDB, base sys utilities, sqeLocalDatabase::HdrEndReplayOnlyWindow, probe:210
DATA #1 : String, 73 bytes
Replay only window is inactive, connections to Active Standby are allowed

鎖衝突診斷日誌信息(V11.1m4fp4 版本新增)

在 V11.1m4fp4 版本中,當啟用了避免 replay-only window 的新特性後,僅當查詢操作和日誌重做操作存在鎖衝突時,重做進程才會將應用連接斷開。當重做進程斷開應用連接時,用戶在備用數據庫的 db2diag.log 中可以看到出現鎖衝突的應用程序和鎖的信息。

清單 11. 鎖衝突診斷日誌信息示例

2018-12-02-04.48.50.120666-300 I1992976E662          LEVEL: Info
PID     : 23382                TID : 140543942190848 PROC : db2sysc
INSTANCE: qinling              NODE : 000            DB   : HADRDB
APPHDL  : 0-20                 APPID: *LOCAL.DB2.181202094840
HOSTNAME: testserver2
EDUID   : 89                   EDUNAME: db2redom (HADRDB)
FUNCTION: DB2 UDB, lock manager, sqlplWaitOnWP, probe:1370
DATA #1 : 
Forcing application which conflicts with HADR log replay.
 Workstation Location: testserver2
 Application Name    : db2bp
 Application ID      : *LOCAL.qinling.181202094843
 lockname            : 00000500070012000000000052 SQLP_RECORD

結束語

本文通過對之前版本的 HADR ROS 功能和增強後的 HADR ROS 功能的比較,介紹了如何使用增強的 HADR ROS 功能、增強的 ROS 功能的限制以及如何查看 ROS 相關的診斷日誌信息。V11.1m4fp4 版本對 HADR ROS 所做的增強大大減小了主數據庫上執行的 DDL 語句和維護操作對備服務器上應用連接的影響,增強了備用數據庫只讀功能的可用性。建議用戶可以開啟該增強功能,從而充分利用備用數據庫的讀取功能。

參考資源

原文 : IBM developerWorks中國

相關閱讀

免责声明:本文内容来源于IBM developerWorks中國,已注明原文出处和链接,文章观点不代表立场,如若侵犯到您的权益,或涉不实谣言,敬请向我们提出检举。