使用 Informix Dynamic Server 的复制技术

在服务器、域和集群中使用复制技术

IBM® Informix® Dynamic Server(IDS)一直以来都是一种具备强大复制技术的数据库。企业复制(Enterprise Replication,ER)和高可用性数据复制(High-Availability Data Replication,HDR)多年来为客户提供了可靠的服务。在较新的 IDS 版本 11.1 以及目前的 11.5 中,又添加了一些新的技术:远程独立(Remote Standalone)备用服务器和共享磁盘(Shared-Disk)备用服务器。本文将通过使用这些技术来简要了解各种技术的特征和细节。

企业复制(ER)

ER 是什么?

数据库可以为您存储重要的业务数据,并且业务人员意识到将数据存储到至少两个不同的位置是一项非常明智的策略。如果您可以告诉数据库将需要的数据自动复制到另一个服务器,岂不是很好?是的,从 Version 7 开始,IDS 已经具备了这种能力。这通过企业复制(ER)技术来实现,这种技术灵活且功能强大。

要使用 ER 技术,首先确定需要复制数据的服务器。这将创建一个用来传输数据的网络拓扑结构 — 包括根、叶、非根和非叶节点。每个 ER 节点 可能是一个单个服务器或一个服务器集群,本文后面将介绍到。所有这些互相连接的节点统称为一个 ER 域(domain)。域并不定义传输哪些数据,而仅仅定义数据传输时经过的路径或路线。

接下来,要确定希望复制哪些数据。这是通过一个涉及服务器、数据库、表和列的 SQL 查询定义的。这个查询充当一个过滤器,它的输出决定要复制哪些数据,是一种非常灵活的工具。如果您想要复制整个表,那么查询应为 SELECT * FROM ...。如果仅需要复制表的前三列,应使用查询 SELECT column1, column2, column3 FROM ...。或者,如果只希望复制表的某些行,那么只需要在查询中使用 WHERE 子句。ER 可以使用非常粗糙或非常精细的过滤器复制数据。要实现更好的复制,ER 要求表定义一个主键。

编写了查询之后,确定哪些节点需要参与到数据复制中。假设您要求节点 A、B 和 C 将相同的数据放到 Employee 表,则 A、B 和 C 节点就是参与节点。可以对 ER 进行配置,因此如果在任何服务器上修改了数据,那么也将更新其他参与节点。这种情况称为 update anywhere 场景。如果您只希望从 A 开始更新,然后进一步更新 B 和 C,但是不再回到 A,该怎么办呢?ER 也针对这些 primary-target 场景提供了灵活性。对于数据修改发生在多个参与节点的情况,那么服务器 B 中修改的行可能与服务器 C 中的修改发生冲突。ER 允许您定义规则来自动处理这种冲突。这些规则包括比较时间戳、返回一个存储过程和忽略冲突。

现在了解了查询、参与节点和场景知识后,将利用这些信息实现复制(replicate)。将一个复制看作一个可以控制查询数据流的水龙头。可以将水龙头拧开或关闭,并且您可以使用任意数量的水龙头。可以将复制划分到一些集合中,这样便于用户控制多个复制。同样,可以使用模板快速创建针对多个表的复制。所有这些工作都可以通过服务器实用工具 cdr 来完成。

创建并启动了一个复制后,如何实际地移动数据?首先,复制是异步进行的。这意味着数据从一个节点提交之后会延迟一段时间才呈现在另一个节点。当然,只有提交的数据才会被复制。ER 首先读取逻辑日志,检验日志记录是否需要复制,最后将这些信息发送给相应的参与节点。

一个简单示例

让我们创建一个简单的 ER 示例。我们将使用 update-anywhere 方式在服务器 1 和服务器 2 之间复制 “db1” 数据库的 employees 表(以下步骤假设使用了 informix 帐户)。

步骤 1:准备 SQLHOSTS 文件

每个服务器的文件应该包含针对两个服务器的一个条目及两组定义。每个组表示一个 ER 节点

grp1		group	 	- 	- 	i=1
server1		onsoctcp	host	port	g=grp1

grp2		group		- 	- 	i=2
server2		onsoctcp	host	port	g=grp2

步骤 2:准备 ER 磁盘空间

针对每个服务器执行以下步骤:

  1. 编辑 ONCONFIG 以包含一个 smart blob 空间:
    CDR_QDATA_SBSPACES sbs1
  2. 启动服务器。
  3. 为 smart blob 空间准备一个块,并将这个空间添加到服务器。例如,在 UNIX 中:
    touch /ids/chunks/sbs1_chunk1
    chmod 660 /ids/chunks/sbs1_chunk1
    onspaces -c -S sbs1 -p /ids/chunks/sbs1_chunk1 -s 100000 -o 0

步骤 3:将节点添加到一个新的 ER 域

在 server1 上,执行以下命令:

cdr define server --init grp1

。在 server2 上,执行以下命令:

cdr define server --sync=grp1 --init grp2

这些命令创建了两个根节点的 ER

步骤 4:准备要执行复制的表

在 server1 和 server2 中,运行以下 SQL 语句:

CREATE DATABSE db1 WITH LOG;
CREATE TABLE employees(id int primary key, ...);

步骤 5:执行复制

在 server1 上,执行:

cdr define replicate --conflict=ignore r_employees \
"db1@grp1:informix.employees"  "select * from employees" \
"db1@grp2:informix.employees"  "select * from employees"

步骤 6:启动复制

在任意一个服务器上,运行以下命令:

cdr start replicate r_employees

现在您正在执行数据复制!无论对 server1 还是 server2 中的行执行插入、更新或删除操作,都会映射到另一个服务器。这只是 ER 应用的基础。要了解有关 ER 技术和命令的更多内容,请参阅 IDS InfoCenter 的 “复制” 小节(参见 参考资料)。


高可用性集群

从 Version 11.1 开始,IDS 包含了基于集群的复制功能。在一个集群中,您将获得规模扩展(scale-out)、高可用性、灾难恢复和负载平衡功能。这项技术被内置到数据库中,并且不需要额外的硬件、软件或网络基础设施。与 ER 形成对比的是,在一个集群中,无法控制数据复制的粒度;而是始终复制整个服务器的数据。如后文所示,集群和 ER 技术可以结合使用。

一个集群包含有一个主服务器和三个不同类型的备用服务器:

  1. 共享磁盘(Shared Disk,SD)备用服务器
  2. 高可用性数据复制(High-Availability Data Replication,HDR)服务器
  3. 远程独立(Remote Standalone,RS)备用服务器

服务器必须使用相同的 IDS 版本并运行在相同的操作系统、硬件和磁盘架构上。在 11.1 中,备用服务器只允许应用程序读取数据。在 11.5 中,应用程序可以插入、更新和删除备用服务器上的数据。因此,所有三个备用服务器类型都可用于增加主服务器的容量并平衡负载。下面的 表 1 对服务器类型进行了比较。表 2 列出了一些常见 ONCONFIG 设置。

表 1. 集群服务器类型特征概览
主服务器 SD 备用服务器 HDR RS 备用服务器
主 IDS 版本 11.1 6.00 11.1
主要作用 增加容量/规模扩展 高可用性/热备用 灾难恢复/远程备份
每个集群的最大节点数 1 无限制 1 无限制
一个步骤可以执行的类型修改 SD 备用服务器、HDR、标准服务器 主服务器 主服务器、RS 备用服务器、标准服务器 HDR、标准服务器
支持的隔离级别 所有 脏读(Dirty read)、提交后读(Committed Read)、最后一次提交后读(Committed Read Last Committed) 脏读 脏读
表 2. 集群服务器类型常见的 ONCONFIG 参数
配置参数 服务器类型 支持的值 描述
HA_ALIAS SD 和 RS 备用服务器 DBSERVERNAME 或其中一个 DBSERVERALIAS 名称。必须是一个网络协议。 用于定义集群内用来标识备用服务器的名称,从而灵活地使用除 DBSERVERNAME 以外的名称。
LOG_INDEX_BUILDS 主服务器、HDR 和 RS 备用服务器 0 – 禁用索引页面日志记录
1 – 启用索引页面日志记录
在主服务器创建一个新的索引时,索引页面日志记录(Index Page Logging,IPL)将索引页面写入到逻辑日志文件。RSS 节点要求启用索引页面日志记录功能,而这在 HDR 备用服务器中是可选的。
REDIRECTED_WRITES HDR、SD 和 RS 备用服务器 0 – 禁用备用服务器中的写功能
>=1 – 启用备用服务器中的写功能
确定用于主服务器和备用服务器之间支持数据更新的网络连接数量。
TEMPTAB_NOLOG 主服务器、HDR、SD 和 RS 备用服务器 0 – 创建临时表,默认启用日志记录
1 – 创建临时表,但不启用日志记录。
对于 HDR、RSS 和 SD 备用服务器,需要设置为 1。对于使用 CREATE TEMP TABLE 或 SELECT INTO TEMP 语句创建的显式临时表,需要控制默认的日志记录模式。备用服务器决不能使用经过日志记录的临时表。

现在我们再多了解一点服务器类型。探讨它们的特征、ONCONFIG 参数,并伴使用其中一种类型创建一个集群。


共享磁盘(SD)备用服务器

SD 备用服务器与主服务器共享磁盘空间 — 临时 dbspaces 除外。这通常通过一个基于网络的集群式文件系统来实现。向集群添加新的 SD 备用服务器非常简单,准备好共享磁盘后只需几秒就可完成。由于 SD 备用节点利用了主服务器的磁盘并且可以轻松快速地启动,因而非常适合规模扩展场景。SD 备用服务器中的检查点是同步的。这意味着只有在 SD 服务器中的检查点完成后,主服务器中的检查点才能完成。从 IDS 11.5 以后,SD 备用服务器支持提交后读、最后一次提交后读和脏读隔离级别。通过一个简单的命令,一个 SD 备用服务器可以通过一个命令提升为主服务器:onmode -d make primary <name of SD server>。由于 SD 备用服务器非常接近主服务器(即它们共享相同的磁盘),因此最适合在主服务器遇到问题时作为故障转移服务器。

表 3. 为 SD 备用服务器导入 ONCONFIG 参数
配置参数 服务器类型 支持的值 描述
SDS_ENABLE 主服务器、SD 备用服务器 0 – 禁用 SDS 功能
1 – 启用 SDS 功能
使用该参数允许将 SD 备用服务器添加到集群。
SDS_PAGING SD 备用服务器 <分页文件 1 的绝对路径>,<分页文件 2 的绝对路径> 必须配置两个分页文件来启动 SDS 节点。
SDS_TEMPDBS SD 备用服务器 <dbspace_name>、<路径>、<页面大小以 KB 为单位>、<偏移量以 KB 为单位>、<大小以 KB 为单位> SD 备用节点的临时 dbspace 信息。最多可以配置为 16 SDS_TEMPDBS 条目。
示例:
SDS_TEMPDBS sdstmpdbs1, /work/dbspaces/sdstmpdbs1,2,0,16000
SDS_TIMEOUT 主服务器 >= 0 秒 该配置参数用于主服务器确定要从 SD 服务器获得确认需要等待多长时间,如果没有获得确认,主服务器将停止 SD 服务器。默认值为 20 秒。

向集群添加 SD 备用服务器

让我们以一个独立的 IDS 服务器为例并将它添加到集群中。首先将添加一个 SD 备用服务器(这里假设已经设置了一个共享磁盘文件系统并使用了一个 informix 帐户)。

步骤 1:准备 SQLHOSTS 文件

确保 SQHOSTS 文件在主服务器和 SDS 节点都具有另一个服务器的条目:

g_mach11  group     -         -          i=10
myprim    ontlitcp  primhost  prim_port  g=g_mach11
sds1      ontlitcp  sds1host  sds1_port  g=g_mach11

注意这里使用的组是可选的。不过,我们在这里包含它是为下一个示例做准备。

步骤 2:将主服务器设置为共享磁盘的所有者

在主服务器中,运行:

onmode -d set SDS primary myprim

步骤 3:配置 SD 备用服务器

  1. 确保以下参数匹配主服务器的 ONCONFIGROOTNAMEROOTPATHROOTOFFSETROOTSIZEPHYSDBSPHYSFILELOGFILESLOGSIZE
  2. SDS_ENABLE 设置为 1。
  3. 配置 SDS_PAGINGSDS_TEMPDBS

例如:

SDS_ENABLE         1
SDS_PAGING         /ids/sds/dbspaces/page_1,/ids/sds/dbspaces/page_2
SDS_TEMPDBS        sdstmpdbs1,/ids/sds/dbspaces/sdstmpdbs1,2,0,16000
REDIRECTED_WRITES  1
TEMPTAB_NOLOG      1

步骤 4:启动 SD 备用服务器

oninit

现在 SD 备用服务器已经启动并运行!可以使用 onstat -g sds 命令在主服务器和备用服务器中检查集群的状态。下面展示了我们的集群的状态:

图 1. 集群:主服务器和 SD 备用服务器

集群:主服务器和 SD 备用服务器

高可用性数据复制(HDR)

高可用性数据复制(即 HDR)是 IDS 中最老的复制技术。它由一对服务器组成 — 主服务器和 HDR 备用服务器 — 并且同时支持异步和同步复制模式。在同步模式下,只有接收到来自 HDR 备用服务器的确认,主服务器才会提交事务。因此 HDR 备用服务器可以立即替代主服务器 — 这称为 “热” 备用。在异步模式下,只有检查点在主服务器和 HDR 备用服务器之间是同步的。HDR 的一个特点是它使用半双工通信协议,因此对网络延迟非常敏感。而 SD 和 RS 备用服务器则不具备这个特征。

表 4. HDR 服务器的重要 ONCONFIG 参数
配置参数 服务器类型 支持的值 values 描述
DRAUTO 主服务器和 HDR 服务器 0 – 手动
1 – 自动故障转移,最终保持服务器类型
2 – 自动故障转移,最终反转服务器类型
3 – 使用 Connection Manager Arbitrator 控制故障转移
控制主服务器和 HDR 备用服务器在出现故障时的行为。
DRIDXAUTO 主服务器和 HDR 服务器 0 – 禁用自动索引修复
1 – 启用自动索引修复
如果 HDR 备用服务器检测到崩溃,自动修复索引。
DRINTERVAL 主服务器 -1 – 在同步模式下操作
>= 0 – 在异步模式下操作
高可用性数据复制缓冲器的最大刷新间隔,单位为秒。
DRLOSTFOUND 主服务器和 HDR 服务器 <lost and found 文件的路径> HDR lost-and-found 事务文件的路径。该文件在执行故障转移期间创建,包含主服务器(而不是 HDR 服务器)中提交的事务。
DRTIMEOUT 主服务器 >= 0 秒
默认值 = 30 秒
出现网络超时的时间,以秒为单位。DRAUTO 使用该参数检测故障转移。

向集群添加 HDR 服务器

现在向集群添加一个 HDR 备用服务器模式。

步骤 1:准备 SQLHOSTS 文件

在主服务器更新 SQLHOSTS 文件,同时在 SDS 和 HDR 备用服务器中更新:

g_mach11  group     -         -          i=10
myprim    ontlitcp  primhost  prim_port  g=g_mach11
hdr       ontlitcp  hdrhost   hdr_port   g=g_mach11
sds1      ontlitcp  sds1host  sds1_port  g=g_mach11

步骤 2:配置 ONCONFIG 文件

要开始使用 HDR,某些 ONCONFIG 参数在主服务器和备用服务器上必须是相同的。在很多情况下,这意味着在运行任意一种服务器时,不能修改这些参数。这些参数包括 DRAUTODRINTERVALDRTIMEOUT、与根 dbspace 相关的设置、与逻辑日志相关的设置,等等。要确保这些设置是匹配的,一种方法是将主服务器的 onconfig 复制到备用服务器,然后确保将一些设置修改为不同内容,比如 DBSERVERNAME。您应该在启动主服务器之前计划好这些设置。本文的示例只使用了默认值。

步骤 3:备份主服务器

在主服务器中,使用 0 级备份:

ontape -s -L 0

步骤 4:将 HDR 备份服务器注册到主服务器

在主服务器中,运行:

onmode -d primary hdr

步骤 5:准备 HDR 备用服务器的磁盘

HDR 备用服务器使用的存储必须匹配主服务器的存储(例如,必须匹配 dbspace 的数量、块的数量、块大小、路径名和偏移量)。因为这个例子使用备份恢复 HDR 备用服务器,因此只需要块文件和适当的权限。

步骤 6:恢复 HDR 备用服务器上的备份

在 HDR 服务器上,执行 0 级备份的物理恢复:

ontape -p

  Three questions will be asked.  Answer as shown below:
   Continue restore? (y/n) y
   Do you want to back up the logs? (y/n) n
   Restore a level 1 archive (y/n) n

步骤 7:使 HDR 备用服务器进入 online 模式

完成恢复后,HDR 备用服务器将进入 recovery 模式。运行以下命令:

onmode -d secondary myprim

HDR 备用服务器现在已启动并运行!在主服务器和 HDR 备用服务器中运行 onstat -g dri 命令以检查 HDR 状态。现在的集群如下所示:

图 2. 集群:主服务器、一个 SD 备用服务器和一个 HDR 备用服务器

集群:主服务器、一个 SD 备用服务器和一个 HDR 备用服务器

远程独立(RS)备用服务器

RS 备用服务器的主要作用是提供灾难修复解决方案。如同在 HDR 中一样,主服务器不断将其所有的逻辑日志记录发送给 RS 备用服务器,不过 RS 使用的异步方式。与 HDR 不同,通信使用全双工协议。因此 RS 对网络延迟不是很敏感,并且可以更容易驻留在一个较远的地理位置。RS 备用服务器的一个特点是主服务器并不和 RS 备用服务器同步检查点,这一点和 SD 和 HDR 服务器不同。因此不能立即替代主服务器;必须首先切换为一个 HDR 服务器。不过,如果集群中发生多个故障转移,RS 节点可以防止您的数据库变得完全不可用。

表 5. 为 RS 备用服务器导入 ONCONFIG 参数
配置参数 服务器类型 支持的值 描述
LOG_INDEX_BUILDS 主服务器 0 – 禁用索引页面日志记录
1 – 启用索引页面日志记录
当在主服务器中创建一个新的索引时,Index Page Logging(IPL) 将索引页面写入到逻辑日志文件中。Index page logging 必须在主服务器中得到启用,以便向集群添加一个 RS 服务器。

向集群添加 RS 备用服务器

现在向集群添加一个 RS 节点。

步骤 1:准备 SQLHOSTS 文件

集群中的所有服务器必须具有针对其他服务器的 SQLHOSTS 条目。

g_mach11  group     -         -          i=10
myprim    ontlitcp  primhost  prim_port  g=g_mach11
hdr       ontlitcp  hdrhost   hdr_port   g=g_mach11
sds1      ontlitcp  sds1host  sds1_port  g=g_mach11
rss1      ontlitcp  rss1host  rss1_port  g=g_mach11

步骤 2:在主服务器上,启用索引页面日志记录

onmode -wf LOG_INDEX_BUILDS=1

步骤 3:在主服务器上,注册新的 RS 备用服务器

onmode -d add RSS rss1

步骤 4:对主服务器采取 0 级备份

ontape -s -L 0

步骤 5:在 RS 备用服务器中,恢复备份

ontape -p

  Three questions will be asked.  Answer as shown below:
   Continue restore? (y/n) y
   Do you want to back up the logs? (y/n) n
   Restore a level 1 archive (y/n) n

步骤 6:使 RS 备用服务器进入 online 模式

onmode -d RSS myprim

现在 RSS 节点已经启动并运行!在主服务器和 RSS 节点中运行 onstat -g rss 命令查看 RSS 节点状态。现在集群如下所示:

图 3. 集群:主服务器、一个 SD 备用服务器、一个 HDR 备用服务器和一个 RS 备用服务器

集群:主服务器、一个 SD 备用服务器、一个 HDR 备用服务器和一个 RS 备用服务器

结束语

在本文中,我们了解了使用 ER 实现异步复制的灵活性和集群的高可用性特性。如何将这两种特性结合?这是可以实现的!还记得您对集群的 SQLHOSTS 文件使用了 “group” 标记了吗?group 可以成为一个 ER 节点,如本文中的 server1 和 server2 所示。可以使用添加独立服务器时所用的命令,将一个集群作为节点添加到一个 ER 域:cdr define server --sync=<sync node> --init <name of new group to add>。当集群是一个 ER 节点时,主服务器将履行与一个独立服务器节点相同的职责。不过,由于这是一个集群,主服务器还将数据复制到它的所有的备用服务器中。

有待了解的内容还有很多 — 更多关于每种技术的知识,它们如何配合以改进您的 业务,以及更多有关 Connection Manager 和 Continuous Log Restore 等相关的技术!欢迎您进一步了解 IDS!

发表评论