达梦读写分离集群--实测

1、部署规划

主备集群为最基础的高可用架构,只有主库对外提供数据库服务,备库仅做备份,根据实际要求及网络条件,可以选择配置为自动切换或者手动切换模式。

1主1备2节点主备集群部署规划

IP规划:

主机名

服务ip

心跳ip

数据库名

实例名

dmdb01

192.168.1.101

172.16.1.101

dmdb

dmdb1

dmdb02

192.168.1.102

172.16.1.102

dmdb

dmdb2

dmdb03

192.168.1.103

172.16.1.103

dmdb

dmdb3

monitor

192.168.1.100

172.16.1.100

端口规划:

实例名

实例端口与MAL_INST_PORT相同

Mal系统监听tcp连接的端口MAL_PORT

实例本地的守护进程监听tcp连接的端口MAL_DW_PORT

实例监听守护进程TCP连接的端口MAL_INST_DW_PORT

dmdb1

15236

15336

15436

15536

dmdb2

15237

15337

15437

15537

dmdb3

15238

15338

15438

15538

存储规划

磁盘

挂载点/用途

/dev/sdc

数据库安装磁盘

/dev/sdd

数据磁盘

/dev/sde

备份磁盘

查看网卡UUID

nmcli con show

系统参数修改

cat /etc/sysctl.conf

fs.file-max = 6815744

fs.aio-max-nr = 1048576

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

net.ipv4.ip_local_port_range = 9000 65500

net.core.rmem_default = 4194304

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 1048576

vm.dirty_ratio = 80

vm.dirty_expire_centisecs = 500

vm.dirty_writeback_centisecs = 100

vm.swappiness=10

vm.dirty_background_ratio = 0

--vm.min_free_kbytes = 2097152

vim /etc/security/limits.conf

dmdba soft nofile 32768

dmdba hard nofile 65536

dmdba  soft      nice       0

dmdba  hard      nice       0

dmdba  soft      as         unlimited

dmdba  hard      as         unlimited

dmdba  soft      fsize      unlimited

dmdba  hard      fsize      unlimited

dmdba  soft      nproc      65536

dmdba  hard      nproc      65536

dmdba  soft      nofile     65536

dmdba  hard      nofile     65536

dmdba  soft      core       unlimited

dmdba  hard      core       unlimited

dmdba  soft      data       unlimited

dmdba  hard      data       unlimited

系统资源限制

vi /home/dmdba/.bash_profile

export DM_HOME=/dm8/

export PATH=$PATH:$DM_HOME/bin

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DM_HOME/bin

初始化数据库:

主数据库机器上初始化主库至目录/dm8/data:

./dminit path=/dm8/data db_name=dmdb INSTANCE_NAME=EP01 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123 PORT_NUM=15236 auto_overwrite=1

./dminit path=/dm8/data db_name=dmdb INSTANCE_NAME=EP02 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123 PORT_NUM=15237 auto_overwrite=1

./dminit path=/dm8/data db_name=dmdb INSTANCE_NAME=EP03 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123 PORT_NUM=15238 auto_overwrite=1

安装前准备

[root@localhost ~]# groupadd -g 10001 dinstall

[root@localhost ~]# useradd -g dinstall -m -d /home/dmdba dmdba

[root@localhost ~]# mkdir /soft

[root@localhost ~]# chown -R dmdba:dinstall /soft

scp dm8_20220525_x86_rh6_64.zip dmdba@192.168.1.102:/soft

[root@localhost ~]# mkdir -p /dm8

[root@localhost ~]# vgcreate myvg /dev/sdb /dev/sdc /dev/sdd

[root@localhost ~]# lvcreate -L 10G -n lv_dm8 myvg

  Logical volume "lv_dm8" created.

[root@localhost ~]# lvcreate -L 10G -n lv_data myvg

  Logical volume "lv_data" created.

[root@localhost ~]# mkfs.xfs /dev/myvg/lv_dm8

[root@localhost ~]# mkfs.xfs /dev/myvg/lv_data

[root@localhost ~]# mount /dev/myvg/lv_dm8 /dm8/

[root@localhost ~]# mkdir -p /dm8/data

[root@localhost ~]# mkdir -p /dm8/bakup

[root@localhost ~]# chown -R dmdba:dinstall /dm8

安装数据库软件到/dm8目录下

主节点机器上初始化主库至目录/dm8/data:

./dminit path=/dm8/data DB_NAME=dmdb  SYSDBA_PWD="Dameng123"  SYSAUDITOR_PWD="Dameng123" 

备节点机器上初始化备库至目录/dm8/data:

./dminit path=/dm8/data DB_NAME=dmdb  SYSDBA_PWD="Dameng123"  SYSAUDITOR_PWD="Dameng123"

准备数据:

1. 正常关闭主机数据库

2. 进行脱机备份

/dm8/bin/dmrman CTLSTMT="BACKUP DATABASE '/dm8/data/dmdb/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET  '/dm8/data/BACKUP_FILE_01'"

cd /dm8/data

tar zcvf backup.tar BACKUP_FILE_01/

scp /dm8/data/backup.tar 192.168.1.102:/dm8/data

tar xvf backup.tar

数据库还原:

cd

source .bash_profile

  /dm8/bin/dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/dmdb/dm.ini' FROM BACKUPSET'/dm8/data/BACKUP_FILE_01'"

因为脱机备份没有产生任何REDO日志,所以此处省略恢复数据库的操作步骤。

数据库更新:

  /dm8/bin/dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/dmdb/dm.ini' UPDATE DB_MAGIC"

7.1.2 联机备份、脱机还原方式

1. 对主进联备操

SQL>BACKUP DATABASE BACKUPSET '/dm8/data/BACKUP_FILE_01';

2. 拷贝备份文件到备库所在机器

3. 执行脱机数据库还原与恢复

./dmrman CTLSTMT="RESTOREDATABASE '/dm8/data/dmdb/dm.ini' FROM BACKUPSET '/dm/data/BACKUP_FILE_01'"

./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/dmdb/dm.ini' FROM BACKUPSET '/dm/data/BACKUP_FILE_01'"

./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/dmdb/dm.ini' UPDATE DB_MAGIC"

如果单节点系统已经上线,数据库服务不允许中断情况下,可以按照第“6.14节备库重建”的步骤完成备库数据准备。

备份文件中会记录原备份库的模式和OGUID信息,使用备份文件还原成功后,需要再根据实际配置情况修改数据库的模式和OGUID值。如果执行备份时,待备份的库是Normal模式,并且不能确定这个库一定作为主库使用,则对Normal模式的库必须使用脱机备份,不能使用联机备份方式,避免备份完成后,Normal模式的库LSN有增长,又将其修改为Standby模式,而使用备份集还原后的库修改为Primary模式,备库数据比主库数据多,导致主备数据不一致的情况出现。因此,对执行联机备份的库,建议是已经修改为Primary模式的库。

6.14 备库重建

当主备库所在硬件出现故障、或者数据库文件损坏导致数据损毁时,可按照第7章数据守护搭建中介绍的几种方式来重新准备数据。

重建库要选定一个当前有效库或者一个历史备份。下面以单节点备库B数据损坏,重新配置数据为例,说明备库重建流程:

1. 重新初始化数据库

./dminit path=/dm/data

2. 启动DIsql登录主库A,执行联机备份

  SQL> BACKUP DATABASE FULL BACKUPSET '/dm/data/BACKUP_FILE_01';

注意,如果主库dm.ini中的USE_AP设置为1,则需要先启动dmap服务。

3. 将备份文件拷贝至B所在的机器上,执行脱机还原与恢复

./dmrman CTLSTMT="RESTORE DATABASE '/dm8/data/dmdb/dm.ini' FROM BACKUPSET '/dm/data/BACKUP_FILE_01'"

./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/dmdb/dm.ini' FROM BACKUPSET '/dm/data/BACKUP_FILE_01'"

./dmrman CTLSTMT="RECOVER DATABASE '/dm8/data/dmdb/dm.ini' UPDATE DB_MAGIC"

4. 重新配置Bdm.inidmmal.inidmarch.inidmwatcher.ini配置文

5. Mount方式启动B

  ./dmserver /dm8/data/dmdb/dm.ini mount

6. DIsql登录B,设置OGUID,修改备库模式

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);

SQL>sp_set_oguid(82379);

SQL>alter database standby;

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

7. 启动B的守护进程

./dmwatcher /dm/data/DAMENG/dmwatcher.ini

执行以上步骤后,恢复B的准备过程已经完成。接下来,数据守护系统会将B作为备库重加入数据守护系统,A的守护进程会自动通知同步数据到B,最终恢复主备库数据到一致状态。

如果数据规模比较大、联机备份耗时较长、应用压力比较大的情况下,主库联机备份、备库脱机还原过程中,主库可能又新产生了大量归档日志。使用上述步骤重建备库后,主库向备库同步历史数据的时间会比较久,主备库数据会在比较长的一段时间内处于不一致状态。对这种情况,用户可以通过归档备份、还原和归档恢复功能,将备库数据恢复到更加接近主库的最新状态,有效减少备库加入主备系统后的历史数据同步时间。执行步骤如下:

1. 重新初始化数据库

./dminit path=/dm/data

2. 启动DIsql登录主库A,执行联机备份

SQL> BACKUP DATABASE FULLBACKUPSET '/dm/data/BACKUP_FILE_02' WITHOUT LOG;

注意,如果主库dm.ini中的USE_AP设置为1,则需要先启动dmap服务。

3. 将备份文件拷贝至B所在的机器上,执行脱机还原

./dmrman CTLSTMT="RESTORE DATABASE '/dm/data/DAMENG/dm.ini' FROM BACKUPSET '/dm/data/BACKUP_FILE_02'"

  1. 启动DIsql登录主库A,查看备份集的BEGIN_LSN,并从BEGIN_LSN开始备份主库的归档日志。(这里假设查询到的备份集BEGIN_LSN38491

如果备份集不是在默认备份路径下,则需要先将备份集所在目录添加进来,否则会查询不到备份集信息:

SQL>SELECT SF_BAKSET_BACKUP_DIR_ADD('DISK','/dm/data');

查询备份集信息并执行备份:

SQL> SELECT BACKUP_NAME,BEGIN_LSN FROM V$BACKUPSET;

SQL> BACKUP ARCHIVE LOG FROM LSN 38491 BACKUPSET '/dm/data/ARCH_BAK_02';

5. 将归档备份集拷贝至B所在的机器,还原归档后、利用这些归档日志进行数据库恢复

./dmrman CTLSTMT="RESTORE ARCHIVE LOG FROM BACKUPSET '/dm/data/ARCH_BAK_02' TO ARCHIVEDIR '/dm/data/arch'"

./dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' WITH ARCHIVEDIR '/dm/data/arch'"

./dmrman CTLSTMT="RECOVER DATABASE '/dm/data/DAMENG/dm.ini' UPDATE DB_MAGIC"

6. 重新配置Bdm.inidmmal.inidmarch.inidmwatcher.ini配置文

7. Mount方式启动B

./dmserver /dm/data/DAMENG/dm.ini mount

8. DIsql登录B,设置OGUID,修改备库模式

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);

SQL>sp_set_oguid(82379);

SQL>alter database standby;

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

9. 启动B的守护进程

./dmwatcher /dm/data/DAMENG/dmwatcher.ini

7.2.3 配置主库dmdb1 

7.2.3.1 配置dm.ini

在DW_P机器上配置主库的实例名为GRP1_RT_01,dm.ini参数修改如下:

#实例名,建议使用“组名_守护环境_序号”的命名方式,总长度不能超过16

INSTANCE_NAME= GRP1_RT_01

PORT_NUM= 15236 #数据库实例监听端口

DW_INACTIVE_INTERVAL= 60     #接收守护进程消息超时时间

ALTER_MODE_STATUS= 0 #不允许手工方式修改实例模式/状态/OGUID

ENABLE_OFFLINE_TS= 2#不允许备库OFFLINE表空间

MAL_INI= 1#打开MAL系统

ARCH_INI= 1#打开归档配置

RLOG_SEND_APPLY_MON= 64    #统计最近64次的日志发送信息

7.2.3.2 配置dmmal.ini

配置MAL系统,各主备库的dmmal.ini配置必须完全一致,MAL_HOST使用内部网络IP,MAL_PORT与dm.ini中PORT_NUM使用不同的端口值,MAL_DW_PORT是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:

vi dmmal.ini,内容如下:

MAL_CHECK_INTERVAL =5 #MAL链路检测时间间隔

MAL_CONN_FAIL_INTERVAL= 5 #判定MAL链路断开的时间

[MAL_INST1]

MAL_INST_NAME         = dmdb21 #实例名,和dm.ini中的INSTANCE_NAME一致

MAL_HOST            =172.16.1.101   #MAL系统监听TCP连接的IP地址

MAL_PORT              =15336 #MAL系统监听TCP连接的端口

MAL_INST_HOST        =192.168.1.101 #实例的对外服务IP地址

MAL_INST_PORT        = 15236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致

MAL_DW_PORT= 15436 #实例本地的守护进程监听TCP连接的端口

MAL_INST_DW_PORT= 15536 #实例监听守护进程TCP连接的端口

[MAL_INST2]

MAL_INST_NAME   = dmdb22

MAL_HOST          = 172.16.1.102

MAL_PORT              = 15337

MAL_INST_HOST         = 192.168.1.102

MAL_INST_PORT         = 15237

MAL_DW_PORT=15437

MAL_INST_DW_PORT = 15537

[MAL_INST3]

MAL_INST_NAME   = dmdb23

MAL_HOST          = 172.16.1.103

MAL_PORT              = 15338

MAL_INST_HOST         = 192.168.1.103

MAL_INST_PORT         = 15238

MAL_DW_PORT=15438

MAL_INST_DW_PORT = 15538

vi dmmal.ini

MAL_CHECK_INTERVAL =5

MAL_CONN_FAIL_INTERVAL= 5

[MAL_INST1]

MAL_INST_NAME         = GRP1_RT_01

MAL_HOST            =172.16.1.101

MAL_PORT              =15336

MAL_INST_HOST        =192.168.1.101

MAL_INST_PORT        = 15236

MAL_DW_PORT= 15436

MAL_INST_DW_PORT= 15536

[MAL_INST2]

MAL_INST_NAME   = GRP1_RT_02

MAL_HOST          = 172.16.1.102

MAL_PORT              = 15337

MAL_INST_HOST         = 192.168.1.102

MAL_INST_PORT         = 15237

MAL_DW_PORT=15437

MAL_INST_DW_PORT = 15537

[MAL_INST3]

MAL_INST_NAME   = GRP1_RT_03

MAL_HOST          = 172.16.1.103

MAL_PORT              = 15338

MAL_INST_HOST         = 192.168.1.103

MAL_INST_PORT         = 15238

MAL_DW_PORT=15438

MAL_INST_DW_PORT = 15538

7.2.3.3 配置dmarch.ini

修改dmarch.ini,配置本地归档和时归档。

除了本地归档外,其他归档配置项中的ARCH_DEST表示实例是Primary模式时,需要同步归档数据的目标实例名。

当前实例dmdb1是主库,需要向dmdb2/dmdb3同步数据,因此实时归档ARCH_DEST配置为dmdbdmdb3

[ARCHIVE_TIMELY1]

ARCH_TYPE= TIMELY #即时归档类型

ARCH_DEST= GRP1_RT_02 #即时归档目标实例名

[ARCHIVE_TIMELY2]

ARCH_TYPE= TIMELY #即时归档类型

ARCH_DEST= GRP1_RT_03 #即时归档目标实例名

[ARCHIVE_LOCAL1]

ARCH_TYPE=LOCAL #本地归档类型

ARCH_DEST= /dm8/data2/dmdb2/arch #本地归档文件存放路径

ARCH_FILE_SIZE= 128 #单位Mb,本地单个归档文件最大值

ARCH_SPACE_LIMIT= 0   #单位Mb,0表示无限制,范围1024~2147483647M

vi dmarch.ini

[ARCHIVE_TIMELY1]

ARCH_TYPE= TIMELY

ARCH_DEST= GRP1_RT_02

[ARCHIVE_TIMELY2]

ARCH_TYPE= TIMELY

ARCH_DEST= GRP1_RT_03

[ARCHIVE_LOCAL1]

ARCH_TYPE=LOCAL

ARCH_DEST= /dm8/data/dmdb/arch

ARCH_FILE_SIZE= 128

ARCH_SPACE_LIMIT= 0

7.2.3.4 配置dmwatcher.ini

修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。

[GRP1]

DW_TYPE = GLOBAL    #全局守护类型

DW_MODE =AUTO #自动切换模式

DW_ERROR_TIME    =10 #远程守护进程故障认定时间

INST_RECOVER_TIME  = 60 #主库守护进程启动恢复的间隔时间

INST_ERROR_TIME  = 10 #本地实例故障认定时间

INST_OGUID        = 453332 #守护系统唯一OGUID值

INST_INI          = /dm8/data2/dmdb2/dm.ini #dm.ini配置文件路径

INST_AUTO_RESTART=1 #打开实例的自动启动功能

INST_STARTUP_CMD   = /dm8/bin/dmserver #命令行方式启动

RLOG_SEND_THRESHOLD  = 0         #指定主库发送日志到备库的时间阈值,默认关闭

RLOG_APPLY_THRESHOLD = 0         #指定备库重演日志的时间阈值,默认关闭

vi dmwatcher.ini

[GRP1]

DW_TYPE = GLOBAL

DW_MODE =AUTO

DW_ERROR_TIME    =10

INST_RECOVER_TIME  = 60

INST_ERROR_TIME  = 10

INST_OGUID        = 453332

INST_INI          = /dm8/data/dmdb/dm.ini

INST_AUTO_RESTART=1

INST_STARTUP_CMD   = /dm8/bin/dmserver

RLOG_SEND_THRESHOLD  = 0

RLOG_APPLY_THRESHOLD = 0

7.2.3.5 启动主库

以Mount方式启动主库

./dmserver /dm8/data/dmdb/dm.ini mount

一定要以Mount方启动数据库实例,否则系统启动时会重构回滚表空间,生成Redo日志;

并且,启动后应用可能连接到数据库实例操作,破坏主备库的数据一致性。数据守护配置结束后,守护进程会自动Open数据库。

7.2.3.6 设置OGUID

启动命令行工具DIsql,登录主库设置OGUID值。

[dmdba@localhost bin]$ ./disql sysdba/Dameng123:15236

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS',1);

SQL>sp_set_oguid(453332);

alter database primary;

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);

注意:

系统通过OGUID值确定一个守护进程组,由用户保证OGUID值的唯一性,并确保数据守护系统中,数据库、守护进程和监视器配置相同的OGUID值。

7.2.3.7 修改数据库模式

启动命令行工具disql,登录主库修改数据库为Primary模式

SQL>alter database primary;

7.2.4 配置备库GRP1_RT_02 

7.2.4.1 配置dm.ini

在DW_S1机器上配置备库的实例名为dmdb22,dm.ini参数修改如下:

#实例名,建议使用“组名_守护环境_序号”的命名方式,总长度不能超过16

INSTANCE_NAME=GRP1_RT_02

PORT_NUM= 15237 #数据库实例监听端口

DW_INACTIVE_INTERVAL= 60 #接收守护进程消息超时时间

ALTER_MODE_STATUS= 0 #不允许手工方式修改实例模式/状态/OGUID

ENABLE_OFFLINE_TS= 2 #不允许备库OFFLINE表空间

MAL_INI= 1 #打开MAL系统

ARCH_INI= 1 #打开归档配置

RLOG_SEND_APPLY_MON= 64    #统计最近64次的日志重演信息

7.2.4.2 配置dmmal.ini

配置MAL系统,各主备库的dmmal.ini配置必须完全一致,MAL_HOST使用内部网络IP,MAL_PORT与dm.ini中PORT_NUM使用不同的端口值,MAL_DW_PORT是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:

MAL_CHECK_INTERVAL =5 #MAL链路检测时间间隔

MAL_CONN_FAIL_INTERVAL= 5 #判定MAL链路断开的时间

[MAL_INST1]

MAL_INST_NAME         = GRP1_RT_01  #实例名,和dm.ini中的INSTANCE_NAME一致

MAL_HOST            =172.16.1.101   #MAL系统监听TCP连接的IP地址

MAL_PORT              =15336 #MAL系统监听TCP连接的端口

MAL_INST_HOST        =192.168.1.101 #实例的对外服务IP地址

MAL_INST_PORT        = 15236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致

MAL_DW_PORT= 15436 #实例本地的守护进程监听TCP连接的端口

MAL_INST_DW_PORT= 15536 #实例监听守护进程TCP连接的端口

[MAL_INST2]

MAL_INST_NAME   = GRP1_RT_02

MAL_HOST          = 172.16.1.102

MAL_PORT              = 15337

MAL_INST_HOST         = 192.168.1.102

MAL_INST_PORT         = 15237

MAL_DW_PORT=15437

MAL_INST_DW_PORT = 15537

[MAL_INST3]

MAL_INST_NAME   = GRP1_RT_03      #统计最近64次的日志重演信息

MAL_HOST          = 172.16.1.103

MAL_PORT              = 15338

MAL_INST_HOST         = 192.168.1.103

MAL_INST_PORT         = 15238

MAL_DW_PORT=15438

MAL_INST_DW_PORT = 15538

7.2.4.3 配置dmarch.ini

修改dmarch.ini,配置本地归档和时归档。

除了本地归档外,其他归档配置项中的ARCH_DEST表示实例是Primary模式时,需要同步归档数据的目标实例名。

当前实例dmdb22是备库,守护系统配置完成后,可能在各种故障处理中,dmdb22切换为新的主库,正常情况下,dmdb11会切换为新的备库,需要向dmdb21和dmdb23同步数据,因此实时归档的ARCH_DEST配置为dmdb21和dmdb23

[ARCHIVE_TIMELY1]

ARCH_TYPE= TIMELY #时归档类型

ARCH_DEST= GRP1_RT_01 #时归档目标实例名

[ARCHIVE_TIMELY2]

ARCH_TYPE= TIMELY #时归档类型

ARCH_DEST= GRP1_RT_03 #时归档目标实例名

[ARCHIVE_LOCAL1]

ARCH_TYPE= LOCAL #本地归档类型

ARCH_DEST= /dm8/data/dmdb/arch #本地归档文件路径

ARCH_FILE_SIZE= 128 #单位Mb,本地单个归档文件最大值

ARCH_SPACE_LIMIT= 0    #单位Mb,0表示无限制,范围1024~2147483647M

7.2.4.4 配置dmwatcher.ini

修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。

[GRP1]

DW_TYPE = GLOBAL     #全局守护类型

DW_MODE = AUTO #自动切换模式

DW_ERROR_TIME    = 10 #远程守护进程故障认定时间

INST_RECOVER_TIME  = 60        #主库守护进程启动恢复的间隔时间

INST_ERROR_TIME  =10 #本地实例故障认定时间

INST_OGUID        = 453332 #守护系统唯一OGUID值

INST_INI  = /dm8/data/dmdb/dm.ini #dm.ini配置文件路径

INST_AUTO_RESTART  = 1 #打开实例的自动启动功能

INST_STARTUP_CMD  = /dm8/bin/dmserver #命令行方式启动

RLOG_SEND_THRESHOLD  = 0 #指定主库发送日志到备库的时间阈值,默认关闭

RLOG_APPLY_THRESHOLD= 0   #指定备库重演日志的时间阈值,默认关闭

7.2.4.5 启动备库

以Mount方式启动备库

./dmserver /dm8/data/dmdb/dm.ini mount

7.2.4.6 设置OGUID

启.命令.工具DIsql,.录.库.置OGUID值.453331

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);

SQL>sp_set_oguid(453332);

alter database standby;

SQL>SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS', 0);

7.2.4.7 修改数据库模式

启动命令行工具DIsql,登录备库修改数据库模式为Standby模

如果当前数据库不是Normal模式,需要先修改dm.ini中的ALTER_MODE_STATUS值为1,允许修改数据库模式,修改standby模式成功后,再改回0。如果是Normal模式,请忽略下面的第1步和第3步操作。

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);           ----第1步

SQL>alter database standby;----第2步

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);----第3步

7.3.5 配置备库GRP1_RWW_03

7.3.5.1 配置dm.ini

DW_S2机器上配置备库的实例名为GRP1_RWW_03dm.ini参数修改如下:

#实例名,建议使用组名_守护环境_序号的命名方式,总长度不能超过16

INSTANCE_NAME=GRP1_RT_03

PORT_NUM= 15238 #数据库实例监听端口

DW_INACTIVE_INTERVAL= 60 #接收守护进程消息超时时间

ALTER_MODE_STATUS= 0 #不允许手工方式修改实例模式/状态/OGUID

ENABLE_OFFLINE_TS= 2 #不允许备库OFFLINE表空间

MAL_INI= 1 #打开MAL系统

ARCH_INI= 1 #打开归档配置

RLOG_SEND_APPLY_MON= 64    #统计最近64次的日志重演信息

7.3.5.2 配置dmmal.ini

配置MAL系统,各主备库的dmmal.ini配置必须完全一致,MAL_HOST使用内部网络IP,MAL_PORT与dm.ini中PORT_NUM使用不同的端口值,MAL_DW_PORT是各实例对应的守护进程之间,以及守护进程和监视器之间的通信端口,配置如下:

MAL_CHECK_INTERVAL =5 #MAL链路检测时间间隔

MAL_CONN_FAIL_INTERVAL= 5 #判定MAL链路断开的时间

[MAL_INST1]

MAL_INST_NAME         = GRP1_RT_01 #实例名,和dm.ini中的INSTANCE_NAME一致

MAL_HOST            =172.16.1.101   #MAL系统监听TCP连接的IP地址

MAL_PORT              =15336 #MAL系统监听TCP连接的端口

MAL_INST_HOST        =192.168.1.101 #实例的对外服务IP地址

MAL_INST_PORT        = 15236 #实例的对外服务端口,和dm.ini中的PORT_NUM一致

MAL_DW_PORT= 15436 #实例本地的守护进程监听TCP连接的端口

MAL_INST_DW_PORT= 15536 #实例监听守护进程TCP连接的端口

[MAL_INST2]

MAL_INST_NAME   = GRP1_RT_02

MAL_HOST          = 172.16.1.102

MAL_PORT              = 15337

MAL_INST_HOST         = 192.168.1.102

MAL_INST_PORT         = 15237

MAL_DW_PORT=15437

MAL_INST_DW_PORT = 15537

[MAL_INST3]

MAL_INST_NAME   = GRP1_RT_03统计最近64次的日志重演信息

MAL_HOST          = 172.16.1.103

MAL_PORT              = 15338

MAL_INST_HOST         = 192.168.1.103

MAL_INST_PORT         = 15238

MAL_DW_PORT=15438

MAL_INST_DW_PORT = 15538

7.3.5.3 配置dmarch.ini

修改dmarch.ini,配置本地归档和时归档。

除了本地归档外,其他归档配置项中的ARCH_DEST表示实例是Primary模式时,需要同步归档数据的目标实例名。

当前实例GRP1_RT_03是备库,守护系统配置完成后,可能在各种故障处理中,GRP1_RT_03切换为新的主库,正常情况下,GRP1_RT_02会切换为新的备库,需要向GRP1_RT_01和GRP1_RT_02同步数据,因此实时归档的ARCH_DEST配置为GRP1_RT_01和GRP1_RT_02

[ARCHIVE_TIMELY1]

ARCH_TYPE= TIMELY #时归档类型

ARCH_DEST= GRP1_RT_01 #时归档目标实例名

[ARCHIVE_TIMELY2]

ARCH_TYPE= TIMELY #时归档类型

ARCH_DEST= GRP1_RT_02 #时归档目标实例名

[ARCHIVE_LOCAL1]

ARCH_TYPE= LOCAL #本地归档类型

ARCH_DEST= /dm8/data/dmdb/arch #本地归档文件路径

ARCH_FILE_SIZE= 128 #单位Mb,本地单个归档文件最大值

ARCH_SPACE_LIMIT= 0    #单位Mb,0表示无限制,范围1024~2147483647M

7.3.5.4 配置dmwatcher.ini

修改dmwatcher.ini配置守护进程,配置为全局守护类型,使用自动切换模式。

[GRP1]

DW_TYPE = GLOBAL     #全局守护类型

DW_MODE = AUTO #自动切换模式

DW_ERROR_TIME    = 10 #远程守护进程故障认定时间

INST_RECOVER_TIME  = 60        #主库守护进程启动恢复的间隔时间

INST_ERROR_TIME  =10 #本地实例故障认定时间

INST_OGUID        = 453332 #守护系统唯一OGUID值

INST_INI  = /dm8/data/dmdb/dm.ini #dm.ini配置文件路径

INST_AUTO_RESTART  = 1 #打开实例的自动启动功能

INST_STARTUP_CMD  = /dm8/bin/dmserver #命令行方式启动

RLOG_SEND_THRESHOLD  = 0 #指定主库发送日志到备库的时间阈值,默认关闭

RLOG_APPLY_THRESHOLD= 0   #指定备库重演日志的时间阈值,默认关闭

7.3.5.5 启动备库

Mount式启动

./dmserver /dm8/data/dmdb/dm.ini mount

7.3.5.6 设置OGUID

[dmdba@localhost bin]$ ./disql sysdba/Dameng123:15238

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);

SQL>sp_set_oguid(453332);

alter database standby;

SQL>SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS', 0);

7.3.5.7 修改数据库模式

启动命令行工具DIsql,登录备库修改数据库模式为Standby模

如果当前数据库不是Normal模式,需要先修改dm.ini中的ALTER_MODE_STATUS值为1,允许修改数据库模式,修改standby模式成功后,再改回0。如果是Normal模式,请忽略下面的第1步和第3步操作。

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);           ----第1步

SQL>alter database standby;----第2步

SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);----第3步

root用户执行:

cd /dm8/script/root

/dm8/script/root/dm_service_installer.sh -t dmserver -m mount -dm_ini /dm8/data/dmdb/dm.ini -p DMSERVER

/dm8/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/dmdb/dmwatcher.ini -p DMWATCHER

/dm8/script/root/dm_service_installer.sh -t dmmonitor -monitor_ini /dm8/data/dmmonitor.ini -p DMMONITOR

 systemctl start DmWatcherServiceDMWATCHER

 ./disql sysdba/Dameng123:15236

./dm_service_installer.sh -t dmserver -p DMSERVER -m mount -dm_ini /dm8/data/DAMENG/dm.ini

./dm_service_installer.sh -t dmwatcher -p DMWATCHER -watcher_ini /dm8/data/DAMENG/dmwatcher.ini

./dm_service_installer.sh -t dmmonitor -p DMMONITOR -monitor_ini /dm8/data/DAMENG/dmmonitor.ini

7.2.5 配置监视器

配置监视器时可以选择配置单实例监视器或配置多实例监视器,下面将分别介绍配置单实例监视器以及多实例监视器时dmmonitor.ini配置文件中的配置信息。

7.2.5.1 配置单实例监视器

由于主库和实时备库的守护进程配置为自动切换模式,因此这里选择配置确认监视器。和普通监视器相比,确认监视器除了相同的命令支持外,在主库发生故障时,能够自动通知实时备库接管为新的主库,具有自动故障处理的功能。

修改dmmonitor.ini配置确认监视器,其中MON_DW_IP中的IP和PORT和dmmal.ini中的MAL_HOST和MAL_DW_PORT配置项保持一致。

MON_DW_CONFIRM = 1  #确认监视器模式

MON_LOG_PATH = /dm8/data/log#监视器日志文件存放路径

MON_LOG_INTERVAL= 60#每隔60s定时记录系统信息到日志文件

MON_LOG_FILE_SIZE = 32#每个日志文件最大32M

MON_LOG_SPACE_LIMIT = 0#不限定日志文件总占用空间

[GRP1]

MON_INST_OGUID = 453331 #组GRP1的唯一OGUID值

#以下配置为监视器到组GRP1的守护进程的连接信息,以“IP:PORT”的形式配置

#IP对应dmmal.ini中的MAL_HOST,PORT对应dmmal.ini中的MAL_DW_PORT

MON_DW_IP = 172.16.1.101:15436

MON_DW_IP = 172.16.1.102:15437

MON_DW_IP = 172.16.1.103:15438

配置多实例监视器配置文件

与配置单实例监视器相比,配置多实例监视器时dmmonitor.ini中需要添加整个监视器系统中的实例总数MON_INST_NUM(取值为13或者5),各实例通信的心跳校验间隔MON_HB_INTERVAL(取值(5~600),单位秒),各实例通信的心跳间隔MON_BRO_INTERVAL(取值(5~600),单位毫秒),各实例通信的基础投票间隔MON_VOTE_INTERVAL(取值(5~600),单位毫秒),各实例通信的心跳间隔以及基础投票间隔会在真正使用时进行调整,各实例通信心跳间隔需要比基础投票间隔小(若配置中各实例通信心跳间隔比基础投票间隔大,内部会将实例通信心跳间隔调整为与基础投票间隔相同,再进行其他的调整处理),增加监视器IDMON_ID(用于区别所有监视器中的不同实例,每个监视器实例的MON_IDMON_INST_ID相同,取值(1~2147483647)),增加监视器系统唯一标识MON_MID(取值(1~2147483647)),多实例监视器系统中的所有监视器需配置相同的MON_MID

与配置单实例监视器相比,配置多实例监视器时组的配置信息不做更改,监视器实例的配置信息需要新增配置参数,通过组和实例的配置信息内容的不同来区分组和实例,如果用户将组和实例的配置信息混淆,则以配置信息中更加靠前的参数为准来决定当前配置属于组还是实例,不属于组或实例的配置项将会被忽略。

监视器实例的配置信息包括实例IP地址、监听端口号以及实例在系统中的唯一编号,实例的IP地址和监听端口号不应出现冲突,否则该监视器实例可能无法正常使用。所有监视器实例的dmmonitor.ini配置文件中除MON_ID参数项外应完全一致,每个监视器的MON_ID应互不相同,用于区分同一个监视器系统中的不同监视器实例,若配置相同的MON_ID将导致通信无法正常建立。监视器实例监听的IP及端口号的正确性由用户保证。

配置多实例监视器时dmmonitor.ini配置文件中的内容如下:

MON_LOG_PATH= /dm/data/log

MON_LOG_INTERVAL= 60

MON_LOG_FILE_SIZE= 32

MON_LOG_SPACE_LIMIT= 0

MON_DW_CONFIRM= 1

MON_INST_NUM= 3#实例总个数

MON_HB_INTERVAL= 60 #通信心跳校验间隔

MON_BRO_INTERVAL= 100 #raft协议中实例通信心跳间隔

MON_VOTE_INTERVAL=100 #raft协议中基础投票间隔

MON_ID=1#当前监视器在监视器系统中的ID

MON_MID=45614#当前监视器系统的唯一标识

[GRP1]

MON_INST_OGUID= 453332

MON_DW_IP = 192.168.0.141:52141

MON_DW_IP = 192.168.0.142:52142

MON_DW_IP = 192.168.0.143:52143

[GRP2]

[GRP3]

[MON1]

MON_HOST     = 192.168.0.141#系统监听TCP连接的IP地址

MON_PORT              = 8339 #系统监听TCP连接的端口号

MON_INST_ID= 1 #监视器实例在监视器系统中的ID

[MON2]

...

[MON3]

7.2.6 启动守护进程

程:

./dmwatcher /dm8/data2/dmdb2/dmwatcher.ini

守护进程启动后,进入startup状态,此时实例都处于mount状态,守护进程开始广播自身和其监控实例的状态信息,结合自身信息和远程守护进程的广播信息,守护进程将本地实例OPEN,并切换为OPEN状态。

7.2.7 启动监视器

启动监视器:

./dmmonitor /dm8/data/dmmonitor.ini

监视器提供一系列命令,支持当前守护系统状态查看及故障处理,可输入help查看。,在视器上行show命监控所有实例

主备切换

1.查看集群可以切换的节点

choose switchover GRP1

Can choose one of the following instances to do switchover:

1: DMDB2

2.输入switchover DMDB2回车,集群开始进行主备切换

switchover DMDB2

要实现Spring Boot与达梦数据库读写分离集群,您需要进行以下步骤: 1. 配置数据源:打开Spring Boot项目的application.properties文件,配置主库和从库的数据源信息。例如: ``` # 主库数据源 spring.datasource.primary.url=jdbc:dme://localhost:5236/demo spring.datasource.primary.username=root spring.datasource.primary.password=root # 从库数据源 spring.datasource.secondary.url=jdbc:dme://localhost:5236/demo spring.datasource.secondary.username=root spring.datasource.secondary.password=root ``` 2. 配置数据源路由:使用Spring Boot提供的AbstractRoutingDataSource类,创建一个数据源路由器,根据SQL语句的类型(读/写)选择合适的数据源。例如: ``` public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // 根据上下文选择合适的数据源 return DatabaseContextHolder.getDatabaseType(); } } ``` 3. 配置数据源上下文:使用ThreadLocal类保存当前线程的数据源类型,以便在数据源路由器中选择正确的数据源。例如: ``` public class DatabaseContextHolder { private static final ThreadLocal<DatabaseType> contextHolder = new ThreadLocal<>(); public static void setDatabaseType(DatabaseType databaseType) { contextHolder.set(databaseType); } public static DatabaseType getDatabaseType() { return contextHolder.get(); } public static void clearDatabaseType() { contextHolder.remove(); } } public enum DatabaseType { PRIMARY, SECONDARY } ``` 4. 配置事务管理器:使用Spring Boot提供的JpaTransactionManager类,为主库和从库分别配置事务管理器。例如: ``` @Configuration @EnableTransactionManagement public class TransactionConfig { @Autowired @Qualifier("primaryEntityManagerFactory") private EntityManagerFactory primaryEntityManagerFactory; @Autowired @Qualifier("secondaryEntityManagerFactory") private EntityManagerFactory secondaryEntityManagerFactory; @Bean(name = "primaryTransactionManager") public PlatformTransactionManager primaryTransactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(primaryEntityManagerFactory); return transactionManager; } @Bean(name = "secondaryTransactionManager") public PlatformTransactionManager secondaryTransactionManager() { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(secondaryEntityManagerFactory); return transactionManager; } } ``` 5. 配置JPA和Hibernate:为主库和从库分别配置JPA和Hibernate。例如: ``` @Configuration @EnableJpaRepositories( basePackages = "com.example.demo.primary", entityManagerFactoryRef = "primaryEntityManagerFactory", transactionManagerRef = "primaryTransactionManager" ) @EnableTransactionManagement public class PrimaryDataSourceConfig { @Primary @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "primaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) { return builder .dataSource(dataSource) .packages("com.example.demo.primary") .persistenceUnit("primary") .build(); } @Primary @Bean(name = "primaryJpaProperties") @ConfigurationProperties(prefix = "spring.jpa.primary") public JpaProperties primaryJpaProperties() { return new JpaProperties(); } @Primary @Bean(name = "primaryHibernateProperties") @ConfigurationProperties(prefix = "spring.jpa.primary.hibernate") public HibernateProperties primaryHibernateProperties() { return new HibernateProperties(); } } @Configuration @EnableJpaRepositories( basePackages = "com.example.demo.secondary", entityManagerFactoryRef = "secondaryEntityManagerFactory", transactionManagerRef = "secondaryTransactionManager" ) @EnableTransactionManagement public class SecondaryDataSourceConfig { @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) { return builder .dataSource(dataSource) .packages("com.example.demo.secondary") .persistenceUnit("secondary") .build(); } @Bean(name = "secondaryJpaProperties") @ConfigurationProperties(prefix = "spring.jpa.secondary") public JpaProperties secondaryJpaProperties() { return new JpaProperties(); } @Bean(name = "secondaryHibernateProperties") @ConfigurationProperties(prefix = "spring.jpa.secondary.hibernate") public HibernateProperties secondaryHibernateProperties() { return new HibernateProperties(); } } ``` 6. 使用数据源:在需要使用数据源的地方,通过调用DatabaseContextHolder.setDatabaseType()方法设置当前线程的数据源类型,然后执行SQL语句即可。例如: ``` @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void save(User user) { DatabaseContextHolder.setDatabaseType(DatabaseType.PRIMARY); userRepository.save(user); DatabaseContextHolder.setDatabaseType(DatabaseType.SECONDARY); userRepository.save(user); } } ``` 这样,就可以实现Spring Boot与达梦数据库读写分离集群了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值