环境说明:
版本:达梦 8.1.3.26
架构:达梦守护集群
问题说明:
由于服务器资源有限,将monitor监控器部署在了备库服务器上,DM8数据守护架构归档模式支持多种类型,实时归档、即时归档等,搭建数据库时,考虑到实时归档需要单独维护KEEP_RLOG_PKG部分,猜想出问题的概率可能会更大一些,所以选择了即时归档,数据库使用一段时间,有一天突然发现主备服务器之间心跳网卡故障了,守护集群发生了组分裂(或称为脑裂):
show global info
2023-10-12 15:22:33
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 123456 FALSE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.16.12.11 33333 2023-10-12 15:22:33 GLOBAL VALID OPEN CJC01 OK 1 1 OPEN PRIMARY DSC_OPEN TIMELY VALID
ERROR DATABASE:
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.16.12.12 33333 2023-10-12 15:21:30 GLOBAL SPLIT STARTUP CJC02 OK 1 1 MOUNT PRIMARY DSC_OPEN TIMELY VALID
#================================================================================#
其中备库WCTLSTAT为SPLIT,WSTATUS为STARTUP,ISTATUS为MOUNT,IMODE为PRIMARY,出现了双主的情况。
影响范围:
1.主备同步中断。
测试通过dm_svc.conf服务名进行连接数据库,LOGIN_MODE=(1)只连接主库,多次测试可以连接到正常的PRIMARY,理论上对应用访问数据库没影响。
修复:
待心跳网络恢复后,备库没有自动恢复,沟通原厂技术,此类问题只能通过重建备库来解决。
问题原因:
timely即时归档模式下,数据先写到本地,再发送备库,如果在发送期间心跳网络故障,主、备库之间无法通信,由于本次案例的监控器在备库,监控器可以正常和备库通信,无法和主库通信,会判断主库故障,发生主、备切换,但由于主从数据不一致,所以备库角色虽然切换为PRIMARY,但状态只能到MOUNT,无法OPEN,从而发生了SPLIT。
解决方案:
如何避免类似问题再次发生。
1.监控器放在独立的服务器,不能主、备数据库部署在一起。
2.归档模式从即时归档更改为实时归档。
实时归档说明:
与本地归档写入保存在磁盘中的日志文件不同,实时归档(Realtime)将主库产生的 Redo 日志通过 MAL 系统传递到备库,实时归档是实时主备和 MPP 主备的实现基础。实时归档只在主库生效,一个主库可以配置 1~8 个实时备库。
实时归档的执行流程是,主库在 Redo 日志(RLOG_PKG)写入联机日志文件前,将 Redo 日志发送到备库,备库收到 Redo 日志(RLOG_PKG)后标记为 KEEP_RLOG_PKG,将原 KEEP_RLOG_PKG 加入日志重演任务系统,并马上响应主库(高性能模式),不需要等待 Redo 日志重演结束后再响应主库。主库收到备库的响应消息,确认备库已经收到 Redo 日志后,再将 Redo 日志写入联机日志文件中。
什么是KEEP_RLOG_PKG呢,有什么作用?
KEEP_RLOG_PKG 介绍
主库的 RLOG_PKG 日志通过实时归档机制发送到备库后,备库将最新收到的 RLOG_PKG 保存在内存中,不马上启动重演,这个 RLOG_PKG 我们称之为 KEEP_RLOG_PKG。
引入 KEEP_RLOG_PKG 的主要目的是,避免下述场景中,主库故障重启后不必要的主备切换,减少用户干预。
场景说明(实时主备或 MPP 主备):
1.用户登录主库 A 执行
CREATE TABLE TX(C1 INT);
INSERT INTO TX VALUES(1);
COMMIT;
其中 COMMIT 操作将触发实时归档,发送 RLOG_PKG 到备库 B。
2.备库 B 收到 RLOG_PKG,响应主库 A,并启动日志重演。
3.主库 A 在 RLOG_PKG 写入联机日志文件之前故障。
4.主库 A 重新启动后,由于 RLOG_PKG 没有写入联机日志文件,之前插入 TX 表的数据丢失;但此时备库 B 已经重演日志成功,TX 表中已经插入一行数据。
上述场景中,主备库数据不再保持一致,必须将备库 B 切换为主库,并重新从 B 同步数据到 A。
如果配置的是手动切换模式,则必须要有用户干预,进行备库接管后,才能恢复数据库服务。
引入 KEEP_RLOG_PKG 后,备库 B 收到主库 A 发送的 RLOG_PKG,并不会马上启动日志重演,主库 A 重启后,守护进程 A 检测到备库 B 存在 KEEP_RLOG_PKG,通知备库 B 丢弃 KEEP_RLOG_PKG 后,直接 Open 主库 A,就可以继续提供数据库服务。
并且,这些操作是由守护进程自动完成,不需要用户干预。
如果备库自动接管、或者用户发起备库接管命令,那么备库的 KEEP_RLOG_PKG 将会启动重演,不管主库是否已经将 KEEP_RLOG_PKG 对应的 Redo 日志写入联机日志文件中,备库接管时的 APPLY_LSN 一定是大于等于主库的 FILE_LSN。
当故障主库重启后,仍然可以作为备库,自动重新加入数据守护系统。
注意
即时归档在RLOG_PKG写入主库联机Redo日志文件后,再发送RLOG_PKG到备库,因此即时备库没有KEEP_RLOG_PKG。
归档类型
测试实时归档下心跳网卡中断场景,实验如下:
归档模式更改为REALTIME
监控器在备库上
ip a
3: enp0s8: <BRCJCDCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:d1:e6:01 brd ff:ff:ff:ff:ff:ff
inet 192.16.12.12/24 brd 192.16.12.255 scope global noprefixroute enp0s8
[ ]
Device 'enp0s8' successfully disconnected.
备库确认监控器信息
主、备库WSTATUS状态为ERROR,备库IMODE还是STANDBY,没有切换为PRIMARY,没有发生SPLIT。
[2023-10-12 15:19:08: Clean request of dmwatcher processer CJC02 success ]
[2023-10-12 15:19:08: Switchover instance CJC01 success ]
[2023-10-12 15:19:09: Dmwatcher process CJC01 status switching [OPEN-->RECOVERY] ]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-10-12 15:19:09 RECOVERY OK CJC01 OPEN PRIMARY VALID 11 49962 49962
[2023-10-12 15:19:11: Dmwatcher process CJC01 status switching [RECOVERY-->OPEN] ]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-10-12 15:19:11 OPEN OK CJC01 OPEN PRIMARY VALID 11 49963 49963
[2023-10-12 15:21:52: Received message timeout from(CJC01) ]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-10-12 15:21:30 ERROR OK CJC01 OPEN PRIMARY VALID 11 50009 50009
[monitor] 2023-10-12 15:21:52: Received message timeout from(CJC02)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-10-12 15:21:30 ERROR OK CJC02 OPEN STANDBY VALID 11 50009 50009
show global info
2023-10-12 15:24:06
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 123456 TRUE AUTO FALSE
ERROR DATABASE:
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.16.12.11 33333 2023-10-12 15:21:30 GLOBAL VALID ERROR CJC01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.16.12.12 33333 2023-10-12 15:21:30 GLOBAL VALID ERROR CJC02 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
#================================================================================#
监控器信息
主库变为SUSPEND状态,因为监控器在备库服务器上。
2023-10-12 15:21:51: Dmwatcher process CJC01 status switching [OPEN-->STARTUP]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
15:21:51 STARTUP OK CJC01 SUSPEND PRIMARY VALID 11 50009 50016
2023-10-12 15:21:51: Dmwatcher process CJC01 status switching [STARTUP-->MON CONFIRM]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
15:21:51 MON CONFIRM OK CJC01 SUSPEND PRIMARY VALID 11 50009 50016
2023-10-12 15:21:52: [!!! Instance CJC02 dmwatcher's DW_MODE is configured as AUTO, but this dmmonitor is not in CONFIRM mode, cannot takeover instance CJC02 automatically !!!]
2023-10-12 15:21:52: Received message timeout from(CJC02)
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
15:21:30 ERROR OK CJC02 OPEN STANDBY VALID 11 50009 50009
show global info
2023-10-12 15:22:33
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 123456 FALSE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.16.12.11 33333 2023-10-12 15:22:33 GLOBAL VALID MON CONFIRM CJC01 OK 1 1 SUSPEND PRIMARY DSC_OPEN REALTIME VALID
ERROR DATABASE:
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.16.12.12 33333 2023-10-12 15:21:30 GLOBAL VALID ERROR CJC02 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
#================================================================================#
主库是SUSPEND 状态
SQL> select name,status$,mode$ from v$instance;
LINEID name status$ mode$
---------- ---- ------- -------
1 CJC01 SUSPEND PRIMARY
used time: 157.881(ms). Execute id is 600.
备库
[dmdba@cjc-db-04 ~]$ disql SYSDBA/***:port
SQL> select name,status$,mode$ from v$instance;
LINEID name status$ mode$
---------- ---- ------- -------
1 CJC02 OPEN STANDBY
used time: 4.023(ms). Execute id is 2000.
恢复备库心跳网卡
[ ]
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/11)
主、备库自动恢复,无需人为干预
[2023-10-12 15:26:20: Dmwatcher process CJC02 status switching [NONE-->OPEN] ]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-10-12 15:26:20 OPEN OK CJC02 OPEN STANDBY VALID 11 50009 50009
[2023-10-12 15:26:20: Dmwatcher process CJC01 status switching [NONE-->MON CONFIRM] ]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-10-12 15:26:20 MON CONFIRM OK CJC01 SUSPEND PRIMARY VALID 11 50009 50018
[2023-10-12 15:26:20: Dmwatcher process CJC01 status switching [MON CONFIRM-->FAILOVER] ]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-10-12 15:26:20 FAILOVER OK CJC01 SUSPEND PRIMARY VALID 11 50009 50018
[2023-10-12 15:26:23: Dmwatcher process CJC01 status switching [FAILOVER-->OPEN] ]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-10-12 15:26:22 OPEN OK CJC01 OPEN PRIMARY VALID 11 50018 50018
[2023-10-12 15:26:23: Dmwatcher process CJC01 status switching [OPEN-->RECOVERY] ]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-10-12 15:26:22 RECOVERY OK CJC01 OPEN PRIMARY VALID 11 50018 50018
[2023-10-12 15:26:27: Dmwatcher process CJC01 status switching [RECOVERY-->OPEN] ]
WTIME WSTATUS INST_OK INAME ISTATUS IMODE RSTAT N_OPEN FLSN CLSN
2023-10-12 15:26:27 OPEN OK CJC01 OPEN PRIMARY VALID 11 50019 50019
show global info
2023-10-12 15:26:38
#================================================================================#
GROUP OGUID MON_CONFIRM MODE MPP_FLAG
GRP1 123456 TRUE AUTO FALSE
<<DATABASE GLOBAL INFO:>>
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.16.12.11 33333 2023-10-12 15:26:37 GLOBAL VALID OPEN CJC01 OK 1 1 OPEN PRIMARY DSC_OPEN REALTIME VALID
DW_IP MAL_DW_PORT WTIME WTYPE WCTLSTAT WSTATUS INAME INST_OK N_EP N_OK ISTATUS IMODE DSC_STATUS RTYPE RSTAT
192.16.12.12 33333 2023-10-12 15:26:37 GLOBAL VALID OPEN CJC02 OK 1 1 OPEN STANDBY DSC_OPEN REALTIME VALID
#================================================================================#
参考:
https://eco.dameng.com/document/dm/zh-cn/pm/data-watch-overview.html
https://eco.dameng.com/document/dm/zh-cn/pm/data-watch-overview.html
###chenjuchao 20231213###
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!