ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 在 Tivoli System Automation 集群域中实现 DB2 高可用性灾难恢复

在 Tivoli System Automation 集群域中实现 DB2 高可用性灾难恢复

原创 Linux操作系统 作者:CloudSpace 时间:2009-01-14 11:38:29 0 删除 编辑
分步讲解如何在 IBM Tivoli® System Automation for Multiplatforms 集群域中实现 IBM® DB2® for Linux®, UNIX®, and Windows® 高可用性灾难恢复。这样就能够建立一个高度可靠和高可用性的集群,并且在数据库崩溃时可以可靠且无缝地进行数据库故障恢复。这个配置提供十分可靠的 24/7 系统可用性,这对于业务关键型设备是非常重要的。示例设置使用 Red Hat Linux 和 DB2 Universal Database™ V8.2,但是也可以应用于更高的 DB2 版本。

简介和概述

在当今世界上,许多企业为来自世界各地的客户提供一周 7 天每天 24 小时的服务,他们希望自己的计算系统 100% 的可靠。DB2 for Linux, UNIX, and Windows 在数据库领域中非常先进,可以提供工业级的可靠性。在 DB2 UDB V8.2 中,DB2 引入了两个新特性 —— 灾难恢复(HADR)和自动客户机重路由功能,它们为客户提供了更多实现高可用性的选项。通过将数据库的工作负载复制到单独的站点上,这些特性使服务在发生本地硬件故障或灾难性站点故障时不会中断。这些特性是 DB2 UDB Enterprise Server Edition 或 DB2 Enteprise 9 标准包附带的功能。

在 20 世纪 90 年代中期,HADR 就在 Informix Dynamic Server(IDS)中出现了。IBM 收购了 Informix 之后,这个特性进入了 DB2 8.2。理解 HADR 最容易的方法是设想两台服务器,它们在数据库级保持相互同步。这两台服务器中的主服务器与终端用户的应用程序交互并接收事务,而备用服务器将直接来自主服务器的日志缓冲区的事务应用于本身,从而与主服务器保持同步。如果主服务器失败,备用服务器就非常快速地接管工作负载(在大多数情况下,转换时间少于 30 秒)。它还支持数据库或操作系统软件的滚动升级,这样就能够在不显著影响生产系统的情况下应用修复。

Tivoli System Automation(TSA)for Multiplatforms 的设计目的是,通过基于策略的自修复特性,为关键的业务应用程序和中间件提供高可用性,这种特性可以轻松地针对自己的应用程序环境进行调整。它为许多 IBM® 和非 IBM 中间件和应用程序(比如 DB2、WebSphere®、Apache 和 mySAP Business Suite)提供了即插即用的自动策略模块。通过使用 TSA for Multiplatforms,可以让一个运营和自动化团队同时负责 z/OS®、Linux 和 AIX® 应用程序,这可以大大简化对问题的判断和分析。


图 1. TSA 集群域拓扑结构中的 DB2 HADR
TSA 集群域拓扑结构中的 DB2 HADR

软件配置

下面是为本文设置环境所用的软件配置:

  • 操作系统: Red Hat Linux Enterprise Server 2.4.21-27 GNU/Linux
  • DB2: DB2 UDB Enterprise Server Edition(ESE) Version 8.1.0.96,Fixpak 10
  • TSA: TSA 1.2.0 FP0005 Linux

硬件配置

下面是为本文设置环境所用的硬件配置。
集群域中有两台 IBM eServer pSeries® 690 服务器机器,它们都具有以下配置:

  • 处理器:Intel Xeon MP 4 CPU 2.70 GHz
  • 内存:8 GB
  • 网络适配器:两个 Intel PRO/1000 Ethernet Adapters

灾难恢复站点上的一台 IBM eServer pSeries 690 服务器机器具有以下配置:
  • 处理器:Intel Xeon CPU 3.0 GHz
  • 内存:8 GB
  • 网络适配器:两个 Intel PRO/1000 Ethernet Adapters

外部共享存储

在集群端有 4 个 IBM FastT600 Fiber Channel Disks,在灾难恢复站点上有 4 个 IBM DS4300 Fiber Channel Disks。

安装和配置说明

下面一节介绍一个 3 节点的拓扑结构,如 图 1 所示。在这个示例中,有一个主动 - 被动式的 TSA 集群域,这个域由 2 个节点组成(Node1 和 Node2),它们共享一个存储,其中包含实际的 DB2 数据库文件和软件。这个拓扑结构中的第三个节点(Node3)由远程位置上的灾难恢复站点组成,它托管前面提到的主数据库的备用数据库。TSA 集群域和备用服务器通过专用线路链接在一起。这个 HADR 设置的主数据库名和备用数据库名是 jsbmain

NODE1:主动 - 被动式的 TSA 集群域设置的机器之一。在当前的设置中,这个节点是主动节点,并拥有集群的资源。

NODE2:TSA 集群域设置的第二台机器。在当前的设置中,这个节点是被动节点,它作为集群的备用节点。

NODE3:这台机器是用于 DB2 故障恢复的 HADR 备用服务器,它不属于 TSA 集群域设置。

下面详细描述在 TSA 集群域中成功配置 DB2 HADR 的步骤。这个设置假设 TSA 集群域已经正确地设置好了。关于如何设置基本 TSA 集群域以及相关命令的更多信息,请参考 附录 A


步骤 1:基本网络设置



1. 在每个节点的 /etc/hosts 文件中添加适当的 IP 地址到主机名映射。每个节点上的 hosts 文件应该像下面这样:

10.1.1.5 NODE1
10.1.1.6 NODE2
10.1.1.2 NODE3

2. 在每个节点上 ping 主机名或 IP 地址,确保这三个节点(例如,Node1、Node2 和 Node3)能够通过 TCP/IP 协议互相通信。

3. 在集群的所有节点(Node1 和 Node2)和备用机器(Node3)上,确保 /etc/services 文件中设置的 HADR 服务监听的端口是相同的。

在所有三台机器上,来自 /etc/services 文件的示例输出应该下面这样:

DB2_HADR_15 55001/tcp
DB2_HADR_16 55005/tcp

在这个示例中,DB2_HADR_15 是集群主节点上运行的 HADR 服务的名称,DB2_HADR_16 是备用服务器上运行的 HADR 服务的名称。


步骤 2:RSH 设置

注意:这个设置中使用的许多 TSA 命令要求在所有三个节点上设置 RSH。RSH 允许用户从一个节点上发出在另一个远程节点上执行的命令。关于在 Red Hat Linux 上设置 RSH 的更多信息,请参考本文的 参考资料 一节。


通过在 /root/.rhosts 文件中添加以下代码行来配置 RSH,从而允许根用户在每个节点(NODE1、NODE2 和 NODE3)上发出远程命令。

Node1 root
Node2 root
Node3 root

作为根用户登录,并在每个节点上发出以下命令:

# rsh Node1 ls
# rsh Node2 ls
# rsh Node3 ls

应该会看到 NODE1、NODE2 和 NODE3 上 /root 的目录清单。


步骤 3:TSA 设置

关于基本的 2 节点 TSA 集群域设置,请参考 附录 A。另外,在附录 A 中还有关于相关 TSA 命令的更多信息。

步骤 4:HADR 设置



注意:在这个设置中,数据库存储在外部共享存储 /jsbdata 中,这是一个 fastT600 光纤通道磁盘阵列。在集群的两台机器上,实例是不同的(尽管名称都是 db2inst1),但是数据库是相同的。DB2 附带的默认 TSA 脚本不支持主服务器和备用服务器(在 TSA 级)使用相同的名称。需要修改这些脚本来支持这个配置。

使用下面的编目命令在两个实例上注册数据库信息:

db2 CATALOG DATABASE jsbmain AS jsbmain ON /JSBDATA


从命令行处理程序(CLP)发出以下命令:

在主数据库服务器(Node1)上:


db2 CONNECT RESET

db2 UPDATE DB CFG FOR jsbmain USING INDEXREC RESTART LOGINDEXBUILD ON LOGARCHMETH1 "DISK: /jsbmain/ARCHFILES" LOGPRIMARY 100 LOGSECOND 50 LOGFILSIZ 5000

db2 BACKUP DATABASE jsbmain TO "/jsbmain/JSBBAK" WITH 2 BUFFERS BUFFER 1024 PARALLELISM 4 WITHOUT PROMPTING


存储主服务器的备份的目录(/jsbmain/jsbbak)应该可以从备用服务器(Node3)访问,或者将它复制到备用服务器上的本地驱动器,这样恢复过程才能完成它。

注意:建议将备份文件复制到备用服务器上的本地驱动器,从而进行本地恢复,这是因为远程恢复要花更多的时间,因为恢复缓冲区必须通过网络传送。

在备用服务器(Node3)上:


db2 RESTORE DATABASE jsbmain FROM "/jsbmain/JSBBAK" REPLACE HISTORY FILE WITHOUT PROMPTING


步骤 5:为自动客户机重路由配置数据库

在主服务器(Node1)上,从 db2 CLP 执行以下命令,从而启用 HADR 的自动客户机重路由特性:



db2 UPDATE ALTERNATE SERVER FOR DATABASE jsbmain USING HOSTNAME 10.1.1.2 PORT 45000

这里的 10.1.1.2 是备用服务器(NODE3)的 IP 地址,45000 是备用服务器的 db2inst3 实例监听的端口号。

在备用服务器(NODE3)上,从 db2 提示执行以下命令,从而启用 HADR 的自动客户机重路由特性:

db2 UPDATE ALTERNATE SERVER FOR DATABASE jsbmain USING HOSTNAME 10.1.1.1 PORT 50000



要点:当为备用服务器指定替代服务器的主机名时,应该确保指定 TSA 集群域的虚拟 IP 地址(在这个示例中,虚拟 IP 地址是 10.1.1.1)。

50000 是 db2inst1 实例监听的端口号。要确保 TSA 集群域的 Node2 和 Node1 上的 db2inst1 监听相同的端口。否则,在发生 HADR 故障恢复时,服务器 Node3 上的 db2inst3 会尝试与 db2inst1 的端口 50000 通信(在发生灾难时,db2inst1 不是主动的)。所有客户机应该至少连接主服务器一次,从而获得在发生灾难时使用的替代服务器信息。

要想了解关于 HADR 的自动客户机重路由特性的更多信息,请参考本文的 参考资料 一节。




步骤 6:更新 HADR 配置参数

在集群的主动节点(在这个示例中是 Node1)的数据库上执行以下命令,让这个数据库成为 HADR 设置的主数据库:


db2 UPDATE DB CFG FOR jsbmain USING HADR_LOCAL_HOST 10.1.1.1

db2 UPDATE DB CFG FOR jsbmain USING HADR_LOCAL_SVC DB2_HADR_15

db2 UPDATE DB CFG FOR jsbmain USING HADR_REMOTE_HOST 10.1.1.2

db2 UPDATE DB CFG FOR jsbmain USING HADR_REMOTE_SVC DB2_HADR_16

db2 UPDATE DB CFG FOR jsbmain USING HADR_REMOTE_INST DB2INST3

db2 UPDATE DB CFG FOR jsbmain USING HADR_SYNCMODE NEARSYNC

db2 UPDATE DB CFG FOR jsbmain USING HADR_TIMEOUT 120


注意:应该特别注意,在 HADR 设置的主服务器的 HADR_LOCAL_HOST 中,一定要指定 TSA 集群域的虚拟 IP 地址,这样 HADR 才能在这个环境中正常发挥作用。


在备用服务器(Node3)上执行以下命令,让这个数据库成为 HADR 设置的备用数据库:


db2 UPDATE DB CFG FOR jsbmain USING HADR_LOCAL_HOST 10.1.1.2

db2 UPDATE DB CFG FOR jsbmain USING HADR_LOCAL_SVC DB2_HADR_16

db2 UPDATE DB CFG FOR jsbmain USING HADR_REMOTE_HOST 10.1.1.1

db2 UPDATE DB CFG FOR jsbmain USING HADR_REMOTE_SVC DB2_HADR_15

db2 UPDATE DB CFG FOR jsbmain USING HADR_REMOTE_INST DB2INST1

db2 UPDATE DB CFG FOR jsbmain USING HADR_SYNCMODE NEARSYNC

db2 UPDATE DB CFG FOR jsbmain USING HADR_TIMEOUT 120

确保 TSA 域中的两个服务器 备用服务器都为 DB2 通信启用了 TCPIP 协议。在 TSA 域的两个服务器以及备用服务器上,执行 db2set DB2COMM=TCPIP 命令。

步骤 7:启动 HADR



作为备用实例(db2inst3)的所有者,在备用节点(Node3)上启用 HADR,如下所示:

db2 DEACTIVATE DATABASE jsbmain

db2 START HADR ON DATABASE jsbmain AS STANDBY

作为主实例(db2inst1)的所有者,在主节点(Node1)上启用 HADR,如下所示:

db2 DEACTIVATE DATABASE jsbmain

db2 START HADR ON DATABASE jsbmain AS PRIMARY

注意:在启动 HADR 时,一定要先在备用服务器上启动 HADR 服务,然后在主服务器上启动。同样,在停止 HADR 时,要先在主服务器上停止服务,然后是备用服务器。


步骤 8:检查 HADR 设置

现在,已经完成了 HADR 设置,就应该检查它是否能够正常工作。

在主服务器(Node1)上执行以下命令:

db2 GET SNAPSHOT FOR DB ON jsbmain
输出应该像下面这样:


HADR Status Role = Primary
State = Peer
Synchronization mode = Nearsync
Connection status = Connected, 11/24/2006 03:43:39.044650
Heartbeats missed = 0
Local host = 10.1.1.1
Local service = DB2_HADR_15
Remote host = jsbdr
Remote service = DB2_HADR_16
Remote instance = db2inst3
timeout (seconds) = 120
Primary log position (file, page, LSN) = S0000139.LOG, 0, 000000003C8E0000
Standby log position (file, page, LSN) = S0000139.LOG, 0, 000000003C8E0000
Log gap running average (bytes) = 0

在备用服务器(Node3)上执行以下命令:

db2 GET SNAPSHOT FOR DB ON jsbmain

备用服务器中的输出应该像下面这样:


HADR Status
Role = Standby
State = Peer
Synchronization mode = Nearsync
Connection status = Connected, 11/24/2006 03:41:59.782744
Heartbeats missed = 0
Local host = jsbdr
Local service = DB2_HADR_16
Remote host = 10.1.1.1
Remote service = DB2_HADR_15
Remote instance = db2inst1
timeout (seconds) = 120
Primary log position (file, page, LSN) = S0000139.LOG, 0, 000000003C8E0000
Standby log position (file, page, LSN) = S0000139.LOG, 0, 000000003C8E0000
Log gap running average (bytes) = 0

关于 HADR 对的各种状态和 HADR 的实际工作方式的更多信息,请参考本文的 参考资料 一节。

步骤 9:测试 HADR 的故障恢复

设置过程的最后一步是测试 HADR 的故障恢复功能。执行以下步骤:


a. 用 db2_kill 命令手工关闭主服务器。

b. 在备用服务器上执行接管命令。

db2 TAKEOVER HADR ON jsbmain

c. 如果一般的接管不起作用,就需要指定 BY FORCE 选项,强迫 db2 切换到备用服务器上的 HADR。

d. 现在,像前面那样检查系统的状态,就会发现备用服务器正在起到主服务器的作用。状态可能要花一点儿时间才能反映,因为应用日志缓冲区时会有网络延迟,在此期间备用服务器会显示 Remote catch up pending 状态。

现在,已经在 TSA 集群上设置了 DB2 HADR!!







附录 A


设置 2 节点 TSA 集群域所用的命令


使用以下命令设置 2 节点 TSA 集群域:


preprpnode:这个命令为集群中包含的节点准备安全设置。当发出这个命令时,在节点之间交换公共密钥并修改 RMC 访问控制列表(ACL),让集群的所有节点都能够访问集群资源。

mkrpdomain:这个命令创建一个新的集群定义。它用来指定集群的名称以及要添加进集群的节点列表。

lsrpdomain:这个命令列出运行这个命令的节点所属集群的相关信息。

startrpdomain / stoprpdomain:这些命令分别使集群在线和离线。

addrpnode:在定义并运行集群之后,使用这个命令在集群中添加新节点。

startrpnode / stoprpnode:这些命令分别使集群中的单独节点在线和离线。在执行系统维护时常常使用这些命令。停止节点,执行修复或维护,然后重新启动节点,这时它会重新加入集群。

lsrpnode:这个命令用来查看为集群定义的节点列表,以及每个节点的操作状态(OpState)。注意,这个命令只在集群中的在线节点上有效;在离线节点上,它不显示节点列表。

rmrpdomain:这个命令删除一个定义的集群。

rmrpnode:这个命令从集群定义中删除一个或多个节点。


对这些命令的详细描述,请参考以下手册,这些手册都可以在 IBM TSA CD 上找到:

IBM Reliable Scalable Cluster Technology for Linux, Administration Guide, SA22-7892
IBM Reliable Scalable Cluster Technology for Linux, Technical Reference, SA22-7893
IBM Reliable Scalable Cluster Technology for AIX 5L: Administration Guide, SA22-7889
IBM Reliable Scalable Cluster Technology for AIX 5L: Technical Reference, SA22-7890

在本文后面的 参考资料 一节中也可以找到 TSA 参考资料。

定义和管理集群


下面的场景展示如何创建集群、在集群中添加节点以及检查 IBM TSA 守护进程(IBM.RecoveryRM)的状态。

创建 2 节点的 TSA 集群域


为了创建这个集群,需要执行以下步骤:

1. 作为 root 在集群中的每个节点上登录。

2. 在每个节点上设置环境变量 CT_MANAGEMENT_SCOPE=2


export CT_MANAGEMENT_SCOPE=2


3. 在所有节点上发出 preprpnode 命令,从而使集群节点能够相互通信。


preprpnode node01 node02


4. 现在,可以创建名为 “SA_Domain” 的集群,它在 Node1 和 Node2 上运行。可以从任何节点发出以下命令:


mkrpdomain SA_Domain node01 node02


注意: 在使用 mkrpdomain 命令创建 RSCT 对等域(集群)时,对等域名使用的字符只限于以下的 ASCII 字符:A-Z、a-z、0-9、.(点号)和 _(下划线)。

5. 要查看 SA_Domain 的状态,发出 lsrpdomain 命令:


Output:
Name-------OpState-------RSCTActiveVersion-------MixedVersions-------TSPort-------GSPort
SA_Domain--Offline-------2.3.3.0---------------------No--------------------12347--------12348

集群已经定义了,但是处于离线状态。

6.发出 startrpdomain 命令,让集群在线:


startrpdomain SA_Domain


当再次运行 lsrpdomain 命令时,会看到集群仍然处于启动过程中,OpState 是 Pending Online。


Output:
Name-------OpState-----------------RSCTActiveVersion-------MixedVersions-------TSPort-------GSPort
SA_Domain--Pending Online-------2.3.3.0---------------------No--------------------12347--------12348

注意:
1. 可能会收到下面这样的错误消息:

“2632-044 the domain cannot be created due to the following errors that were detected while harvesting information from the target nodes:
node1: 2632-068 this node has the same internal identifier as node2 and cannot be included in the domain definition.”

如果克隆了 Linux 映像,常常会发生这个错误。集群的配置出现了错误,应该重新设置整个配置。为了解决这样的问题,可以在错误消息中指出的节点上,运行 /usr/sbin/rsct/install/bin/recfgct 命令来重新设置节点 ID。

然后从 preprpnode 命令开始继续设置。

2. 还可能会收到下面这样的错误消息:

“2632-044 The domain cannot be created due to the following errors that were detected while harvesting information from the target nodes:
node1: 2610-418 Permission is denied to access the resources or resource class specified in this command.”

为了解决这个问题,应该检查主机名解析。在所有节点上的本地 /etc/hosts 文件中,确保每个集群节点的所有条目和名称服务器条目是相同的。

在现有的集群中添加节点

在创建 2 节点集群之后,可以按照以下方法在 SA_Domain 中添加第三个节点:

1. 作为根用户发出 lsrpdomain 命令,查看集群是否在线:


Output:
Name-------OpState-------RSCTActiveVersion-------MixedVersions-------TSPort-------GSPort
SA_Domain--Online-------2.3.3.0---------------------No--------------------12347--------12348

2. 发出 lsrpnode 命令,查看哪些节点在线:

Name OpState RSCT Version
node02 Online 2.3.3.0
node03 Offline 2.3.3.0
node01 Online 2.3.3.0

3. 作为根用户发出以下的 preprpnode 命令,让现有节点和新节点能够相互通信。

作为根用户登录 Node3 并输入:


preprpnode node01 node02


作为根用户登录 Node2 并输入:


preprpnode node03


作为根用户登录 Node1 并输入:


preprpnode node03


确保在所有节点上执行 preprpnode 命令。强烈建议这样做。

4. 为了将 Node3 添加到集群定义中,作为根用户在 Node1 或 Node2(这两个节点应该已经在集群中在线)上发出 addrpnode 命令:


addrpnode node03

作为根用户发出 lsrpnode 命令,查看所有节点的状态:

Name OpState RSCT Version
node02 Online 2.3.3.0
node03 Offline 2.3.3.0
node01 Online 2.3.3.0

5. 作为根用户,从一个在线节点启动 Node3:


startrpnode node03


经过短暂的延迟之后,Node3 应该也在线了。

致谢


我要感谢 IBM 硅谷实验室的数据库顾问 Priti Desai,感谢她所做的输入和审校工作,她的努力对本文的成功完成有很大帮助。



参考资料

学习

获得产品和技术
  • 下载 DB2 Enterprise 9 的免费试用版。现在可以免费使用 DB2。下载 DB2 Express-C,这是为社区提供的 DB2 Express Edition 的免费版本,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。DB2 Express-C

讨论


关于作者


Girish Sundaram 是 IBM 印度软件实验室的 Services and Solutions 团队的高级数据库顾问,他主要从事用各种战略性 ISV Accounts 跨各个领域实现任务关键的 DB2 解决方案。他擅长多种数据库技术,尤其是性能调优、迁移、应用程序架构、优化和设计。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14789789/viewspace-539588/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-07-08

  • 博文量
    355
  • 访问量
    858843