达梦数据库读写分离集群简介
读写分离集群(DMRWC)是一个用于提升并发事务处理性能的集群组件。在一个高并发的事务型系统中,当写事务占的比例相对读事务较小时,这种独具创新的方案DMRWC,可通过客户端来实现读、写事务的自动分离,读事务在备机执行,写事务在主机执行,减轻主机的负载。可配置多台备机,通过增加备机节点资源,提高系统的并发能力,增强系统性能。
达梦数据库读写分离集群还具备数据保护、容灾等高可用性,提供数据同步、备库故障自动处理、故障恢复自动数据同步等功能,也支持自动故障切换和手动故障切换两种守护模式。
自动故障处理
当备库发生故障时,主库的数据库服务不会受到不影响,守护进程会自动通知主库修改归档为 Invalid 状态,将备库失效。
自动数据同步
当备库故障恢复后,守护进程自动通知主库发送归档和 Redo 日志,继续进行主备库数据同步。在历史数据同步完成后,修改主库的归档状态为 Valid,恢复备库功能。
当主库发生故障,由备库接管后,原主库故障恢复,守护进程会自动将原主库以备库的模式重新入主备系统。
备库接管
当主库发生故障后,可以通过监视器执行 Takeover 命令,将备库切换为主库,继续对外提供服务。如果配置为自动切换模式,确认监视器可以自动检测主库故障,并通知备库接管,这个过程不需要人工干预。
必须使用监视器进行操作
1.登录监视器为交互模式(这里不能使用后台模式,否则无法使用监视器自带的相关命令)
例:./dmmonitor …/data/dameng/dmmonitor.ini
2.登录(会提示输入用户名和密码,使用SYSDBA/SYSDBA即可)
Login
用户名:
密码:
登录成功提示:Login dmmonitor success!
3.接管
takeover 组名.实例名
4.查看确认
show
备库强制接管
如果执行 Takeover 命令不成功,但主库又由于硬件损坏等原因无法马上恢复,为了及时恢复数据库服务,DM 提供了 Takeover Force 命令,强制将备库切换为主库。但需要由用户确认主库故障前,主库与接管备库的数据是一致的(主库到备库的归档是 Valid状态),避免引发守护进程组分裂。
执行 Takeover Force 有可能引发组分裂,而 Takeover 命令是在确保不会产生组分裂情况下才会执行成功。
必须使用监视器进行操作
1.登录监视器为交互模式(这里不能使用后台模式,否则无法使用监视器自带的相关命令)
例:./dmmonitor …/data/dameng/dmmonitor.ini
2.登录(会提示输入用户名和密码,使用SYSDBA/SYSDBA即可)
Login
用户名:
密码:
登录成功提示:Login dmmonitor success!
3.接管
takeover force 组名.实例名
4.查看确认
show
在某些极端情况下或人为因素,导致的硬件故障或者组分裂等集群处于无法自动恢复的状态时,通常处理方式如下:
可以手动关闭故障服务器的守护进程和数据库进程(如果发生故障时进程仍然在运行),只使用单一主库+确认监视器继续对外提供服务。在合适的时候再重新动态搭建备库,搭建过程不需要停止数据库服务。
示例:集群发生组分裂的恢复
发生组分裂时,通过监视查看集群状态:
产生了2个主库,一个open状态一个mount状态
show
2021-05-25 20:20:00
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 453332 TRUE AUTO FALSE
GROUP SPLIT:
1: DATABASE(GRP1_RWW_02):
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.168.10.12 52141 2021-05-25 20:20:00 GLOBAL VALID OPEN GRP1_RWW_02 OK 1 1 OPEN PRIMARY DSC_OPEN TIMELY VALID
EP INFO:
INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
5236 OK GRP1_RWW_02 OPEN PRIMARY 0 0 TIMELY VALID 3998 41551 3998 41551 NONE
2: DATABASE(GRP1_RWW_01):
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.168.10.11 52141 2021-05-25 20:20:00 GLOBAL SPLIT STARTUP GRP1_RWW_01 OK 1 1 MOUNT PRIMARY DSC_OPEN TIMELY VALID
EP INFO:
INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
5236 OK GRP1_RWW_01 MOUNT PRIMARY 0 0 TIMELY VALID 3997 40199 3997 40199 NONE
#================================================================================#
动态重建备库
在不停服务的情况下进行动态搭建
先后关闭mount主库GRP1_RWW_01上的守护进程和数据库进程
[dmdba@localhost bin]$ disql
disql V8
用户名:
密码:
服务器[LOCALHOST:5236]:处于主库配置状态
登录使用时间 : 7.448(ms)
SQL> exit
[dmdba@localhost bin]$ DmWatcherServiceDMWATCHER stop
Stopping DmWatcherServiceDMWATCHER: [ OK ]
[dmdba@localhost bin]$ DmServiceDMSERVER stop
Stopping DmServiceDMSERVER: [ OK ]
对open的主库GRP1_RWW_02进行热备
SQL> backup database full backupset '/home/dmdba/full_bak';
操作已执行
已用时间: 00:00:01.102. 执行号:400.
将备份考到GRP1_RWW_01上进行恢复
[dmdba@localhost ~]$ scp -r full_bak/ 192.168.10.11:/home/dmdba
dmdba@192.168.10.11's password:
full_bak.bak 100% 27MB 84.7MB/s 00:00
full_bak_1.bak 100% 34KB 2.0MB/s 00:00
full_bak.meta
将GRP1_RWW_01的原数据目录重命名,在相同位置重新初始化实例
[dmdba@localhost data]$ mv DAMENG bak_DAMENG
[dmdba@localhost data]$ dminit PATH=/home/dmdba/dmdbms/data
initdb V8
db version: 0x7000b
file dm.key not found, use default license!
License will expire on 2021-11-06
log file path: /home/dmdba/dmdbms/data/DAMENG/DAMENG01.log
log file path: /home/dmdba/dmdbms/data/DAMENG/DAMENG02.log
write to dir [/home/dmdba/dmdbms/data/DAMENG].
create dm database success. 2021-05-25 20:33:36
[dmdba@localhost data]$ dmrman
dmrman V8
RMAN> restore database '/home/dmdba/dmdbms/data/DAMENG/dm.ini' from backupset '/home/dmdba/full_bak';
restore database '/home/dmdba/dmdbms/data/DAMENG/dm.ini' from backupset '/home/dmdba/full_bak';
file dm.key not found, use default license!
[Percent:100.00%][Speed:0.00M/s][Cost:00:00:00][Remaining:00:00:00]
restore successfully.
time used: 312.129(ms)
RMAN> recover database '/home/dmdba/dmdbms/data/DAMENG/dm.ini' from backupset '/home/dmdba/full_bak';
recover database '/home/dmdba/dmdbms/data/DAMENG/dm.ini' from backupset '/home/dmdba/full_bak';
Database mode = 1, oguid = 453332
EP[0]’s cur_lsn[41551]
EP:0 total 1 pkgs applied, percent: 50%
EP:0 total 2 pkgs applied, percent: 100%
recover successfully!
time used: 241.618(ms)
RMAN> recover database '/home/dmdba/dmdbms/data/DAMENG/dm.ini' update db_magic;
recover database '/home/dmdba/dmdbms/data/DAMENG/dm.ini' update db_magic;
Database mode = 1, oguid = 453332
EP[0]'s cur_lsn[41562]
recover successfully!
time used: 982.844(ms)
GRP1_RWW_01恢复完成后将原来的ini文件拷贝到数据目录中,并启动守护进程
[dmdba@localhost data]$ cp bak_DAMENG/*.ini DAMENG/
[dmdba@localhost data]$ DmWatcherServiceDMWATCHER start
Starting DmWatcherServiceDMWATCHER: [ OK ]
查看监视器
[monitor] 2021-05-25 20:42:33: 守护进程(GRP1_RWW_01)状态切换 [NONE-->STARTUP]
[monitor] 2021-05-25 20:42:49: 守护进程(GRP1_RWW_01)状态切换 [STARTUP-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2021-05-25 20:42:49 OPEN OK GRP1_RWW_01 OPEN STANDBY INVALID 4 41562 41562
[monitor] 2021-05-25 20:42:53: 守护进程(GRP1_RWW_02)状态切换 [OPEN-->RECOVERY]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2021-05-25 20:42:52 RECOVERY OK GRP1_RWW_02 OPEN PRIMARY VALID 4 41571 41571
[monitor] 2021-05-25 20:42:55: 守护进程(GRP1_RWW_02)状态切换 [RECOVERY-->OPEN]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2021-05-25 20:42:55 OPEN OK GRP1_RWW_02 OPEN PRIMARY VALID 4 41571 41571
GRP1_RWW_01恢复后将以备库状态加入集群
show
2021-05-25 20:44:54
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 453332 TRUE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.168.10.12 52141 2021-05-25 20:44:53 GLOBAL VALID OPEN GRP1_RWW_02 OK 1 1 OPEN PRIMARY DSC_OPEN TIMELY VALID
EP INFO:
INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
5236 OK GRP1_RWW_02 OPEN PRIMARY 0 0 TIMELY VALID 4005 41571 4005 41571 NONE
<<DATABASE GLOBAL INFO:>>
IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.168.10.11 52141 2021-05-25 20:44:53 GLOBAL VALID OPEN GRP1_RWW_01 OK 1 1 OPEN STANDBY DSC_OPEN TIMELY VALID
EP INFO:
INST_PORT INST_OK INAME ISTATUS IMODE DSC_SEQNO DSC_CTL_NODE RTYPE RSTAT FSEQ FLSN CSEQ CLSN DW_STAT_FLAG
5236 OK GRP1_RWW_01 OPEN STANDBY 0 0 TIMELY VALID 4001 41571 4001 41571 NONE
DATABASE(GRP1_RWW_01) APPLY INFO FROM (GRP1_RWW_02):
DSC_SEQNO[0], (ASEQ, SSEQ, KSEQ)[4005, 4005, 4005], (ALSN, SLSN, KLSN)[41571, 41571, 41571], N_TSK[0], TSK_MEM_USE[0]
#================================================================================#
动态重建备库完成。