DB2 HADR多备机搭建
环境介绍:
本地三个虚拟机,Linux版本: CentOS7:
一个主机: primary, IP: 192.168.232.132
两个备机: 第一备机(principal standby) IP: 192.168.232.136
第二备机(auxiliary standby) IP: 192.168.232.137
DB name: sample
DB2版本: 10.5 fp10
主机名 | IP | Inst service name | inst port | hadr监听服务名 | hadr监听端口号 | 角色 |
hadr_sample_primary | 192.168.232.132 | DB2_db2inst1 | 60000 | hadr1_db2inst1 | 61000 | primary |
hadr_sample_standby1 | 192.168.232.136 | DB2_db2inst1 | 60000 | hadr2_db2inst1 | 61001 | 主备机/首要备机(principal standby) |
hadr_sample_standby2 | 192.168.232.137 | DB2_db2inst1 | 60000 | hadr3_db2inst1 | 61002 | 辅助备机(auxiliary standby) |
搭建步骤:
- root用户配置三个主机的/etc/hosts, 都添加:
192.168.232.132 hadr_sample_primary
192.168.232.136 hadr_sample_standby1
192.168.232.137 hadr_sample_standby2
说明: .如果不像上方这样把对方的IP和主机名加到自己/etc/hosts中,可以直接用IP配置HADR_LOCAL_HOST/HADR_REMOTE_HOST,
但是建议规范化操作。
- 在主机和两个备机上安装DB2软件,并创建实例db2inst1
设置实例服务端口:60000,(在/etc/services中配置如: DB2_db2inst1 60000/tcp)
db2 update dbm cfg using SVCENAME DB2_db2inst1
切记,如果要修改/etc/services中的DB2端口号对应值,比如 DB2_db2inst1 ,一定要在安装实例之前修改,安装之后修改就会无法启动实例(除非更新实例?)
- 设置HADR监听端口:在三台服务器的/etc/services中都添加:
############## hadr ############
hadr1_db2inst1 61000/tcp
hadr2_db2inst1 61001/tcp
hadr3_db2inst1 61002/tcp
注意这里的端口是hadr的监听端口,不能用数据库的监听端口(dbm cfg的SVCNAME值).
同样如果不像上方这样把对方的hadr监听服务也加进来可以用监听端口号直接配置HADR_LOCAL_SVC/HADR_REMOTE_SVC
如果防火墙是开启的,则配置之后需要root在防火墙中放开实例端口号和hadr监听端口号(Linux):
hadr_sample_primary上:
firewall-cmd --zone=public --add-port=60000/tcp --permanent
firewall-cmd --zone=public --add-port=61000/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
hadr_sample_standby1上:
firewall-cmd --zone=public --add-port=60000/tcp --permanent
firewall-cmd --zone=public --add-port=61001/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
hadr_sample_standby2上:
firewall-cmd --zone=public --add-port=60000/tcp --permanent
firewall-cmd --zone=public --add-port=61002/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
4.在主primary端hadr_sample_primary上设置DB2 db cfg参数:
db2 update db cfg for sample using LOGARCHMETH1 disk:/home/db2inst1/db2log/sample
db2 backup db sample #改为归档日志之后需要做下离线备份以使db脱离backup pending状态
db2 UPDATE DB CFG FOR sample USING LOGFILSIZ 4096
db2 UPDATE DB CFG FOR sample USING INDEXREC RESTART
db2 UPDATE DB CFG FOR sample USING LOGINDEXBUILD ON
db2 UPDATE DB CFG FOR sample USING HADR_LOCAL_HOST hadr_sample_primary
db2 UPDATE DB CFG FOR sample USING HADR_LOCAL_SVC hadr1_db2inst1
db2 UPDATE DB CFG FOR sample USING HADR_REMOTE_HOST hadr_sample_standby1
db2 UPDATE DB CFG FOR sample USING HADR_REMOTE_SVC hadr2_db2inst1
db2 UPDATE DB CFG FOR sample USING HADR_REMOTE_INST db2inst1
db2 UPDATE DB CFG FOR sample USING HADR_SYNCMODE NEARSYNC
db2 UPDATE DB CFG FOR sample USING HADR_PEER_WINDOW 300
db2 UPDATE DB CFG FOR sample USING HADR_TIMEOUT 120
db2 “UPDATE DB CFG FOR sample USING HADR_TARGET_LIST hadr_sample_standby1:hadr2_db2inst1|hadr_sample_standby2:hadr3_db2inst1”
#使配置生效:
db2 deactivate db sample
db2 activate db sample
说明:
hadr中primary必须为归档日志,因为 standby也有机会变为primary,所以所有主备db都设置成归档日志。
primary上面的对端(带REMOTE_HOST的几个参数)比如指向第一备机
INDEXREC RESTART: 表示无效的索引在崩溃恢复或显式执行RESTART DATABASE的时候会被重建; 带日志的索引创建在前滚或hadr重放的时候会被重做。(RESTART为默认值)
LOGINDEXBUILD ON :索引创建或重建或reorg的时候是否记日志,这个也要开启,不然无法通过日志同步数据。
Hadr多机备份说明:
多机备份是从10.1开始有的。实现方式: 配置db cfg的参数HADR_TARGET_LIST
参数值的格式为: host1:port1|host2:port2|host3:port3
这里端口号为hadr的监听端口,而不是数据库的端口号
HADR_TARGET_LIST参数说明:
- . 在一带多的hadr中,第一个备机被称为principal standby,后面所有的都成为auxiliary standby
(2). host:port可以直接是IP和端口号值,也可以是配置好的字母(hostname值, SVCNAME值 ), 也可以混合使用。
(3). 第一备机和主机的同步模式可以是所有的四种模式(sync, nearsync, async, super async), 这个模式由主机(primary)上的HADR_SYNCMODE决定。而主机和后面的所有备机(辅助备用库)之间的通信模式始终是超级异步模式(super async),不需要在哪里配置,为强制默认。
(4). 主要数据库和备用数据库必须在自己的 hadr_target_list 参数值中包含彼此; 主要数据库上的远程主机、服务和实例(db cfg的hadr配置参数hadr_remote_host/hadr_remote_svc/hadr_remote_inst)必须指向首要备用数据库。
(因此可以推断standby1可以指向primary也可以只想standby2,但是不管指向谁必须把谁放在HADR_TARGET_LIST第一个。
还是说只要在target list里面就行? -----答案:只需要在target list里 )
(5). 在主要数据库上配置的同步模式和对等窗口仅适用于首要备用数据库与主要数据库之间的连接
(6). 在所有备机上这种host:port的配对的配置表示当这个备机被切换为主机(primary)之后的它的目标机对象。换言之,各个DB上的HADR_TARGET_LIST配置仅当它自己作为prmary的时候有效。 同样,同步模式、adr_peer_window如果两端配置不同,以主机primary为准(备机以切换为primary之后自己的为准)。
(7). 备用数据库上的 hadr_target_list 参数值无需与主要数据库上的 hadr_target_list 参数值匹配,但如果在主要数据库上设置了 hadr_target_list 参数值,它必须也在备用数据库上进行设置。
场景举例:
比如主机prymary的HADR_SYNCMODE 是SYNC,而第一备机(principal standby)的HADR_SYNCMODE是 NEARSYNC,则他俩之间通许方式为SYNC, 当第一备机切换为主机之后以NEARYSYNC为准。
5. 生成备机端数据库:
全量在线备份Primay database数据库sample,并拷贝备份文件到两个standby上。
db2 backup db sample online
scp SAMPLE.0.db2inst1.DBPART000.20200504133128.001 db2inst1@hadr_sample_standby1:/home/db2inst1
scp SAMPLE.0.db2inst1.DBPART000.20200504133128.001 db2inst1@hadr_sample_standby2:/home/db2inst1
在两个备机上恢复数据到:
db2 restore db sample from . taken at 20200504133128
恢复之后处于rollforward pending状态,之后注意不需要执行前滚操作,HADR在启动之后会自动从primary追日志。等主备切换之后备机就可以连db了。
6.在第一备机(首要备机)hadr_sample_standby1端设置DB2 db cfg参数:
#db2 update db cfg FOR sample using LOGARCHMETH1 disk:/home/db2inst1/db2log/sample 不需要,因为是恢复过来的,和source一致
#db2 UPDATE DB CFG FOR sample USING LOGFILSIZ 4096 不需要,因为是恢复过来的,和source一致
#db2 UPDATE DB CFG FOR sample USING INDEXREC RESTART 不需要,因为是恢复过来的,和source一致
#db2 UPDATE DB CFG FOR sample USING LOGINDEXBUILD ON 不需要,因为是恢复过来的,和source一致
db2 UPDATE DB CFG FOR sample USING HADR_LOCAL_HOST hadr_sample_standby1
db2 UPDATE DB CFG FOR sample USING HADR_LOCAL_SVC hadr2_db2inst1
db2 UPDATE DB CFG FOR sample USING HADR_REMOTE_HOST hadr_sample_primary
db2 UPDATE DB CFG FOR sample USING HADR_REMOTE_SVC hadr1_db2inst1
db2 UPDATE DB CFG FOR sample USING HADR_REMOTE_INST db2inst1
db2 UPDATE DB CFG FOR sample USING HADR_SYNCMODE ASYNC
db2 UPDATE DB CFG FOR sample USING HADR_PEER_WINDOW 300
db2 UPDATE DB CFG FOR sample USING HADR_TIMEOUT 120
db2 “UPDATE DB CFG FOR sample USING HADR_TARGET_LIST hadr_sample_primary:hadr1_db2inst1|hadr_sample_standby2:hadr3_db2inst1”
db2set DB2_HADR_ROS=ON
db2set DB2_STANDBY_ISO=UR
说明:
因为在primary上先配置的hadr相关参数后做的备份恢复,所有之前配置的参数会被恢复到standby上,注意要修改彻底。(当然也可以先在primary上修改参数再备份恢复)
注意第一备机(standby1)的hadr指向了primary,而HADR_TARGET_LIST 不必须把primary放第一位,放后面也行,只要在list里即可。
如果放第一位,当standby1切换为primary了之后,它就会把原来的primary当成第一主备(principal standby),放第二位则当第二备机。
这里第一备机的同步模式HADR_SYNCMODE AYNC和HADR_PEER_WINDOW 300仅适用于它成为primary之后,所以不必和对端一样,以当前实时的primary的设置为准。
如果使备库可读,需要设置db2set的以下两个参数:
DB2_HADR_ROS标明在备库可读,一般不开启。有时候设置读写分离需要读备库的时候才需要设置。
DB2_STANDBY_ISO设置备库隔离级别(UR), 如果用了高于UR的隔离级别将强制转化为UR并且没有警告;当standby接管称为primary之后该参数会失效。
这两个db2set参数是配对使用的。
7.在第二备机(辅助备机)hadr_sample_standby2端设置DB2 db cfg参数:
#db2 update db cfg FOR sample using LOGARCHMETH1 disk:/home/db2inst1/db2log/sample 不需要,因为是恢复过来的,和source一致
#db2 UPDATE DB CFG FOR sample USING LOGFILSIZ 4096 不需要,因为是恢复过来的,和source一致
#db2 UPDATE DB CFG FOR sample USING INDEXREC RESTART 不需要,因为是恢复过来的,和source一致
#db2 UPDATE DB CFG FOR sample USING LOGINDEXBUILD ON 不需要,因为是恢复过来的,和source一致
db2 UPDATE DB CFG FOR sample USING HADR_LOCAL_HOST hadr_sample_standby2
db2 UPDATE DB CFG FOR sample USING HADR_LOCAL_SVC hadr3_db2inst1
db2 UPDATE DB CFG FOR sample USING HADR_REMOTE_HOST hadr_sample_standby1
db2 UPDATE DB CFG FOR sample USING HADR_REMOTE_SVC hadr2_db2inst1
db2 UPDATE DB CFG FOR sample USING HADR_REMOTE_INST db2inst1
db2 UPDATE DB CFG FOR sample USING HADR_SYNCMODE SUPERASYNC
db2 UPDATE DB CFG FOR sample USING HADR_PEER_WINDOW 300
db2 UPDATE DB CFG FOR sample USING HADR_TIMEOUT 120
db2 UPDATE DB CFG FOR sample USING HADR_TARGET_LIST hadr_sample_primary:hadr1_db2inst1|hadr_sample_standby1:hadr2_db2inst1
db2set DB2_HADR_ROS=ON
db2set DB2_STANDBY_ISO=UR
这里辅助备机(hadr_sample_standby2)设置了和首要备机(hadr_sample_standby1)之间的hadr,那么首要备机要不要放到target的第一位?--不一定
这里SUPERASYNC表示它接管成为primary之后和其他db的同步方式。HADR_PEER_WINDOW同样也是成为primary之后对等窗口为300
疑问: 这里hadr相关参数(带REMOTE的几个参数)指向了hadr_sample_standby1,而没有指向hadr_sample_primary,那数据能同步到hadr_sample_primary吗? -------答案是可以
- 配置自动客户端重新路由(Automatic Client Reroute, ACR):
配置自动客户端重新路由之后,如果当前db作为primary的时候出现故障,则会自动切换到指定的db上,目前使用不到,大部分还是用手工takeover的。
在主数据库服务器上如果出现故障,自动切换到hadr_sample_standby1上:
db2 UPDATE ALTERNATE SERVER FOR DATABASE sample USING HOSTNAME hadr_sample_standby1 PORT hadr2_db2inst1
在备用数据库hadr_sample_standby1上如果出现故障,自动路由到hadr_sample_standby2:
db2 UPDATE ALTERNATE SERVER FOR DATABASE sample USING HOSTNAME hadr_sample_standby2 PORT hadr3_db2inst1
注意,这里IP和port都是对方数据库的。
这里没有设置。
- 启动HADR:
首先在两台备机上启动备用数据库服务器的HADR:
db2 start hadr on db sample as standby
然后启动主数据库服务器的HADR:
db2 start hadr on db sample as primary
注意:如果你先启动主数据库服务器HADR,那么你必须保证在HADR_TIMEOUT参数指定的时间内(单位为秒)启动备用数据库服务器HADR, 否则将启动失败。
在以前的版本中,一个数据库必须先DEACTIVATE再ACTIVATE,才能应用更新的 HADR 配置参数。从 Version 10.1 开始,半动态 HADR 配置参数适用于 HADR 激活时,无论是通过数据库激活(activate db)还是 START HADR 命令激活都可以生效。(hadr参数除hadr_target_list 是全动态的,其余都是半动态的)
STOP HADR 和 START HADR 命令不能在备用数据库上动态执行,所以仍然需要数据库DEACTIVATE再ACTIVATE才能在备用数据库上应用 HADR 配置更改。
- 查看状态/测试:
查看hadr的状态: db2pd -db testdb -hadr
注意在每个db上查看这个状态为当前同步状态,而非当前db接管成为primary之后的状态。
测试, 在主机端:
[db2inst1@192 ~]$ db2 "create table TEST.PRIMARY_TAB(ID INT)"
DB20000I The SQL command completed successfully.
[db2inst1@192 ~]$ db2 "insert into TEST.PRIMARY_TAB values(1),(2)"
DB20000I The SQL command completed successfully.
注意,此时备机端是无法连数据库的:
[db2inst1@192 ~]$ db2 connect to testdb
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".
需要等到主备切换之后才能连db,去验证表是否在 备机端也存在。
- HADR的停止:
先停Primary 端:
db2 stop hadr on db sample ##可以不用deactivate db
再停Standby 端:
db2 deactivate db sample --两个standby都做(10.5也需要做)
db2 stop hadr on db sample
注意这里standby端在停止hadr的时候还是需要deactivate db的,primary端不需要。 而在start hadr的时候都不需要activate db, 因为DB210.1之后的版本start会隐试的激活数据库。
- 主备切换, 并测试:
在第一备机hadr_sample_standby1端执行切换:
根据以上的配置,预想一下,如果做了切换之后的状态:
- . 切换到第一备机(首要备机)hadr_sample_standby1之后,它和hadr_sample_primary之间的同步模式是什么? --ASYNC
和原来的第二备机hadr_sample_standby2的同步模式是什么? --SUPERASYNC,只要是辅助备机都是SUPERASYNC
2). 之前在primary新建的表insert的数据,在这里会不会出现? --会
在第一备机hadr_sample_standby1端执行切换: db2 takeover hadr on db sample
主备切换之后检查备机的那个表:
[db2inst1@hadr_sample_standby1 ~]$ db2 takeover hadr on db sample
DB20000I The TAKEOVER HADR ON DATABASE command completed successfully.
[db2inst1@hadr_sample_standby1 ~]$ db2 connect to sample
Database Connection Information
Database server = DB2/LINUXX8664 10.5.10
SQL authorization ID = DB2INST1
Local database alias = SAMPLE
[db2inst1@hadr_sample_standby1 ~]$ db2 "select * from TEST.PRIMARY_TAB"
ID
-----------
1
2
2 record(s) selected.
继续测试:
在hadr_sample_standby1上新建表:
[db2inst1@hadr_sample_standby1 ~]$ db2 "create table TEST.PRIMARY_TAB2(ID INT)"
DB20000I The SQL command completed successfully.
[db2inst1@hadr_sample_standby1 ~]$ db2 "insert into TEST.PRIMARY_TAB2 values(1),(2)"
DB20000I The SQL command completed successfully.
[db2inst1@hadr_sample_standby1 ~]$
然后切换到hadr_sample_standby2,再去看这个表和数据是否存在:
[db2inst1@hadr_sample_standby2 ~]$ db2 takeover hadr on db sample
DB20000I The TAKEOVER HADR ON DATABASE command completed successfully.
[db2inst1@hadr_sample_standby2 ~]$ db2 connect to sample
Database Connection Information
Database server = DB2/LINUXX8664 10.5.10
SQL authorization ID = DB2INST1
Local database alias = SAMPLE
[db2inst1@hadr_sample_standby2 ~]$ db2 "select * from TEST.PRIMARY_TAB"
ID
-----------
1
2
2 record(s) selected.
[db2inst1@hadr_sample_standby2 ~]$ db2 "select * from TEST.PRIMARY_TAB2"
ID
-----------
1
2
2 record(s) selected.
测试结果:
和primary的同步模式---SUPERASYNC
和standby1的同步模式---SUPERASYNC
db2pd -d sample -hadr的监控结果(STANDBY_ID值)显示primary为第一备机,Standby1为第二备机,和 HADR_TARGET_LIST的顺序一致。
强制切换:
TAKEOVER HADR ON DB dbname BY FORCE
primary故障时,可以将standby DB的Role向primary进行强制切换
primary DB侧没有发生任何处理 (尽管为primary的状态仍实施切换)
注意:
一定要在primary为down的状态下执行
双方的DB的Roll作为primary起动,存在接受不同的更新处理的危险性
实施强制切换时,如果有未向STANDBY转送的log存在,此Transaction为lost
有必要进行HADR通信状态的监视
可以将HADR_TIMEOUT调整,使更新为WAIT状态
= 其他
============监控HADR状态:
两种方法:
方法1. db2 get snapshot for database on testdb|grep -A 16 'HADR Status' #Linux版本
db2 get snapshot for database on testdb|grep -ip 'HADR Status' #AIX版本
方法2. db2pd -db sample -hadr
============HADR的四种同步模式:
The database configuration parameter hadr_syncmode can be set to one of the following values:
• SYNC: Transactions on the primary database commit only after relevant logs are written to disk on both the primary and the standby
• NEARSYNC: Transactions on the primary database commit only after the relevant logs are written to disk on the primary database and received into memory on the standby database (较常用,推荐)
• ASYNC: Transactions on the primary database commit only after the relevant logs are written to local disk and sent to standby
• SUPERASYNC: Transactions on the primary database commit as soon as the relevant logs are written to local disk
HADR的限制:
为了获取高可用性灾难恢复 (HADR) 的最佳性能,请在设计高可用性 DB2® 数据库解决方案时考虑 HADR 的限制:
• 在分区数据库环境中,不支持 HADR。
• 主数据库和备用数据库的操作系统版本和 DB2 数据库系统版本都必须相同。
• 主数据库和备用数据库的 DB2 数据库系统软件的位大小必须相同(32 位或 64 位)
• 日志文件只能由主数据库进行归档。
• 只能对当前主数据库运行自调整内存管理器 (STMM)。
• 在备用数据库上不支持备份操作。
• 未进行日志记录的操作(例如对数据库配置参数和恢复历史记录文件所作的更改)不会被复制到备用数据库。
• 不支持指定了 COPY NO 选项的装入操作。
• HADR 不支持无限日志记录。
• HADR 主数据库的系统时钟必须与 HDAR 备用数据库的系统时钟同步。
在备用数据库上读取的限制
除了只读限制之外,此功能还存在应了解的下列限制 :
· 在重放 DDL 日志记录或维护操作期间(仅重放时间),用户连接无法访问备用数据库。有关更多信息,请参阅活动备用数据库上的仅重放时间。
· 在备用数据库上只支持未落实的读(UR)隔离级别。请求更高隔离级别的应用程序、语句或子语句将收到错误(SQL1773N 原因码 1)。有关更多信息,请参阅活动备用数据库上的隔离级别。
· 不会将实例级别审计配置复制到备用数据库。必须使用 db2audit 工具确保实例级别审计设置在主数据库和备用数据库上是相同的。
· 在备用数据库上不支持已声明临时表 (DGTT)。在备用数据库上尝试创建或访问它们将收到错误(SQL1773N 原因码 4)。
· 要成功查询 XML 和大对象 (LOB) 数据,这些数据必须是直接插入的,否则会返回错误(SQL1773N 原因码 3)。
· 在备用数据库上不支持说明工具(db2exfmt、db2expln 和 Visual Explain)和 db2batch 工具(SQL1773N 原因码 5)。如果要分析只读工作负载的性能,那么首先应在主数据库上运行这些工具,在主数据库上对工作负载进行必要的优化,然后将优化后的工作负载移至备用数据库。
· 在备用数据库上不支持创建和改变序列。同样,不能使用 NEXT VALUE 表达式来生成序列中的下一个值。
· 不能将备用数据库配置为 Federation Server。
---------------------
参考文章:
http://www.ithov.com/server/119236_3.shtml
https://www.talkwithtrend.com/Article/188595