chinazzb
作者chinazzb2019-01-24 17:54
系统运维工程师, 深圳宝嘉电子设备有限公司

db2 v10.5 hadr 搭建过程

字数 6248阅读 890评论 3赞 4

organization: China Poka
Author: Duan Yu
mail: chinazzbcn@gmail.com or cn-duanyu@foxmail.com

1 、HADR 介绍

直接上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 极小

2、搭建过程

SUSE 11 sp3

2.1创建数据库管理用户及实例用户

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.2安装数据库

主机: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

3 HADR搭建及优化

3.1linux 内核优化

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=250 1024000 32 4096
kernel.msgmni=16384
kernel.msgmax=65536
kernel.msgmnb=65536

3.2数据库本身优化(需要根据业务来修改,推荐自动)

主数据库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

4测试主备数据是否同步

主数据库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

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

4

添加新评论3 条评论

#vpsuperman数据库管理员, vp
2019-08-08 08:42
36777173转成10进制913797491,提取码不对

vpsuperman@chinazzb 16进制2312cd5也不行,32进制132b6l也不行

2019-09-01 15:43

chinazzb@vpsuperman 转成16进制

2019-08-23 09:45
#TiuTiu系统运维工程师, 某软件公司
2019-02-14 16:04
谢谢分享,很不错
#michael1983技术经理, 某证券
2019-01-29 09:33
谢谢分享,很不错
Ctrl+Enter 发表

关于TWT  使用指南  社区专家合作  厂商入驻社区  企业招聘  投诉建议  版权与免责声明  联系我们
© 2019  talkwithtrend — talk with trend,talk with technologist 京ICP备09031017号-30