签到成功

知道了

CNDBA社区CNDBA社区

DB2 Primary、nearsync、supersync三种模式安装

2021-10-01 22:53 1268 0 原创 DB2
作者: hbhe0316

本文参考了IBMdeveloperworks
https://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1206xuj2/
同步模式(SYNC)

在同步模式下,当用户在主数据库上提交一个事务时,首先该事务的相关数据库日志会被写到主数据库的本地磁盘上,然后主数据库会将日志发送给备机数据库,并且等待备机数据库的回复;备机数据库在接收到日志,并将其写到自己的磁盘上后,才回复给主数据库。主数据库在接到备机数据库的回复之后,才返回给用户该事务提交成功。由此可见,在该同步模式下,凡是提交成功的事务,日志不仅在主数据库的磁盘上,也在备机数据库的磁盘上,此时如果主数据库发生故障,已提交的数据不会丢失。因此,在同步模式下,HADR 能够提供无数据丢失保证(No data loss guarantee)。但是,在该同步模式下,HADR 对主数据库业务的影响也是显而易见的。

近同步模式(NEARSYNC)

与同步模式相比,近同步模式下的备机数据库接收到主数据库发来的日志时,并不等待将其写到本地磁盘之后才回复给主数据库,而是立即回复给主数据库。主数据库在接收到备机数据库的回复之后就返回给用户事务提交成功,而此时,该事务的日志可能还在备机数据库的内存中,并未写到本地盘上。如果此时主机发生故障,并不能保证在原主数据库上已提交的数据在备机上必然能找回。虽然该同步模式不能保证零数据丢失,但是相比同步模式,近同步模式下的 HADR 对于主数据库业务的影响较小。

异步模式(ASYNC)

在异步模式下,主数据库发送日志成功后就返回给用户,事务提交成功,而此时,备机数据库有可能还没有收到这些日志。如果此时主数据库发生故障,该已提交事务的数据更改就会丢失。同样的,由于异步模式下的主数据库在返回给用户事务提交成功之前不等待备机数据库的回复,HADR 对主数据库上业务的影响比近同步模式更小。

http://www.cndba.cn/hbhe0316/article/4819

超级异步模式(SUPERASYNC)

从 DB2 LUW V9.7.5 和 V9.5.8 开始,HADR 引入了一种新的同步模式,即超同步模式。在该同步模式下,主数据库上数据库日志的产生与发送完全分离,二者没有任何依赖,这样 HADR 对于主数据库业务的影响降到了最低;同时,由于日志的产生与发送分离,可能导致主数据库和备机数据库之间的差距较大,此时如果主机发生故障,会有较多的数据丢失;并且非强制接管(non-force TAKEOVER)可能需要更多时间

模式 有无数据丢失风险 影响主数据库性能级别
SYNC 无 大
NEARSYNC(default) 有(不保证零数据丢失) 小
ASYNC 有 较小
SUPERASYNC 有 极小

1.系统环境准备,db01作为primary节点,db02作为nearsync节点,db03作为supersync节点。

http://www.cndba.cn/hbhe0316/article/4819

[root@db01 ~]# cat /etc/hosts
192.168.2.123 db01
192.168.2.163 db02
192.168.2.113 db03

2.在主库创建库

[db2inst1@db01 ~]$ cd /db2data
[db2inst1@db01 db2data]$ mkdir archivelog
[db2inst1@db01 db2data]$ db2 update db cfg for testdb using LOGARCHMETH1 "DISK:/db2data/archivelog"
[db2inst1@db01 db2data]$ db2stop
[db2inst1@db01 db2data]$ db2start
[db2inst1@db01 db2data]$ db2 backup db testdb to /dev/null


db2 "CREATE DB testdb on /db2data/testdb using codeset UTF-8 territory us PAGESIZE 8192"
db2 "UPDATE DB CFG FOR testdb USING applheapsz 4096"
db2 "UPDATE DB CFG FOR testdb USING app_ctl_heap_sz 1024"
db2 "UPDATE DB CFG FOR testdb USING stmtheap 32768"
db2 "UPDATE DB CFG FOR testdb USING dbheap 2400"
db2 "UPDATE DB CFG FOR testdb USING locklist 1000"
db2 "UPDATE DB CFG FOR testdb USING logfilsiz 4000"
db2 "UPDATE DB CFG FOR testdb USING logprimary 12"
db2 "UPDATE DB CFG FOR testdb USING logsecond 20"
db2 "UPDATE DB CFG FOR testdb USING logbufsz 32"
db2 "UPDATE DB CFG FOR testdb USING avg_appls 5"
db2 "UPDATE DB CFG FOR testdb USING locktimeout 30"
db2 "UPDATE DB CFG FOR testdb using AUTO_MAINT off"

更新HADR信息http://www.cndba.cn/hbhe0316/article/4819

http://www.cndba.cn/hbhe0316/article/4819
http://www.cndba.cn/hbhe0316/article/4819

db2 "UPDATE DB CFG FOR TESTDB USING LOGINDEXBUILD  ON  LOGARCHMETH1 logretain"
db2 "update db cfg for testdb using trackmod on"
db2 "update db cfg for testdb using indexrec restart"
db2 "update db cfg for testdb using HADR_LOCAL_HOST db01"
db2 "update db cfg for testdb using HADR_LOCAL_SVC 54321"
db2 "update db cfg for testdb using HADR_REMOTE_HOST db02"
db2 "update db cfg for testdb using HADR_REMOTE_SVC 54321"
db2 "update db cfg for testdb using HADR_REMOTE_INST db2inst1"
db2 "update db cfg for testdb using HADR_TIMEOUT 120"
db2 "update db cfg for testdb using HADR_PEER_WINDOW 10"
db2 "update db cfg for testdb using HADR_SYNCMODE sync"
db2 "UPDATE DB CFG FOR TESTDB USING HADR_TARGET_LIST  db02:54321|db03:54321"

3.备份主库http://www.cndba.cn/hbhe0316/article/4819

db2 backup db testdb to /db2data/backup/

4.传输至备机

cd /db2data/backup
scp TESTDB.0.db2inst1.DBPART000.20190811162133.001 db02:/db2data/backup/
scp TESTDB.0.db2inst1.DBPART000.20190811162133.001 db03:/db2data/backup/

4.在备机恢复

http://www.cndba.cn/hbhe0316/article/4819

db2 restore db testdb from /db2data/backup/

5.在节点2执行命令

http://www.cndba.cn/hbhe0316/article/4819

db2 update db cfg for testdb using HADR_LOCAL_HOST db02
db2 update db cfg for testdb using HADR_REMOTE_HOST db01
db2 "update db cfg for testdb using HADR_SYNCMODE NEARSYNC"
db2 "update db cfg for testdb using HADR_TARGET_LIST db01:54321|db03:54321"

6.在节点3执行命令

db2 "update db cfg for testdb using HADR_LOCAL_HOST db03"
db2 "update db cfg for testdb using HADR_REMOTE_HOST db01"
db2 "update db cfg for testdb using HADR_SYNCMODE SUPERASYNC"
db2 "update db cfg for testdb using HADR_TARGET_LIST db01:54321|db02:54321"

7.在节点2和节点3执行命令

db2 "start hadr on db testdb as standby"

8.在节点1执行命令

db2 "start hadr on db testdb as primary"

9.在节点1执行命令

http://www.cndba.cn/hbhe0316/article/4819
http://www.cndba.cn/hbhe0316/article/4819

[db2inst1@db01 backup]$ db2pd -db testdb -hadr

Database Member 0 -- Database TESTDB -- Active -- Up 0 days 00:00:45 -- Date 2019-09-12 18:44:51

                            HADR_ROLE = PRIMARY
                          REPLAY_TYPE = PHYSICAL
                        HADR_SYNCMODE = SYNC
                           STANDBY_ID = 1
                        LOG_STREAM_ID = 0
                           HADR_STATE = PEER
                  PRIMARY_MEMBER_HOST = db01
                     PRIMARY_INSTANCE = db2inst1
                       PRIMARY_MEMBER = 0
                  STANDBY_MEMBER_HOST = db02
                     STANDBY_INSTANCE = db2inst1
                       STANDBY_MEMBER = 0
                  HADR_CONNECT_STATUS = CONNECTED
             HADR_CONNECT_STATUS_TIME = 2019-09-12 18:44:07.534501 (1568285047)
          HEARTBEAT_INTERVAL(seconds) = 2
                HADR_TIMEOUT(seconds) = 120
        TIME_SINCE_LAST_RECV(seconds) = 15
             PEER_WAIT_LIMIT(seconds) = 0
           LOG_HADR_WAIT_CUR(seconds) = 0.000
    LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.000000
   LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.000
                  LOG_HADR_WAIT_COUNT = 0
SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 19800
SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 87380
            PRIMARY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
            STANDBY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
                  HADR_LOG_GAP(bytes) = 0
     STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
       STANDBY_RECV_REPLAY_GAP(bytes) = 4072254
                     PRIMARY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
                     STANDBY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
              STANDBY_REPLAY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
         STANDBY_RECV_BUF_SIZE(pages) = 64
             STANDBY_RECV_BUF_PERCENT = 0
           STANDBY_SPOOL_LIMIT(pages) = 0
                 PEER_WINDOW(seconds) = 10
                      PEER_WINDOW_END = 2019-09-12 18:45:01.000000 (1568285101)
             READS_ON_STANDBY_ENABLED = N

                            HADR_ROLE = PRIMARY
                          REPLAY_TYPE = PHYSICAL
                        HADR_SYNCMODE = SUPERASYNC
                           STANDBY_ID = 2
                        LOG_STREAM_ID = 0
                           HADR_STATE = REMOTE_CATCHUP
                  PRIMARY_MEMBER_HOST = db01
                     PRIMARY_INSTANCE = db2inst1
                       PRIMARY_MEMBER = 0
                  STANDBY_MEMBER_HOST = db03
                     STANDBY_INSTANCE = db2inst1
                       STANDBY_MEMBER = 0
                  HADR_CONNECT_STATUS = CONNECTED
             HADR_CONNECT_STATUS_TIME = 2019-09-12 18:44:08.260206 (1568285048)
          HEARTBEAT_INTERVAL(seconds) = 30
                HADR_TIMEOUT(seconds) = 120
        TIME_SINCE_LAST_RECV(seconds) = 13
             PEER_WAIT_LIMIT(seconds) = 0
           LOG_HADR_WAIT_CUR(seconds) = 0.000
    LOG_HADR_WAIT_RECENT_AVG(seconds) = 0.000000
   LOG_HADR_WAIT_ACCUMULATED(seconds) = 0.000
                  LOG_HADR_WAIT_COUNT = 0
SOCK_SEND_BUF_REQUESTED,ACTUAL(bytes) = 0, 19800
SOCK_RECV_BUF_REQUESTED,ACTUAL(bytes) = 0, 87380
            PRIMARY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
            STANDBY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
                  HADR_LOG_GAP(bytes) = 0
     STANDBY_REPLAY_LOG_FILE,PAGE,POS = S0000000.LOG, 0, 40760001
       STANDBY_RECV_REPLAY_GAP(bytes) = 4072254
                     PRIMARY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
                     STANDBY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
              STANDBY_REPLAY_LOG_TIME = 2019-09-10 19:04:49.000000 (1568113489)
         STANDBY_RECV_BUF_SIZE(pages) = 64
             STANDBY_RECV_BUF_PERCENT = 0
           STANDBY_SPOOL_LIMIT(pages) = 0
                 PEER_WINDOW(seconds) = 0
             READS_ON_STANDBY_ENABLED = N


[db2inst1@db01 backup]$ db2 connect to testdb

   Database Connection Information

 Database server        = DB2/LINUXX8664 10.1.0
 SQL authorization ID   = DB2INST1
 Local database alias   = TESTDB

[db2inst1@db01 backup]$ db2 "select HADR_ROLE, STANDBY_ID, HADR_STATE, 
           varchar(PRIMARY_MEMBER_HOST,20) as PRIMARY_HOST, 
           varchar(STANDBY_MEMBER_HOST,20) as STANDBY_HOST 
    from table (mon_get_hadr(NULL))"

HADR_ROLE     STANDBY_ID HADR_STATE              PRIMARY_HOST         STANDBY_HOST        
------------- ---------- ----------------------- -------------------- --------------------
PRIMARY                1 PEER                    db01                 db02                
PRIMARY                2 REMOTE_CATCHUP          db01                 db03                

  2 record(s) selected.

将db04加入到HADR

db2 "update db cfg for testdb using HADR_LOCAL_HOST db04"
db2 "update db cfg for testdb using HADR_REMOTE_HOST db01"
db2 "update db cfg for testdb using HADR_SYNCMODE SUPERASYNC"
db2 "update db cfg for testdb using HADR_TARGET_LIST db02:54321|db03:54321|db01:54321"
db2 "START HADR ON DB TESTDB AS STANDBY"
db2 "activate db testdb"

在db01执行

db2 "update db cfg for testdb using HADR_TARGET_LIST db02:54321|db03:54321|db04:54321"

在db02上执行

db2 "update db cfg for testdb using HADR_TARGET_LIST db01:54321|db03:54321|db04:54321"

在db03上面执行

db2 "update db cfg for testdb using HADR_TARGET_LIST db01:54321|db02:54321|db04:54321"

可以在db02上面接管hadr

db2 TAKEOVER HADR ON DB TESTDB

可以看到如下信息

[db2inst1@db01 backup]$ db2 "select HADR_ROLE, STANDBY_ID, HADR_STATE, 
           varchar(PRIMARY_MEMBER_HOST,20) as PRIMARY_HOST, 
           varchar(STANDBY_MEMBER_HOST,20) as STANDBY_HOST 
    from table (mon_get_hadr(NULL))"

HADR_ROLE     STANDBY_ID HADR_STATE              PRIMARY_HOST         STANDBY_HOST        
------------- ---------- ----------------------- -------------------- --------------------
PRIMARY                1 PEER                    db01                 db02                
PRIMARY                2 REMOTE_CATCHUP          db01                 db03                
PRIMARY                3 REMOTE_CATCHUP          db01                 db04

版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux,oracle

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
hbhe0316

hbhe0316

关注

1.只有承认无知,才能装下新的东西; 2.进步来自一点点滴滴的积累; 3.广博让你更优秀,而专业让你无法替代; 4.挫折和失败能够转换为一种财富。

  • 889
    原创
  • 1
    翻译
  • 13
    转载
  • 24
    评论
  • 访问:1152309次
  • 积分:1523
  • 等级:核心会员
  • 排名:第6名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ