孔再华
作者孔再华2018-05-07 15:12
数据库运维工程师, 中国民生银行

实战Db2 purescale集群HADR容灾解决方案 - 安装配置篇

字数 13499阅读 6351评论 2赞 7

DB2 pureScale集群HADR特性介绍

DB2 pureScale是典型的数据库集群架构,多个成员同时为一个数据库服务。每个成员会记载各自的日志。HADR是基于日志传输的同步手段,在存在多个成员日志的情况下,备集群的成员需要合并日志流,然后重放,从而达到同步的功能。

DB2 pureScale集群HADR容灾架构

在DB2 pureScale集群HADR容灾架构的体系中,备端也需要是DB2 pureScale集群。并且备集群的成员数量要大于或等于主集群的成员数量。这是因为在现有的体系架构下,对于所有在主集群的成员ID,备集群需要有同样的ID的成员结构才能做日志回放。
图1. DB2 pureScale HADR架构
QQ截图20180507145442.png

QQ截图20180507145442.png

Replay Member概念

从图中可以看出DB2 pureScale环境下HADR的实现机制。在备集群中,只有一个成员会执行重做的工作。所有的日志流都是通过TCP/IP网络传输至此成员。所以选取合适的Replay Member非常重要。备集群的Replay Member可以安排资源比较充分的节点。例如可以选择分配更多的CPU和内存的资源给这个LPAR。

Replay Member是一个逻辑的概念,仅仅是指在做回放的成员。用户可以指定偏好的成员来成为Replay Member。这种又称之为Prefer Member,意思是尽可能选择这个prefer的member做Replay Member。

在DB2 pureScale集群HADR的容灾架构中,备集群的Replay Member上数据库是激活并工作的。其他的成员上该数据库是非激活状态。Replay Member这个角色在pureScale集群里面同样具有高可用性。一旦当前的Replay Member出现故障,DB2会在集群里面其他的成员上选择一个激活数据库,成为新的Replay Member。在选择的过程中,如果有prefer member,就会选择prefer member。如果故障的是prefer member,则随机选择一个。所以prefer member并不是强制的概念。Replay Member也可以是任何一个成员。

DB2 pureScale集群HADR同步模式

HADR 同步方式确定高可用性灾难恢复 (HADR) 数据库解决方案对事务损失的保护程度。同步方式决定主数据库服务器根据备用数据库上记录的状态,何时认为事务已完成。 同步方式配置参数值越严格,数据库解决方案就越能防止事务数据丢失,但事务处理速度也越慢。所以必须在防止事务丢失的需求与对性能需求之间取得平衡。

普通HADR同步模式主要有四种:SYNC(同步),NEARSYNC(接近同步),SUPERASYNC(超级异步)和 ASYNC(异步)。在DB2 pureScale环境下早期版本只支持其中的两种同步模式:SUPERASYNC(超级异步)和 ASYNC(异步)。现在的最新10.5和11版本对这四种模式全部支持。

DB2 pureScale集群建设HADR环境需要考虑数据丢失的可能性。异步模式下主数据库上的事务落实操作不会受到相对较慢的 HADR 网络或备用 HADR 服务器的影响,所以主数据库与备用数据库之间的日志间隔可能会继续增大。监视日志间隔很重要,这是因为在主系统上发生真正的灾难时,日志间隔是可能丢失的事务数的间接度量。在灾难恢复方案中,日志间隔期间落实的任何事务都对备用数据库不可用。因此,请使用 hadr_log_gap 监视元素来监视日志间隔;如果出现日志间隔不可接受的情况,请调查网络中断次数或备用数据库节点的相对速度,并采取纠正措施以减小日志间隔。

为了数据的安全性考虑,异地推荐使用SUPERASYNC模式。本地推荐NEARSYNC模式。

DB2 pureScale集群HADR切换方式

与普通单机版DB2数据库的HADR功能一样,DB2 pureScale集群下的HADR功能延续了简单易用的切换方式。仅仅是一条takeover命令,就可以完成整个数据库的主备切换。切换的效率非常高,同时切换过程中也会对数据进行保护,杜绝各种脑裂等情况的发生。DB2 pureScale集群下的HADR的切换也分为正常切换和强制切换这两种。

在主备集群相连通的情况下,正常切换会先关闭原主端的数据库,备端接受完全部日志并回放完成后变为新的主端,原主端会激活数据库变为新的备端,整个切换过程就完成了,数据库也可以提供服务了。HADR也正常工作。

在主备集群相连通的情况下,强制切换会强行关闭原主端的数据库并阻止它激活,也没有改变它的HADR角色属性。然后备端接受完全部日志并回放完成后变为新的主端,整个切换过程就完成了,数据库也可以提供服务了。HADR处于非启动状态。

在主备集群不连通的情况下,备端感受不到主端的状态。这种情况只能进行强制切换。强制切换会将备端的日志回放完成后变为新的主端,数据库提供服务,HADR处于非启动状态。一旦与原主端的网络恢复,就会出现脑裂的场景。DB2会选择杀掉原主端,从而保证不出现脑裂的问题。

DB2 pureScale集群HADR架构下客户端连接方式

对于单机的数据库HADR或者ha集群,虚拟服务IP自动切换是常用的一种方式。客户端通过服务IP连接到数据库主机。一旦主机切换,服务IP会飘移到新的主机上。这种服务IP 飘移需要集群软件支持,例如TSA,HACMP等。然而这种方式对于DB2 pureScale集群是不可行的。
DB2 pureScale集群的实现机制里面使用的是TSA集群软件,基础软件是RSCT。一台机器只能属于一个RSCT集群。所以先前HACMP等集群软件加虚拟IP的方式来配置应用连数据库已经不可行了。如果是虚拟IP,对于pureScale集群来说也很难做到负载均衡等各种连接方式。所以在DB2 pureScale集群HADR架构下,对现有的pureScale集群的连接方式做了增强,加上了备集群的信息后,能够达到自动切换路由(ACR)的功能。在DB2 10.5里面,客户端主要有三种连接方式:

WLB:工作负载均衡是现有的应用方式之一,能够根据成员上资源的消耗来合理安排,使空闲成员处理新的工作的概率更大,从而达到资源的有效利用。在引入了HADR功能之后,WLB依然适用。只要配置好了Alternate Server的信息指向备集群,在HADR切换之后,客户端会自动连接到新的主集群,WLB也能正常生效。

Client Affinity: 在这种方式下,DB2的客户端不需要获取所连接集群的信息,只需要按照自己的偏好列表里面定义的策略去访问节点。所以在偏好列表里面加上备集群的成员节点信息,就能够做到应用的自动切换。

Member Subsetting: 这是在DB2 10.5开始加入的一种新的连接方式。在这种方式下,用户可以控制应用只连接指定的成员节点。在这些成员节点上,应用还可以采用WLB,Affinity或者Round Robin的负载方式。对于HADR来说,这些定义都是存储在数据库内部的,所以切换之后,配置信息不会丢,应用还会延续先前的连接方式。

DB2 pureScale集群HADR架构高可用性

DB2 pureScale集群最大的特点就是具有高可用性,高扩展性和应用透明性。加入的HADR的容灾机制之后,这些特性并没有受到影响。应用连接数据库所使用的原有机制并没有改变。一旦集群里的节点出现故障,原有的集群保护机制依旧生效。那么对于HADR的工作机制来说,这种高可用性也是延续的。

主集群一旦成员节点发生故障,那么该节点的数据库服务会被其他节点所接管。HADR服务也是一样,其他健康的成员节点会帮助传输日志到备集群(日志在共享存储上),从而达到高可用性。这种行为也称为辅助日志传输。

备集群如果发生节点故障,一方面备集群的节点自我恢复能力和普通pureScale集群是一样的。另一方面,如果发生的故障会影响到HADR功能,例如Replay Member被关机,那么HADR的功能也是会自我恢复的。这种情况下集群会挑选一个健康的成员来成为新的Replay Member。

所以pureScale集群里的HADR功能也同样是高可用的,包括主集群辅助日志传输和备集群replay member切换。

DB2 pureScale集群HADR架构容灾特性

DB2 pureScale集群通过HADR功能,传输日志到备端。这种方式既高效又安全,也是延续了普通单机版DB2久经验证的HADR机制。只有生成日志的事务才需要被同步到备集群。HADR的spooling功能能够在Replay Member来不及回放的情况下将日志先缓冲在磁盘上,避免了高峰期对性能的影响和保证了数据的安全。

实战DB2 pureScale集群HADR配置

DB2 pureScale集群HADR的配置与普通单机版DB2的HADR配置相似,只是配置的参数有些许变化。

配置主备集群

主备集群的成员ID需要是同一的。也就是如果主集群的成员节点编号是1、2、3。那么备集群成员节点编号也得是1、2、3,而不能是2、3、4。一般主备集群会是同样的配置。HADR的配置是数据库级别的配置,和实例没有关系。主备集群的实例创建和普通pureScale实例创建一样。在我们的实战环境里面,主要有A,B两个集群。A集群有两个成员节点,分别是purescaleam1和purescaleam2,B集群和A集群的架构一样,两个成员节点分别是purescalebm1和purescalebm2。下面讨论下在集群中与HADR相关的参数配置。

首先是与HADR相关的Db2注册表变量:

  • DB2_HADR_BUF_SIZE:这个参数用来配置HADR接受日志的缓冲池的大小。默认为日志写缓存的两倍。因为从DB2 V10版本开始,HADR引入了Log Spooling的功能,如果接受日志的缓冲池满了,HADR会先将日志保存到磁盘。所以即便接受日志的缓冲池满了,也不会影响日志的传送。建议默认就可以。繁忙的生产环境建议设置为100M。
  • DB2_HADR_NO_IP_CHECK:这个参数主要用于NAT环境。主要用于主备端DB2是否交叉检查local host和remote host的正确性。因为DB2 pureScale不支持NAT,所以这个参数不需要设置。
  • DB2_HADR_PEER_WAIT_LIMIT:这个参数用来设置当日志写入被堵住多少秒之后,主端数据库会跳出peer状态。这个参数主要用于设置HADR对应用性能的影响。在HADR功能堵住的情况下,应用是需要一直等还是跳出peer状态继续工作。网络质量差的环境建议设置较小的值,减少对应用事务的影响。
  • DB2_HADR_ROS:这个参数用来设置是否开启备机读功能。在DB2 V10.5里面, DB2 pureScale集群的HADR功能不支持备机读。所以不需要设置此参数。
  • DB2_HADR_SORCVBUF:用来设置操作系统TCP socket接受缓存大小。如果不设置,这个缓存将采用操作系统的tcp接受缓存设置。
  • DB2_HADR_SOSNDBUF:用来设置操作系统TCP socket发送缓存大小。如果不设置,这个缓存将采用操作系统的tcp发送缓存设置

设置注册表变量的方式如下:

清单 1. 设置DB2注册表参数(案例)

# db2set DB2_HADR_PEER_WAIT_LIMIT=5

配置数据库
在DB2 pureScale创建的数据库只能使用Automatic Storage。数据库路径必须在GPFS共享存储上。

清单 2.创建数据库

# db2 create database TESTDB AUTOMATIC STORAGE YES ON /db2fs/db2data USING CODESET GBK TERRITORY CN

使用HADR的数据库必须启用归档日志模式。

清单 3.启用归档日志

# db2 update db cfg for TESTDB using LOGARCHMETH1 DISK:/db2fs/db2data/archive_log/

数据库运行过程中,最好记录索引创建、重新创建或重组操作,以便可以在DB2前滚操作或HADR日志重放过程中重构索引。

清单 4.启用索引日志记录

# db2 update db cfg for TESTDB using logindexbuild on
# db2 update db cfg for TESTDB using indexrec restart

上面的配置完成后,数据库已经满足了使用HADR功能的条件。在主集群备份数据库,然后在备集群恢复。

清单 5.主集群备份数据库

# db2 backup db TESTDB to /mnt/dbbackup

清单 6.被集群恢复数据库

# db2 RESTORE DATABASE TESTDB from /mnt/dbbackup taken at 20170604152223 to /db2fs/db2data

这样两边就有了同一的数据库,可以开始HADR的配置。配置数据库HADR功能之前,先了解一下HADR相关的数据库配置参数:

  • hadr_local_host: 本地HADR网络名或IP地址
  • hadr_local_svc:  本地HADR端口
  • hadr_peer_window:  此参数是在HADR出现故障的情况下,主备机还保持peer状态的时间。超过这个时间就会变为非peer状态。
  • hadr_remote_host:  不设置。PureScale HADR环境不使用此参数来配置,会被动态更新
  • hadr_remote_inst:  远程主机的实例名
  • hadr_remote_svc:  不设置。PureScale HADR环境不使用此参数来配置,会被动态更新
  • hadr_replay_delay:  这个参数用来设置日志延迟重放的时间。除非特殊需求,一般不设置。
  • hadr_spool_limit: 这个参数用来设置在备机HADR回放跟不上的情况下,日志先写入磁盘的空间大小限制。默认设置为开启,总大小为在线日志定义的大小。
  • hadr_syncmode:  HADR的同步模式。
  • hadr_target_list:  用来定义对应集群的所有成员信息。这个参数是DB2 pureScale集群下HADR配置的主要方式,替代了hadr_remote_host 和hadr_remote_svc 参数。配置格式如下:{主机1:端口|主机2:端口}
  • hadr_timeout: 设置HADR通信超时的时间。

清单 7.配置主数据库

db2 "update db cfg for TESTDB using HADR_TARGET_LIST {purescalebm1:6666|purescalebm2:6667}"
db2_all 'db2 update db cfg for TESTDB member $DB2NODE using hadr_local_host hostname'
db2 update db cfg for TESTDB using HADR_REMOTE_INST db2sdin1
db2 update db cfg for TESTDB member 0 using hadr_local_svc 6666
db2 update db cfg for TESTDB member 1 using hadr_local_svc 6667
db2 update db cfg for TESTDB using HADR_TIMEOUT 60
db2 update db cfg for TESTDB using HADR_SYNCMODE ASYNC
db2 update alternate server for database TESTDB using hostname purescalebm1 port 50000

清单 8.配置备数据库

db2 "update db cfg for TESTDB using HADR_TARGET_LIST {purescaleam1:6666|purescaleam2:6667}"
db2_all 'db2 update db cfg for TESTDB member $DB2NODE using hadr_local_host hostname'
db2 update db cfg for TESTDB using HADR_REMOTE_INST db2sdin1
db2 update db cfg for TESTDB member 0 using hadr_local_svc 6666
db2 update db cfg for TESTDB member 1 using hadr_local_svc 6667
db2 update db cfg for TESTDB using HADR_TIMEOUT 60
db2 update db cfg for TESTDB using HADR_SYNCMODE ASYNC
db2 update alternate server for database TESTDB using hostname purescaleam1 port 50000

至此关于HADR的功能配置就已经完成了。这个里面需要注意的是hadr_local_host和hadr_local_svc需要在对每个成员节点单独设置。不同成员节点的hadr_local_svc要使用不同的端口。这点非常重要!而HADR_TARGET_LIST包含另一个集群的所有成员节点和端口。

配置客户端

在DB2 pureScale HADR集群环境下,为了保证主机角色切换之后,应用服务器能够自动连接到新的主集群,需要对客户端进行配置。配置的方式主要分为两种:ACR和Client Affinity。

首先讨论自动重新路由(ACR)的配置方式:
DB2自动客户端重新路由机制在DB2 pureScale集群中某成员节点发生故障的时候,将连接到该成员节点上所有的应用和工作负载自动的转移到DB2 pureScale集群中其它仍然正常运行的节点上去。该机制是实现数据库高可用性的重要保障。
DB2 pureScale的ACR是默认打开的,无论DB2客户应用连接至DB2 pureScale集群的中的哪一个成员节点,该节点都会将DB2 pureScale集群中所有可用的成员节点列表返回给DB2客户端,而DB2客户端会将该列表缓存在自己的内存中。如果某应用程序当前连接的DB2 pureScale成员节点发生故障时,DB2客户端会自动选择成员节点列表中的其它某个节点重新建立连接。但是在HADR环境,DB2 pureScale的ACR是无法知道备集群的主机信息的,所以需要显式的配置。
非JAVA应用需要通过客户端的一个配置文件db2dsdriver.cfg来设置工作负载均衡和ACR选项,这个配置文件里面包含多个元素。配置中在alternate_server_list里面需要定义所有主备集群的member信息:

清单 9.配置非JAVA应用ACR

<configuration>
  <DSN_Collection>
    <dsn alias="TESTDB" name="TESTDB" host="p0" port="50000" />
  </DSN_Collection>
  <databases>
    <database name="TESTDB" host="p0" port="50000">
        <parameter name="connectionLevelLoadBalancing" value="true" />
        <WLB>
                <parameter name="enableWLB" value="true" />
                <parameter name="maxTransportIdleTime" value="300" />
                <parameter name="maxTransportWaitTime" value="-1" />
                <parameter name="maxTransports" value="-1" />
                <parameter name="maxRefreshInterval" value="30" />               
        </WLB>   
        <ACR>
                <parameter name="enableAcr" value="true"/>
                <parameter name="enableSeamlessAcr" value="true"/>
                <parameter name="maxAcrRetries" value="120"/>
                <parameter name="acrRetryInterval" value="5"/>
                <parameter name="enableAlternateServerListFirstConnect" value="true"/>
                <alternate_server_list>
                    <server name="p1" hostname="p1" port="50000" />
                    <server name="p2" hostname="p2" port="50000" />
                    <server name="p3" hostname="p3" port="50000" />
                    <server name="s0" hostname="s0" port="50000" />
                    <server name="s1" hostname="s1" port="50000" />
                    <server name="s2" hostname="s2" port="50000" />
                    <server name="s3" hostname="s3" port="50000" />
                </alternate_server_list>
        </ACR>
    </database>
  </databases>
  <parameters>
    <parameter name="CommProtocol" value="TCPIP"/>
  </parameters>
</configuration>

如果是JAVA应用,例如使用WAS,weblogic等中间件的数据源配置。以WAS环境下作为案例,配置ACR所使用到的对方一个member主机信息.

图 1.配置JAVA应用ACR
1.png

1.png

除了ACR模式,路由偏好设置(Client Affinity)也是常用的方式。这种情况下数据库客户端或者jdbc驱动会基于路由列表来查找机器,按照优先级访问对应的节点。一般备集群的节点放在路由列表的后面位置。

非JAVA应用需要通过客户端的一个配置文件db2dsdriver.cfg来设置Client Affinity选项,偏好列表里面需要定义好所有主备集群所有member的信息。

清单 10.配置非JAVA应用Client Affinity

<configuration>
  <DSN_Collection>
    <dsn alias="TESTDB" name="TESTDB" host="p0" port="50000" />
  </DSN_Collection>
  <databases>
    <database name="TESTDB" host="p0" port="50000">
        <parameter name="connectionLevelLoadBalancing" value="true" />
        <acr>
            <parameter name="enableAcr" value="true">
            </parameter>
            <parameter name="maxAcrRetries" value="5">
            </parameter>
            <parameter name="acrRetryInterval" value="3">
            </parameter>
            <parameter name="affinityFailbackInterval" value="300">
            </parameter>
            <parameter name="enableAlternateServerListFirstConnect"
              value="true"></parameter>
            <alternateserverlist>
                <alternate_server_list>
                    <server name="p1" hostname="p1" port="50000" />
                    <server name="s0" hostname="s0" port="50000" />
                    <server name="s1" hostname="s1" port="50000" />
                </alternate_server_list>
         </alternateserverlist>          
         <affinitylist>
          <list name="list1" serverorder="p0,p1,s0,s1"> </list>
          <list name="list2" serverorder="p1,p0,s1,s0"> </list>
        </affinitylist>          
        <clientaffinitydefined>                
          <client name="client1" hostname="app1" 
                  listname="list1">
          </client>
          <client name="client2" hostname="app2"
                  listname="list2">
          </client>
        </clientaffinitydefined>
        <clientaffinityroundrobin>
          <client name="client3" hostname="app3">
          </client>
        </clientaffinityroundrobin>
      </acr>        
    </database>
  </databases>
  <parameters>
    <parameter name="CommProtocol" value="TCPIP"/>
  </parameters>
</configuration>

配置JAVA应用Client Affinity
例如在WAS环境下,配置偏好路由的方式是在WAS的数据源里定制属性中配置以下参数.

  • enableClientAffinitiesList 设置是否启用偏好列表。
  • clientRerouteAlternateServerName所有主备集群成员服务器名称,以逗号间隔。
  • clientRerouteAlternatePortNumber 所有主备集群成员服务器端口,以逗号间隔。和clientRerouteAlternateServerName结合起来,相当于定义了前面所说的服务器列表。
  • maxRetriesForClientReroute 自动重路由最大尝试次数。前面WAS里面设置的也就是更改这个参数。
  • retryIntervalForClientReroute 自动重路由时间间隔。
  • affinityFailbackInterval 重新路由回首选成员的时间间隔。

启动HADR

DB2 pureScale集群下的HADR功能启动和单机版HADR的启动逻辑是一样的,也是先启动备集群数据库HADR,然后启动主集群数据库HADR。

清单11.启动备数据库HADR

db2 start hadr on db TESTDB as standby

清单12.启动主数据库HADR

db2 start hadr on db TESTDB as primary

启动成功后,HADR功能会匹配主备集群的配置,完成握手并正常工作。

小结

至此关于在DB2 pureScale集群如何安装配置HADR功能已经展示完毕。在此过程中需要关注HADR相关的几个重要参数。首先是配置pureScale集群的HADR使用的hadr_target_list参数,这和以前单机是不一样的。这里还要注意每个成员的HADR端口一定要不一样,不然在发生HADR角色接管的过程中会冲突。HADR的同步模式有四种,需要根据实际需求,考虑性能,数据一致性等。

安装配置好HADR的下一步就是去监控和管理这个环境。请参考《实战Db2 purescale集群HADR容灾解决方案下 - 监控维护篇》。

参考资源 (resources)

Db2 for Linux UNIX and Windows:获得 DB2 家族产品和特性的描述。
• 参考“IBM DB2 database and SAP software”,了解更多DB2和SAP的相关内容。
• 通过访问 developerWorks 中国 Information Management 专区 的 DB2 purScale 专题获得关于DB2 pureScale集群更多的文章、教程和多媒体课件等学习资源。
• 通过访问 developerWorks 中国 Information Management 专区 的 从 Oracle 迁移到 DB2获得关于“从Oracel迁移到DB2”更多的文章、教程和多媒体课件等学习资源。
IBM DB2 培训和认证:找到获奖的教员、业界领先的软件、动手实验室等。
DB2 for Linux, UNIX, and Windows 最佳实践: 获得DB2应用的最佳实践等文章。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

7

添加新评论2 条评论

#1301664724qq系统工程师, IBM
2018-05-07 20:20
确实不错,谢谢分享!!!
#冯万里数据库架构师, Huawei
2018-05-07 15:49
知识就是用来学习,分享,传播的,见过挺多固步自封的人,怕自己的知识被别人学走的,你是我佩服的前辈!
Ctrl+Enter 发表

本文隶属于专栏

最佳实践
不同的领域,都有先行者,实践者,用他们的最佳实践来加速更多企业的建设项目落地。