organization: China Poka
Author: Duan Yu
mail:[email protected] or [email protected]
直接上db2官方链接(中文)就不多说了,挑重点讲。
同步基于日志,日志模式决定业务属性。
同步模式(SYNC)
在同步模式下,当用户在主数据库上提交一个事务时,首先该事务的相关数据库日志会被写到主数据库的本地磁盘上,然后主数据库会将日志发送给备机数据库,并且等待备机数据库的回复;备机数据库在接收到日志,并将其写到自己的磁盘上后,才回复给主数据库。主数据库在接到备机数据库的回复之后,才返回给用户该事务提交成功。由此可见,在该同步模式下,凡是提交成功的事务,日志不仅在主数据库的磁盘上,也在备机数据库的磁盘上,此时如果主数据库发生故障,已提交的数据不会丢失。因此,在同步模式下,HADR 能够提供无数据丢失保证(No data loss guarantee)。但是,在该同步模式下,HADR 对主数据库业务的影响也是显而易见的。
近同步模式(NEARSYNC)
与同步模式相比,近同步模式下的备机数据库接收到主数据库发来的日志时,并不等待将其写到本地磁盘之后才回复给主数据库,而是立即回复给主数据库。主数据库在接收到备机数据库的回复之后就返回给用户事务提交成功,而此时,该事务的日志可能还在备机数据库的内存中,并未写到本地盘上。如果此时主机发生故障,并不能保证在原主数据库上已提交的数据在备机上必然能找回。虽然该同步模式不能保证零数据丢失,但是相比同步模式,近同步模式下的 HADR 对于主数据库业务的影响较小。
异步模式(ASYNC)
在异步模式下,主数据库发送日志成功后就返回给用户,事务提交成功,而此时,备机数据库有可能还没有收到这些日志。如果此时主数据库发生故障,该已提交事务的数据更改就会丢失。同样的,由于异步模式下的主数据库在返回给用户事务提交成功之前不等待备机数据库的回复,HADR 对主数据库上业务的影响比近同步模式更小。
超级异步模式(SUPERASYNC)
从 DB2 LUW V9.7.5 和 V9.5.8 开始,HADR 引入了一种新的同步模式,即超同步模式。在该同步模式下,主数据库上数据库日志的产生与发送完全分离,二者没有任何依赖,这样 HADR 对于主数据库业务的影响降到了最低;同时,由于日志的产生与发送分离,可能导致主数据库和备机数据库之间的差距较大,此时如果主机发生故障,会有较多的数据丢失;并且非强制接管(non-force TAKEOVER)可能需要更多时间。
模式 | 有无数据丢失风险 | 影响主数据库性能级别 |
SYNC | 无 | 大 |
NEARSYNC(default) | 有(不保证零数据丢失) | 小 |
ASYNC | 有 | 较小 |
SUPERASYNC | 有 | 极小 |
SUSE 11 sp3
zypper install -y gcc gcc-c++ kernel-source pam-32bit glibc-locale-32bit libstdc-32bit
groupadd -g 901 db2iadm1
groupadd -g 902 db2fadm1
groupadd -g 903 dasadm1
useradd -g db2iadm1 -u 801 -d /home/db2inst1 -m db2inst1
useradd -g db2fadm1 -u 802 -d /home/db2fenc1 -m db2fenc1
useradd -g dasadm1 -u 803 -d /home/dasadm1 -m dasusr1
主机:2台
172.18.94.110 db2_node1 4C 16G
172.18.94.111 db2_node2 4C 16G
v10.5fp10_linuxx64_server_t.tar.gz 安装包(百度云连接)https://pan.baidu.com/s/1FT7XTEQI9zNrzLzduBpB3Q 提取码(16进制自行转换):36777173
先检查/etc/hosts 有无设置本地ip映射/etc/hostname
172.18.94.110 db2_node1
172.18.94.111 db2_node2
写入服务名替代端口号
echo "db2_hadr1 55110/tcp
db2_hadr2 55111/tcp " >> /etc/services
tar zxvf v10.5fp10_linuxx64_server_t.tar.gz -C /opt/
/opt/server_t/db2_install/
yes
SERVER
no
###安装完成
/opt/ibm/db2/V10.5/instance/dascrt -u dasusr1
/opt/ibm/db2/V10.5/instance/db2icrt -a server -u db2fenc1 db2inst1
su - db2inst1 -c "db2set DB2COMM=TCPIP"
su - db2inst1 -c "db2 update dbm cfg using SVCENAME 50000"
su - db2inst1 -c "db2start
/opt/ibm/db2/V10.5/instance/db2iauto -on db2inst1
ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096 // SHMMNI 缺省系统页
max seg size (kbytes) = 32768 // SHMMAX
max total shared memory (kbytes) = 8388608 // SHMALL
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 1024 // SEMMNI
max semaphores per array = 250 // SEMMSL
max semaphores system wide = 256000 // SEMMNS
max ops per semop call = 32 // SEMOPM
semaphore max value = 32767
------ Messages: Limits --------
max queues system wide = 1024 // MSGMNI
max size of message (bytes) = 65536 // MSGMAX
default max size of queue (bytes) = 65536 // MSGMNB
参数名 | 公式 | 模板以 16G内存 |
kernel.shmmni | 4096 | 4096 |
kernel.shmmax | RAM(GB)*1024*1024*1024 | 17179869184 |
kernel.shmall | 2*缺省系统页*1024*1024 | 8388608 |
kernel.sem | 250 1024000 32 4096 | 同左边 |
kernel.msgmni | 1024 * RAM(GB) | 16384 |
kernel.msgmax | 65536 | 65536 |
kernel.msgmnb | 65536 | 65536 |
vim /etc/sysctl.conf or /etc/boot.sysctl
kernel.shmmni=4096
kernel.shmmax=17179869184
kernel.shmall=8388608
#kernel.sem=
kernel.sem=250 1024000 32 4096
kernel.msgmni=16384
kernel.msgmax=65536
kernel.msgmnb=65536
主数据库db2_node1:
db2 create db HADRDB using codeset utf8 territory CN collate using identity
创建缓冲池,包括表缓冲池、索引缓冲池(主数据库服务器)。
db2 "create bufferpool TB_BP_8k size 2000 pagesize 8k"
db2 "create bufferpool IDX_BP_8k size 2000 pagesize 8k"
创建表表空间、索引表空间.测试时不要创建表空间!!!!!
db2 "create regular tablespace TB_TS pagesize 8k managed by database using(file '/db2/db2inst1/HADRDB/tablespaces/HADRDB' 10g) bufferpool TB_BP_8k"
db2 "create regular tablespace IDX_TS pagesize 8k managed by database using(file '/db2/db2inst1/HADRDB/tablespaces/HADRDB_IDX' 4g) bufferpool IDX_BP_8k"
创建表
db2 connect to hadrdb
db2 "create table test_1(name varchar(20),age integer,gender varchar(10)) IN 'TB_TS' INDEX IN 'IDX_TS'"
db2 "insert into test_1 values(sdasd,22,msdasd)"
db2 update db cfg for hadrdb using LOGARCHMETH1 LOGRETAIN
db2 backup db hadrdb
db2 update db cfg for hadrdb using HADR_LOCAL_HOST db2_node1
db2 update db cfg for hadrdb using HADR_LOCAL_SVC db2_hadr1
db2 update db cfg for hadrdb using HADR_REMOTE_HOST db2_node2
db2 update db cfg for hadrdb using HADR_REMOTE_SVC db2_hadr2
db2 update db cfg for hadrdb using HADR_REMOTE_INST db2inst1
db2 update db cfg for hadrdb using LOGINDEXBUILD ON
将备份文件传输至db2_node2并恢复
备数据库db2_node2:
db2 "restore database hadrdb" 注意这条命令只允许备份文件在当前目录下
db2 update db cfg for hadrdb using HADR_LOCAL_HOST db2_node2
db2 update db cfg for hadrdb using HADR_LOCAL_SVC db2_hadr2
db2 update db cfg for hadrdb using HADR_REMOTE_HOST db2_node1
db2 update db cfg for hadrdb using HADR_REMOTE_SVC db2_hadr1
db2 update db cfg for hadrdb using HADR_REMOTE_INST db2inst1
启动hadr备
db2 start hadr on database hadr as standby
查看hadr状态
db2pd -db hadrdb -hadr
主数据库db2_node1:
启动hadr主
db2 start hadr on database hadrdb as primary
db2pd -db hadrdb -hadr
主数据库db2_node1:
db2 connect to hadrdb
db2 "create table tab1 (col1 int)"
db2 "insert into tab1 values (1)"
db2 "insert into tab1 values (2)"
db2 "insert into tab1 values (3)"
停止数据库
db2stop force
备数据库db2_node2:
接管主数据库
db2 takeover hadr on database hadrdb by force
查看是否成为主数据库
db2pd -db hadrdb -hadr | grep PRIMARY
查看db2_node1插入的数据是否同步了
db2 connect to hadrdb
db2 "select * from tab1"
创建表并检查数据是否同步
db2 "create table tab2 (col1 int)"
db2 "insert into tab2 values (4)"
db2 "insert into tab2 values (5)"
db2 "insert into tab2 values (6)"
db2_node1:
将db2_node1设置为主节点
db2 start hadr on database hadrdb as standby
db2pd -db hadrdb -hadr | grep STANDBY
db2 takeover hadr on database hadrdb
db2pd -db hadrdb -hadr | grep PRIMARY
检查数据是否同步
db2 "select * from tab2"
db2_node2:
db2pd -db hadrdb -hadr | grep STANDBY
参考链接:
https://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1206xuj2/
https://blog.csdn.net/hwh1231/article/details/53693879