开源技术 * IBM 微讲堂:Kubeflow 系列(观看回放 | 下载讲义) 了解详情

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 : <preformatted>
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 语句和维护操作对备服务器上应用连接的影响,增强了备用数据库只读功能的可用性。建议用户可以开启该增强功能,从而充分利用备用数据库的读取功能。

参考资源