1.                   DB2 HADR高可用概述

   High Availability Disaster Recovery (HADR)是数据库级别的高可用性数据复制机制。一个HADR环境需要两台数据库服务器:主数据库服务器(primary)和备用数据库服务器(standby)。当主数据库中发生事务操作时,会同时将日志文件通过TCP/IP协议传送到备用数据库服务器,然后备用数据库对接受到的日志文件进行重放(Replay),从而保持与主数据库的一致性。当主数据库发生故障时,备用数据库服务器可以接管主数据库服务器的事务处理。此时,备用数据库服务器作为新的主数据库服务器进行数据库的读写操作,而客户端应用程序的数据库连接可以通过自动客户端重新路由(Automatic Client Reroute)机制转移到新的主服务器。当原来的主数据库服务器被修复后,又可以作为新的备用数据库服务器加入HADR。通过这种机制,DB2 UDB实现了数据库的灾难恢复和高可用性,最大限度的避免了数据丢失。

下图为DB2 HADR的工作原理图:

1.png

2.                   高可用之间切换

正常情况下,HADR通过日志自动同步:

 2.png

             

当主库异常时,备库进行接管后,应用连接65.33时,自动连接到65.34

3.png

3.                   环境信息

本期采用2台虚拟服务。

主机

IP地址

配置

备注

cluster1

192.31.65.21

4C16G

HADR集群

cluster2

192.31.65.22

4C16G

4.                   集群环境部署

根据原环境,进行部署。主要增加集群配置。详细如下:

1、安装系统包

yum install openssh-clients
yum install redhat-lsb
yum install ksh
yum install libaio
rpm -ivh compat-libstdc++-33-3.2.3-69.el6.x86_64.rpm  
yum install compat-libstdc++-33-3.2.3-69.el6.i686.rpm  
2、创建组和用户
groupadd -g 101 dasadm1
groupadd -g 102 db2iadm1
groupadd -g 103 db2fadm1
useradd -m -u 500 -d /home/dasusr1 -g dasadm1 dasusr1 -p db2admin
useradd -m -u 501 -d /home/db2admin -g db2iadm1 db2admin -p db2admin
useradd -m -u 502 -d /home/db2fenc1 -g db2fadm1 db2fenc1 -p db2admin
3、修改网络
vi /etc/hosts
192.31.65.21 cluster1
192.31.65.22 cluster2
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=cluster1
4、安装数据库软件
./db2_install -b /opt/ibm/db2/v9.5/ -p ESE
5、安装实例
/opt/ibm/db2/v9.5/instance/db2icrt -s ESE -a server -u db2fenc1 db2admin
6、环境变量配置
db2set DB2_EXTENDED_OPTIMIZATION=ON
db2set DB2_DISABLE_FLUSH_LOG=ON
db2set AUTOSTART=YES
db2set DB2_STRIPED_CONTAINERS=ON
db2set DB2_HASH_JOIN=Y
db2set DB2COMM=tcpip
db2set DB2_PARALLEL_IO=*
db2set DB2CODEPAGE=1386
------------------------如下是HADR配置------------------------
1、环境变量修改
#指定HADR BUF大小,通常HADR BUF是 LOG BUF的4倍。
db2set DB2_HADR_BUF_SIZE=16384                          
db2set DB2_LOAD_COPY_NO_OVERRIDE=NONRECOVERABLE                                                                                                                                                                                                                                                                             
db2set DB2_HADR_PEER_WAIT_LIMIT=10  
db2set DB2COMM=tcpip
db2set DB2RSHCMD=/usr/bin/ssh  
 
2、参数修改
db2 "UPDATE DB CFG FOR sample USING LOGINDEXBUILD ON"          #开启此功能,在索引的创建、重建和重组记录完整的信息,可能需要更多时间和更多的日志空间。会将索引传递到备库进行创建。如果不开启,当备库接管时,索引将被置为无效。
db2 "UPDATE DB CFG FOR sample USING INDEXREC RESTART"          #完成接管操作之后,重建无效索引。              
修改实例参数:
db2 update dbm cfg using SVCENAME 50001
3、备份数据库:
db2 "backup db sample online to /home/db2admin"
4、将备份数据传送到备节点。
5、恢复数据库
db2 "RESTORE DATABASE sample FROM "/home/db2admin" TAKEN AT 20170511172554 REPLACE HISTORY FILE WITHOUT PROMPTING"
 
[db2admin@cluster2 ~]$ db2 "RESTORE DATABASE sample FROM "/home/db2admin" TAKEN AT 20170511172554 REPLACE HISTORY FILE WITHOUT PROMPTING"
DB20000I  The RESTORE DATABASE command completed successfully.

或者直接覆盖现有数据库:

db2 "RESTORE DATABASE sample FROM "/home/db2admin" TAKEN AT 20170511172554 REPLACE EXISTING WITHOUT PROMPTING"

6、配置客户端自动路由。

在主数据库服务器(cluster21)上:
db2 "UPDATE ALTERNATE SERVER FOR DATABASE sample USING HOSTNAME 192.31.65.22 PORT 50001"   #配置备用数据库。
在备用数据库服务器上(cluster2):
db2 "UPDATE ALTERNATE SERVER FOR DATABASE sample USING HOSTNAME 192.31.65.21 PORT 50001"   #配置备用数据库。
7、配置HADR服务和侦听端口
用vi编辑/etc/services文件(需要切换到root用户),加入下面两行:
DB2_HADR_1      55001/tcp
DB2_HADR_2      55002/tcp
注:这一步不是必须的,因为在下面配置HADR_LOCAL_SVC和HADR_REMOTE_SVC数据库参数的时候可以直接使用端口号来替代服务名。
8、修改HADR相关参数参数
--修改主用数据库
db2 "UPDATE DB CFG FOR sample USING HADR_LOCAL_HOST cluster1  "
db2 "UPDATE DB CFG FOR sample USING HADR_LOCAL_SVC DB2_HADR_1       "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_HOST cluster2 "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_SVC DB2_HADR_2      "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_INST db2admin       "
db2 "UPDATE DB CFG FOR sample USING HADR_SYNCMODE NEARSYNC "        
db2 "UPDATE DB CFG FOR sample USING HADR_TIMEOUT 120"
db2 "CONNECT TO sample"
db2 "QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS "
db2 "UNQUIESCE DATABASE sample"
db2 "CONNECT RESET"
#SYNC:同步,写入备用数据库上的日志文件时,方才认为日志写入是成功的;NEARSYNC:接近同步,在此方式中,仅当日志记录已写入主数据库上的日志文件,而且主数据库已接收到来自备用系统的应答;ASYNC:异步,日志传递给主系统主机的 TCP 层时,不等待备库相应,就认为成功;SUPERASYNC,超异步,写入主库日志,即认为成功。
 
--修改备用数据库
db2 "UPDATE DB CFG FOR sample USING HADR_LOCAL_HOST cluster2  "
db2 "UPDATE DB CFG FOR sample USING HADR_LOCAL_SVC DB2_HADR_2       "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_HOST cluster1 "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_SVC DB2_HADR_1      "
db2 "UPDATE DB CFG FOR sample USING HADR_REMOTE_INST db2admin       "
db2 "UPDATE DB CFG FOR sample USING HADR_SYNCMODE NEARSYNC          "
db2 "UPDATE DB CFG FOR sample USING HADR_TIMEOUT 120                "
9、启用HADR。
--首先启用备用数据库关系:
db2 "DEACTIVATE DATABASE sample"
db2 "START HADR ON DATABASE sample AS STANDBY"
--然后启用主库HADR状态:
db2 "DEACTIVATE DATABASE sample"
db2 "START HADR ON DATABASE sample AS PRIMARY"
#需要关闭防火墙,否则报错:“SQL1768N  Unable to start HADR. Reason code = "7".”
[db2inst1@sg1 ~]$ db2 "start hadr on database sample as primary
"
DB20000I  The START HADR ON DATABASE command completed successfully.
10、查看HADR状态:
#查看状态为 peer:
[db2inst1@sg1 ~]$ db2pd -d sample -hadr
Database Partition 0 -- Database sample -- Active -- Up 0 days 00:01:43 -- Date 2017-05-02-19.23.09.352187
HADR Information:
Role    State                SyncMode HeartBeatsMissed   LogGapRunAvg (bytes)
Primary Peer                 Nearsync 0                  0                   
ConnectStatus ConnectTime                           Timeout   
Connected     Tue May  2 19:21:27 2017 (1493724087) 120       
LocalHost                                LocalService      
sg1                                      DB2_HADR_1        
RemoteHost                               RemoteService      RemoteInstance    
sg2                                      DB2_HADR_2         db2inst1          
PrimaryFile  PrimaryPg  PrimaryLSN        
S0000005.LOG 0          0x0000000002EE0000
StandByFile  StandByPg  StandByLSN        
S0000005.LOG 0          0x0000000002EE0000
 
 
 
-------------------------------
--在客户端,尝试连接
#
--编目节点
db2 catalog tcpip node cluster1 remote 192.31.65.21 server 50001
--编目数据库
db2 "catalog db sample at node cluster1"